diff --git a/.changeset/bump-patch-1699738736996.md b/.changeset/bump-patch-1699738736996.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1699738736996.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1699940713809.md b/.changeset/bump-patch-1699940713809.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1699940713809.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1699991612617.md b/.changeset/bump-patch-1699991612617.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1699991612617.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1699998565522.md b/.changeset/bump-patch-1699998565522.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1699998565522.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1700263798234.md b/.changeset/bump-patch-1700263798234.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1700263798234.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/cool-timers-fix.md b/.changeset/cool-timers-fix.md new file mode 100644 index 000000000000..27e06d923134 --- /dev/null +++ b/.changeset/cool-timers-fix.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed issue with read receipts for older messages not being created on the first time a user reads a DM diff --git a/.changeset/giant-dancers-relate.md b/.changeset/giant-dancers-relate.md new file mode 100644 index 000000000000..d58385c5da7a --- /dev/null +++ b/.changeset/giant-dancers-relate.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an `UnhandledPromiseRejection` error on `PUT livechat/departments/:_id` endpoint when `agents` array failed validation diff --git a/.changeset/great-kings-tickle.md b/.changeset/great-kings-tickle.md new file mode 100644 index 000000000000..73e792673f08 --- /dev/null +++ b/.changeset/great-kings-tickle.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Off the record feature was calling a deprecated and useless method. diff --git a/.changeset/honest-socks-sniff.md b/.changeset/honest-socks-sniff.md new file mode 100644 index 000000000000..efdaea336774 --- /dev/null +++ b/.changeset/honest-socks-sniff.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Google Maps and Katex config settings were not visible diff --git a/.changeset/loud-foxes-grin.md b/.changeset/loud-foxes-grin.md new file mode 100644 index 000000000000..3fa989aa0dd2 --- /dev/null +++ b/.changeset/loud-foxes-grin.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Visitor message not being sent to webhook due to wrong validation of settings diff --git a/.changeset/ninety-files-sing.md b/.changeset/ninety-files-sing.md new file mode 100644 index 000000000000..b5cf45ea81d8 --- /dev/null +++ b/.changeset/ninety-files-sing.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +regression: changed UniqueID modal being displayed wrongly during startup diff --git a/.changeset/old-buckets-camp.md b/.changeset/old-buckets-camp.md new file mode 100644 index 000000000000..e91a59816445 --- /dev/null +++ b/.changeset/old-buckets-camp.md @@ -0,0 +1,7 @@ +--- +"@rocket.chat/meteor": patch +--- + +Add the date and time to the email sent when a new device logs in + + diff --git a/.changeset/pre.json b/.changeset/pre.json index 03da0a129052..23292ba7856a 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -62,6 +62,11 @@ "brown-donuts-drive", "bump-patch-1699478965737", "bump-patch-1699591347357", + "bump-patch-1699738736996", + "bump-patch-1699940713809", + "bump-patch-1699991612617", + "bump-patch-1699998565522", + "bump-patch-1700263798234", "cool-rockets-talk", "cool-zoos-move", "cuddly-ties-run", @@ -74,6 +79,7 @@ "gentle-radios-relate", "heavy-ads-carry", "hip-pans-argue", + "honest-socks-sniff", "khaki-feet-dance", "kind-books-love", "large-pandas-beam", @@ -83,7 +89,9 @@ "lucky-vans-develop", "nice-chairs-add", "ninety-carrots-flow", + "ninety-files-sing", "odd-hounds-thank", + "old-buckets-camp", "old-zoos-hang", "perfect-onions-develop", "perfect-pianos-yawn", @@ -93,7 +101,9 @@ "quiet-phones-reply", "rich-dogs-smell", "rotten-dryers-allow", + "rotten-pears-watch", "selfish-hounds-pay", + "selfish-panthers-stare", "serious-cats-fetch", "seven-carpets-march", "seven-emus-pay", @@ -107,6 +117,7 @@ "sweet-chefs-exist", "sweet-feet-relate", "tall-moons-beam", + "thick-ads-run", "thick-spoons-compete", "thirty-jokes-compete", "thirty-pumpkins-fix", @@ -119,6 +130,7 @@ "twenty-colts-hope", "warm-melons-type", "weak-cameras-pay", + "weak-elephants-kneel", "wicked-humans-hang", "wicked-jars-double", "workspace-status-admin-page" diff --git a/.changeset/rotten-pears-watch.md b/.changeset/rotten-pears-watch.md new file mode 100644 index 000000000000..9cd76a9ff8a4 --- /dev/null +++ b/.changeset/rotten-pears-watch.md @@ -0,0 +1,8 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: wrong client hash calculation due to race condition on assets + +Some deployments may suffer from some reloads if running multiple instances. It's caused by different client hashes generated due to a possible race condition on custom assets load at the startup time. Forcing the clients to talk to the right backend instances, which causes reloads if sticky sessions are not enabled. +This change removes the assets from the hash calculation preventing the race condition and possible different hashes. After this change, the clients will not reload when the admin changes assets. diff --git a/.changeset/selfish-panthers-stare.md b/.changeset/selfish-panthers-stare.md new file mode 100644 index 000000000000..cfc7c1ba891f --- /dev/null +++ b/.changeset/selfish-panthers-stare.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed Canned responses stream not working, causing users to refresh to see newly created responses. diff --git a/.changeset/silver-mice-allow.md b/.changeset/silver-mice-allow.md new file mode 100644 index 000000000000..0be0670a11f8 --- /dev/null +++ b/.changeset/silver-mice-allow.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: mention channel redirecting to own DM diff --git a/.changeset/spicy-kiwis-argue.md b/.changeset/spicy-kiwis-argue.md new file mode 100644 index 000000000000..520fdfe22015 --- /dev/null +++ b/.changeset/spicy-kiwis-argue.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fix desktop notification routing for direct rooms diff --git a/.changeset/weak-elephants-kneel.md b/.changeset/weak-elephants-kneel.md new file mode 100644 index 000000000000..f97820f9269e --- /dev/null +++ b/.changeset/weak-elephants-kneel.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: `TypeError`: Cannot use 'in' operator in `undefined` for every message sent diff --git a/.husky/pre-push b/.husky/pre-push deleted file mode 100755 index 7e116981132d..000000000000 --- a/.husky/pre-push +++ /dev/null @@ -1,4 +0,0 @@ -[ "$HUSKY" = "0" ] && echo "skipping push hook" && exit 0 - -yarn lint && \ -yarn testunit diff --git a/apps/meteor/.docker/Dockerfile.alpine b/apps/meteor/.docker/Dockerfile.alpine index 003baa57aa8b..94baef809217 100644 --- a/apps/meteor/.docker/Dockerfile.alpine +++ b/apps/meteor/.docker/Dockerfile.alpine @@ -12,7 +12,7 @@ RUN set -x \ && npm install --production \ # Start hack for sharp... && rm -rf npm/node_modules/sharp \ - && npm install sharp@0.30.4 \ + && npm install sharp@0.32.6 \ && mv node_modules/sharp npm/node_modules/sharp \ # End hack for sharp # Start hack for isolated-vm... diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md index 214add942d96..d676b3b742ef 100644 --- a/apps/meteor/CHANGELOG.md +++ b/apps/meteor/CHANGELOG.md @@ -1,5 +1,153 @@ # @rocket.chat/meteor +## 6.5.0-rc.7 + +### Patch Changes + +- Bump @rocket.chat/meteor version. +- 88833b24e9: fix: Google Maps and Katex config settings were not visible +- 150a580851: regression: changed UniqueID modal being displayed wrongly during startup +- 7ed7cb41ce: Add the date and time to the email sent when a new device logs in + - @rocket.chat/core-typings@6.5.0-rc.7 + - @rocket.chat/rest-typings@6.5.0-rc.7 + - @rocket.chat/api-client@0.1.15-rc.7 + - @rocket.chat/license@0.1.0-rc.7 + - @rocket.chat/omnichannel-services@0.1.0-rc.7 + - @rocket.chat/pdf-worker@0.0.21-rc.7 + - @rocket.chat/presence@0.1.0-rc.7 + - @rocket.chat/core-services@0.3.0-rc.7 + - @rocket.chat/cron@0.0.17-rc.7 + - @rocket.chat/gazzodown@3.0.0-rc.7 + - @rocket.chat/model-typings@0.2.0-rc.7 + - @rocket.chat/ui-contexts@3.0.0-rc.7 + - @rocket.chat/server-cloud-communication@0.0.1 + - @rocket.chat/fuselage-ui-kit@3.0.0-rc.7 + - @rocket.chat/models@0.0.21-rc.7 + - @rocket.chat/ui-theming@0.1.1-rc.0 + - @rocket.chat/ui-client@3.0.0-rc.7 + - @rocket.chat/ui-video-conf@3.0.0-rc.7 + - @rocket.chat/web-ui-registration@3.0.0-rc.6 + - @rocket.chat/instance-status@0.0.21-rc.7 + +## 6.5.0-rc.6 + +### Patch Changes + +- Bump @rocket.chat/meteor version. +- aaf11e92dc: Fixed Canned responses stream not working, causing users to refresh to see newly created responses. + - @rocket.chat/core-typings@6.5.0-rc.6 + - @rocket.chat/rest-typings@6.5.0-rc.6 + - @rocket.chat/api-client@0.1.15-rc.6 + - @rocket.chat/license@0.1.0-rc.6 + - @rocket.chat/omnichannel-services@0.1.0-rc.6 + - @rocket.chat/pdf-worker@0.0.21-rc.6 + - @rocket.chat/presence@0.1.0-rc.6 + - @rocket.chat/core-services@0.3.0-rc.6 + - @rocket.chat/cron@0.0.17-rc.6 + - @rocket.chat/gazzodown@3.0.0-rc.6 + - @rocket.chat/model-typings@0.2.0-rc.6 + - @rocket.chat/ui-contexts@3.0.0-rc.6 + - @rocket.chat/server-cloud-communication@0.0.1 + - @rocket.chat/fuselage-ui-kit@3.0.0-rc.6 + - @rocket.chat/models@0.0.21-rc.6 + - @rocket.chat/ui-theming@0.1.1-rc.0 + - @rocket.chat/ui-client@3.0.0-rc.6 + - @rocket.chat/ui-video-conf@3.0.0-rc.6 + - @rocket.chat/web-ui-registration@3.0.0-rc.5 + - @rocket.chat/instance-status@0.0.21-rc.6 + +## 6.5.0-rc.5 + +### Patch Changes + +- Bump @rocket.chat/meteor version. +- 3ce070a3de: fix: wrong client hash calculation due to race condition on assets + + Some deployments may suffer from some reloads if running multiple instances. It's caused by different client hashes generated due to a possible race condition on custom assets load at the startup time. Forcing the clients to talk to the right backend instances, which causes reloads if sticky sessions are not enabled. + This change removes the assets from the hash calculation preventing the race condition and possible different hashes. After this change, the clients will not reload when the admin changes assets. + +- 26b8c8124c: fix: `TypeError`: Cannot use 'in' operator in `undefined` for every message sent + - @rocket.chat/core-typings@6.5.0-rc.5 + - @rocket.chat/rest-typings@6.5.0-rc.5 + - @rocket.chat/api-client@0.1.15-rc.5 + - @rocket.chat/license@0.1.0-rc.5 + - @rocket.chat/omnichannel-services@0.1.0-rc.5 + - @rocket.chat/pdf-worker@0.0.21-rc.5 + - @rocket.chat/presence@0.1.0-rc.5 + - @rocket.chat/core-services@0.3.0-rc.5 + - @rocket.chat/cron@0.0.17-rc.5 + - @rocket.chat/gazzodown@3.0.0-rc.5 + - @rocket.chat/model-typings@0.2.0-rc.5 + - @rocket.chat/ui-contexts@3.0.0-rc.5 + - @rocket.chat/server-cloud-communication@0.0.1 + - @rocket.chat/fuselage-ui-kit@3.0.0-rc.5 + - @rocket.chat/models@0.0.21-rc.5 + - @rocket.chat/ui-theming@0.1.1-rc.0 + - @rocket.chat/ui-client@3.0.0-rc.5 + - @rocket.chat/ui-video-conf@3.0.0-rc.5 + - @rocket.chat/web-ui-registration@3.0.0-rc.4 + - @rocket.chat/instance-status@0.0.21-rc.5 + +## 6.5.0-rc.4 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + - @rocket.chat/core-typings@6.5.0-rc.4 + - @rocket.chat/rest-typings@6.5.0-rc.4 + - @rocket.chat/api-client@0.1.15-rc.4 + - @rocket.chat/license@0.1.0-rc.4 + - @rocket.chat/omnichannel-services@0.1.0-rc.4 + - @rocket.chat/pdf-worker@0.0.21-rc.4 + - @rocket.chat/presence@0.1.0-rc.4 + - @rocket.chat/core-services@0.3.0-rc.4 + - @rocket.chat/cron@0.0.17-rc.4 + - @rocket.chat/gazzodown@3.0.0-rc.4 + - @rocket.chat/model-typings@0.2.0-rc.4 + - @rocket.chat/ui-contexts@3.0.0-rc.4 + - @rocket.chat/server-cloud-communication@0.0.1 + - @rocket.chat/fuselage-ui-kit@3.0.0-rc.4 + - @rocket.chat/models@0.0.21-rc.4 + - @rocket.chat/ui-theming@0.1.1-rc.0 + - @rocket.chat/ui-client@3.0.0-rc.4 + - @rocket.chat/ui-video-conf@3.0.0-rc.4 + - @rocket.chat/web-ui-registration@3.0.0-rc.3 + - @rocket.chat/instance-status@0.0.21-rc.4 + +## 6.5.0-rc.3 + +### Patch Changes + +- Bump @rocket.chat/meteor version. +- 8668485fda: fix: immediate auto reload issues + + Immediate auto reload increases server load on restarts/upgrades and increases the chance of getting 404 on Meteor's config file blocking the UI on a loading screen + + This change adds delays on front and backend codes on automatic client reload: + + - Front-end, adds a warning message including the old and new hashes, and a delay of 60 seconds after being notified by the server + - Back-end, delays the client notifications on a random value between 2 and 10 minutes per connection, allowing different clients to reload at different moments and distributing the load along the time. + - @rocket.chat/core-typings@6.5.0-rc.3 + - @rocket.chat/rest-typings@6.5.0-rc.3 + - @rocket.chat/api-client@0.1.15-rc.3 + - @rocket.chat/license@0.1.0-rc.3 + - @rocket.chat/omnichannel-services@0.1.0-rc.3 + - @rocket.chat/pdf-worker@0.0.21-rc.3 + - @rocket.chat/presence@0.1.0-rc.3 + - @rocket.chat/core-services@0.3.0-rc.3 + - @rocket.chat/cron@0.0.17-rc.3 + - @rocket.chat/gazzodown@3.0.0-rc.3 + - @rocket.chat/model-typings@0.2.0-rc.3 + - @rocket.chat/ui-contexts@3.0.0-rc.3 + - @rocket.chat/server-cloud-communication@0.0.1 + - @rocket.chat/fuselage-ui-kit@3.0.0-rc.3 + - @rocket.chat/models@0.0.21-rc.3 + - @rocket.chat/ui-theming@0.1.1-rc.0 + - @rocket.chat/ui-client@3.0.0-rc.3 + - @rocket.chat/ui-video-conf@3.0.0-rc.3 + - @rocket.chat/instance-status@0.0.21-rc.3 + - @rocket.chat/web-ui-registration@3.0.0-rc.2 + ## 6.5.0-rc.2 ### Patch Changes @@ -174,6 +322,98 @@ - @rocket.chat/server-cloud-communication@0.0.1 - @rocket.chat/instance-status@0.0.21-rc.0 +## 6.4.8 + +### Patch Changes + +- 550900bb2b: Bump @rocket.chat/meteor version. +- Bump @rocket.chat/meteor version. + - @rocket.chat/core-typings@6.4.8 + - @rocket.chat/rest-typings@6.4.8 + - @rocket.chat/api-client@0.1.17 + - @rocket.chat/omnichannel-services@0.0.23 + - @rocket.chat/pdf-worker@0.0.23 + - @rocket.chat/presence@0.0.23 + - @rocket.chat/core-services@0.2.8 + - @rocket.chat/cron@0.0.19 + - @rocket.chat/gazzodown@2.0.8 + - @rocket.chat/model-typings@0.1.8 + - @rocket.chat/ui-contexts@2.0.8 + - @rocket.chat/fuselage-ui-kit@2.0.8 + - @rocket.chat/models@0.0.23 + - @rocket.chat/ui-theming@0.1.0 + - @rocket.chat/ui-client@2.0.8 + - @rocket.chat/ui-video-conf@2.0.8 + - @rocket.chat/web-ui-registration@2.0.8 + - @rocket.chat/instance-status@0.0.23 + +## 6.4.7 + +### Patch Changes + +- 037efa4f4f: Bump @rocket.chat/meteor version. +- Bump @rocket.chat/meteor version. +- b98492e3ee: Add additional checks to the OAuth tokens to prevent future issues + - @rocket.chat/core-typings@6.4.7 + - @rocket.chat/rest-typings@6.4.7 + - @rocket.chat/api-client@0.1.16 + - @rocket.chat/omnichannel-services@0.0.22 + - @rocket.chat/pdf-worker@0.0.22 + - @rocket.chat/presence@0.0.22 + - @rocket.chat/core-services@0.2.7 + - @rocket.chat/cron@0.0.18 + - @rocket.chat/gazzodown@2.0.7 + - @rocket.chat/model-typings@0.1.7 + - @rocket.chat/ui-contexts@2.0.7 + - @rocket.chat/fuselage-ui-kit@2.0.7 + - @rocket.chat/models@0.0.22 + - @rocket.chat/ui-theming@0.1.0 + - @rocket.chat/ui-client@2.0.7 + - @rocket.chat/ui-video-conf@2.0.7 + - @rocket.chat/web-ui-registration@2.0.7 + - @rocket.chat/instance-status@0.0.22 + +## 6.4.6 + +### Patch Changes + +- 35ea15005a: Bump @rocket.chat/meteor version. +- Bump @rocket.chat/meteor version. +- 57deb49ceb: fix: OAuth login by redirect failing on firefox +- 00875fc9ab: fix: wrong client hash calculation due to race condition on assets + + Some deployments may suffer from some reloads if running multiple instances. It's caused by different client hashes generated due to a possible race condition on custom assets load at the startup time. Forcing the clients to talk to the right backend instances, which causes reloads if sticky sessions are not enabled. + This change removes the assets from the hash calculation preventing the race condition and possible different hashes. After this change, the clients will not reload when the admin changes assets. + +- b7ea8651bf: fix: immediate auto reload issues + + Immediate auto reload increases server load on restarts/upgrades and increases the chance of getting 404 on Meteor's config file blocking the UI on a loading screen + + This change adds delays on front and backend codes on automatic client reload: + + - Front-end, adds a warning message including the old and new hashes, and a delay of 60 seconds after being notified by the server + - Back-end, delays the client notifications on a random value between 2 and 10 minutes per connection, allowing different clients to reload at different moments and distributing the load along the time. + +- 873eea9d54: fix: `TypeError`: Cannot use 'in' operator in `undefined` for every message sent + - @rocket.chat/core-typings@6.4.6 + - @rocket.chat/rest-typings@6.4.6 + - @rocket.chat/api-client@0.1.15 + - @rocket.chat/omnichannel-services@0.0.21 + - @rocket.chat/pdf-worker@0.0.21 + - @rocket.chat/presence@0.0.21 + - @rocket.chat/core-services@0.2.6 + - @rocket.chat/cron@0.0.17 + - @rocket.chat/gazzodown@2.0.6 + - @rocket.chat/model-typings@0.1.6 + - @rocket.chat/ui-contexts@2.0.6 + - @rocket.chat/fuselage-ui-kit@2.0.6 + - @rocket.chat/models@0.0.21 + - @rocket.chat/ui-theming@0.1.0 + - @rocket.chat/ui-client@2.0.6 + - @rocket.chat/ui-video-conf@2.0.6 + - @rocket.chat/web-ui-registration@2.0.6 + - @rocket.chat/instance-status@0.0.21 + ## 6.4.5 ### Patch Changes diff --git a/apps/meteor/app/assets/server/assets.ts b/apps/meteor/app/assets/server/assets.ts index 726d16ac34bf..529526ba6750 100644 --- a/apps/meteor/app/assets/server/assets.ts +++ b/apps/meteor/app/assets/server/assets.ts @@ -1,16 +1,14 @@ import crypto from 'crypto'; import type { ServerResponse, IncomingMessage } from 'http'; -import type { IRocketChatAssets, IRocketChatAsset, IRocketChatAssetCache } from '@rocket.chat/core-typings'; +import type { IRocketChatAssets, IRocketChatAsset } from '@rocket.chat/core-typings'; import { Settings } from '@rocket.chat/models'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; import type { NextHandleFunction } from 'connect'; import sizeOf from 'image-size'; import { Meteor } from 'meteor/meteor'; import { WebApp, WebAppInternals } from 'meteor/webapp'; -import { WebAppHashing } from 'meteor/webapp-hashing'; import sharp from 'sharp'; -import _ from 'underscore'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { RocketChatFile } from '../../file/server'; @@ -371,55 +369,6 @@ Meteor.startup(() => { }, 200); }); -const { calculateClientHash } = WebAppHashing; - -WebAppHashing.calculateClientHash = function (manifest, includeFilter, runtimeConfigOverride): string { - for (const key of Object.keys(assets)) { - const value = getAssetByKey(key); - if (!value.cache && !value.defaultUrl) { - continue; - } - - let cache: IRocketChatAssetCache; - if (value.cache) { - cache = { - path: value.cache.path, - cacheable: value.cache.cacheable, - sourceMapUrl: value.cache.sourceMapUrl, - where: value.cache.where, - type: value.cache.type, - url: value.cache.url, - size: value.cache.size, - hash: value.cache.hash, - }; - } else { - const extension = value.defaultUrl?.split('.').pop(); - cache = { - path: `assets/${key}.${extension}`, - cacheable: false, - sourceMapUrl: undefined, - where: 'client', - type: 'asset', - url: `/assets/${key}.${extension}?v3`, - hash: 'v3', - }; - } - - const manifestItem = _.findWhere(manifest, { - path: key, - }); - - if (manifestItem) { - const index = manifest.indexOf(manifestItem); - manifest[index] = cache; - } else { - manifest.push(cache); - } - } - - return calculateClientHash.call(this, manifest, includeFilter, runtimeConfigOverride); -}; - declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { diff --git a/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts b/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts index ea94db8d17a1..cc08b42b4556 100644 --- a/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts +++ b/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts @@ -1,4 +1,5 @@ -import { Statistics, Users } from '@rocket.chat/models'; +import { LivechatRooms, Statistics, Users } from '@rocket.chat/models'; +import moment from 'moment'; import { settings } from '../../../settings/server'; import { statistics } from '../../../statistics/server'; @@ -61,6 +62,7 @@ export async function buildWorkspaceRegistrationData { try { - const token = await getWorkspaceAccessTokenOrThrow(false, 'workspace:billing'); + const token = await getWorkspaceAccessTokenOrThrow(true, 'workspace:billing', false); const subscriptionURL = getURL('admin/subscription', { full: true, diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.ts b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.ts index b495e3342d4b..d5b92c97ef7d 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.ts +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.ts @@ -10,7 +10,7 @@ import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; * @param {boolean} save * @returns string */ -export async function getWorkspaceAccessToken(forceNew = false, scope = '', save = true): Promise { +export async function getWorkspaceAccessToken(forceNew = false, scope = '', save = true, throwOnError = false): Promise { const { workspaceRegistered } = await retrieveRegistrationStatus(); if (!workspaceRegistered) { @@ -29,7 +29,7 @@ export async function getWorkspaceAccessToken(forceNew = false, scope = '', save return settings.get('Cloud_Workspace_Access_Token'); } - const accessToken = await getWorkspaceAccessTokenWithScope(scope); + const accessToken = await getWorkspaceAccessTokenWithScope(scope, throwOnError); if (save) { await Promise.all([ @@ -37,7 +37,6 @@ export async function getWorkspaceAccessToken(forceNew = false, scope = '', save Settings.updateValueById('Cloud_Workspace_Access_Token_Expires_At', accessToken.expiresAt), ]); } - return accessToken.token; } @@ -47,11 +46,17 @@ export class CloudWorkspaceAccessTokenError extends Error { } } +export class CloudWorkspaceAccessTokenEmptyError extends Error { + constructor() { + super('Workspace access token is empty'); + } +} + export async function getWorkspaceAccessTokenOrThrow(forceNew = false, scope = '', save = true): Promise { - const token = await getWorkspaceAccessToken(forceNew, scope, save); + const token = await getWorkspaceAccessToken(forceNew, scope, save, true); if (!token) { - throw new CloudWorkspaceAccessTokenError(); + throw new CloudWorkspaceAccessTokenEmptyError(); } return token; diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.ts b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.ts index 88509902cb6d..bb32476fd3dc 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.ts +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.ts @@ -4,10 +4,11 @@ import { SystemLogger } from '../../../../server/lib/logger/system'; import { settings } from '../../../settings/server'; import { workspaceScopes } from '../oauthScopes'; import { getRedirectUri } from './getRedirectUri'; +import { CloudWorkspaceAccessTokenError } from './getWorkspaceAccessToken'; import { removeWorkspaceRegistrationInfo } from './removeWorkspaceRegistrationInfo'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -export async function getWorkspaceAccessTokenWithScope(scope = '') { +export async function getWorkspaceAccessTokenWithScope(scope = '', throwOnError = false) { const { workspaceRegistered } = await retrieveRegistrationStatus(); const tokenResponse = { token: '', expiresAt: new Date() }; @@ -58,6 +59,9 @@ export async function getWorkspaceAccessTokenWithScope(scope = '') { if (err.response?.data?.error === 'oauth_invalid_client_credentials') { SystemLogger.error('Server has been unregistered from cloud'); void removeWorkspaceRegistrationInfo(); + if (throwOnError) { + throw new CloudWorkspaceAccessTokenError(); + } } return tokenResponse; diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.ts b/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.ts index f9f0cfadc669..ca97e2a6fcdd 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.ts +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.ts @@ -49,36 +49,25 @@ const fetchCloudWorkspaceLicensePayload = async ({ token }: { token: string }): return payload; }; -export async function getWorkspaceLicense(): Promise<{ updated: boolean; license: string }> { +export async function getWorkspaceLicense() { const currentLicense = await Settings.findOne('Cloud_Workspace_License'); // it should never happen, since even if the license is not found, it will return an empty settings if (!currentLicense?._updatedAt) { throw new CloudWorkspaceLicenseError('Failed to retrieve current license'); } - const fromCurrentLicense = async () => { - const license = currentLicense?.value as string | undefined; - if (license) { - await callbacks.run('workspaceLicenseChanged', license); - } - - return { updated: false, license: license ?? '' }; - }; - try { const token = await getWorkspaceAccessToken(); if (!token) { - return fromCurrentLicense(); + return; } const payload = await fetchCloudWorkspaceLicensePayload({ token }); if (currentLicense.value && Date.parse(payload.updatedAt) <= currentLicense._updatedAt.getTime()) { - return fromCurrentLicense(); + return; } - await Settings.updateValueById('Cloud_Workspace_License', payload.license); - await callbacks.run('workspaceLicenseChanged', payload.license); return { updated: true, license: payload.license }; @@ -88,7 +77,5 @@ export async function getWorkspaceLicense(): Promise<{ updated: boolean; license url: '/license', err, }); - - return fromCurrentLicense(); } } diff --git a/apps/meteor/app/cloud/server/functions/removeWorkspaceRegistrationInfo.ts b/apps/meteor/app/cloud/server/functions/removeWorkspaceRegistrationInfo.ts index 5884a282482b..ec26e0bb9b27 100644 --- a/apps/meteor/app/cloud/server/functions/removeWorkspaceRegistrationInfo.ts +++ b/apps/meteor/app/cloud/server/functions/removeWorkspaceRegistrationInfo.ts @@ -18,5 +18,6 @@ export async function removeWorkspaceRegistrationInfo() { Settings.updateValueById('Cloud_Workspace_Registration_Client_Uri', null), ]); + await Settings.updateValueById('Show_Setup_Wizard', 'in_progress'); return true; } diff --git a/apps/meteor/app/cloud/server/functions/saveRegistrationData.ts b/apps/meteor/app/cloud/server/functions/saveRegistrationData.ts index 8e1e03113af4..9faa52c787b5 100644 --- a/apps/meteor/app/cloud/server/functions/saveRegistrationData.ts +++ b/apps/meteor/app/cloud/server/functions/saveRegistrationData.ts @@ -1,6 +1,7 @@ import { Settings } from '@rocket.chat/models'; -import { callbacks } from '../../../../lib/callbacks'; +import { settings } from '../../../settings/server'; +import { syncCloudData } from './syncWorkspace/syncCloudData'; export function saveRegistrationData({ workspaceId, @@ -10,7 +11,6 @@ export function saveRegistrationData({ client_secret_expires_at, publicKey, registration_client_uri, - licenseData, }: { workspaceId: string; client_name: string; @@ -19,9 +19,6 @@ export function saveRegistrationData({ client_secret_expires_at: number; publicKey: string; registration_client_uri: string; - licenseData: { - license: string; - }; }) { return Promise.all([ Settings.updateValueById('Register_Server', true), @@ -32,9 +29,29 @@ export function saveRegistrationData({ Settings.updateValueById('Cloud_Workspace_Client_Secret_Expires_At', client_secret_expires_at), Settings.updateValueById('Cloud_Workspace_PublicKey', publicKey), Settings.updateValueById('Cloud_Workspace_Registration_Client_Uri', registration_client_uri), - Settings.updateValueById('Cloud_Workspace_License', licenseData.license || ''), ]).then(async (...results) => { - await callbacks.run('workspaceLicenseChanged', licenseData.license); + // wait until all the settings are updated before syncing the data + for await (const retry of Array.from({ length: 10 })) { + if ( + settings.get('Register_Server') === true && + settings.get('Cloud_Workspace_Id') === workspaceId && + settings.get('Cloud_Workspace_Name') === client_name && + settings.get('Cloud_Workspace_Client_Id') === client_id && + settings.get('Cloud_Workspace_Client_Secret') === client_secret && + settings.get('Cloud_Workspace_Client_Secret_Expires_At') === client_secret_expires_at && + settings.get('Cloud_Workspace_PublicKey') === publicKey && + settings.get('Cloud_Workspace_Registration_Client_Uri') === registration_client_uri + ) { + break; + } + + if (retry === 9) { + throw new Error('Failed to save registration data'); + } + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + + await syncCloudData(); return results; }); } diff --git a/apps/meteor/app/cloud/server/functions/syncWorkspace/syncCloudData.ts b/apps/meteor/app/cloud/server/functions/syncWorkspace/syncCloudData.ts index 5f529a4892ec..63dc37dd9901 100644 --- a/apps/meteor/app/cloud/server/functions/syncWorkspace/syncCloudData.ts +++ b/apps/meteor/app/cloud/server/functions/syncWorkspace/syncCloudData.ts @@ -1,4 +1,5 @@ import type { Cloud, Serialized } from '@rocket.chat/core-typings'; +import { DuplicatedLicenseError } from '@rocket.chat/license'; import { serverFetch as fetch } from '@rocket.chat/server-fetch'; import { v, compile } from 'suretype'; @@ -74,8 +75,30 @@ export async function syncCloudData() { await callbacks.run('workspaceLicenseChanged', license); + SystemLogger.info({ + msg: 'Synced with Rocket.Chat Cloud', + function: 'syncCloudData', + }); + return true; } catch (err) { + /** + * If some of CloudWorkspaceAccessError and CloudWorkspaceRegistrationError happens, makes no sense to run the legacySyncWorkspace + * because it will fail too. + * The DuplicatedLicenseError license error is also ignored because it is not a problem. the Cloud is allowed to send the same license twice. + */ + switch (true) { + case err instanceof CloudWorkspaceAccessError: + case err instanceof CloudWorkspaceRegistrationError: + case err instanceof DuplicatedLicenseError: + SystemLogger.info({ + msg: 'Failed to sync with Rocket.Chat Cloud', + function: 'syncCloudData', + err, + }); + return; + } + SystemLogger.error({ msg: 'Failed to sync with Rocket.Chat Cloud', url: '/sync', @@ -83,5 +106,10 @@ export async function syncCloudData() { }); } + SystemLogger.info({ + msg: 'Falling back to legacy sync', + function: 'syncCloudData', + }); + await legacySyncWorkspace(); } diff --git a/apps/meteor/app/cloud/server/methods.ts b/apps/meteor/app/cloud/server/methods.ts index 1d328d0c213e..edb3a078ac14 100644 --- a/apps/meteor/app/cloud/server/methods.ts +++ b/apps/meteor/app/cloud/server/methods.ts @@ -29,7 +29,6 @@ declare module '@rocket.chat/ui-contexts' { 'cloud:syncWorkspace': () => boolean; 'cloud:connectWorkspace': (token: string) => boolean | Error; 'cloud:reconnectWorkspace': () => boolean; - 'cloud:disconnectWorkspace': () => boolean; 'cloud:getOAuthAuthorizationUrl': () => string; 'cloud:finishOAuthAuthorization': (code: string, state: string) => boolean; 'cloud:checkUserLoggedIn': () => boolean; diff --git a/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts b/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts index b6054b6dcccf..e366216ed7f9 100644 --- a/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts +++ b/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts @@ -1,8 +1,23 @@ +import { api } from '@rocket.chat/core-services'; +import type { IRoom } from '@rocket.chat/core-typings'; import { Messages, Rooms } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; +import { broadcastMessageSentEvent } from '../../../../server/modules/watchers/lib/messages'; import { deleteRoom } from '../../../lib/server/functions/deleteRoom'; +const updateAndNotifyParentRoomWithParentMessage = async (room: IRoom): Promise => { + const { value: parentMessage } = await Messages.refreshDiscussionMetadata(room); + if (!parentMessage) { + return; + } + void broadcastMessageSentEvent({ + id: parentMessage._id, + data: parentMessage, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); +}; + /** * We need to propagate the writing of new message in a discussion to the linking * system message @@ -25,7 +40,7 @@ callbacks.add( return message; } - await Messages.refreshDiscussionMetadata(room); + await updateAndNotifyParentRoomWithParentMessage(room); return message; }, @@ -45,7 +60,7 @@ callbacks.add( }); if (room) { - await Messages.refreshDiscussionMetadata(room); + await updateAndNotifyParentRoomWithParentMessage(room); } } if (message.drid) { diff --git a/apps/meteor/app/discussion/server/methods/createDiscussion.ts b/apps/meteor/app/discussion/server/methods/createDiscussion.ts index c3869f8ff963..b39ef64255e8 100644 --- a/apps/meteor/app/discussion/server/methods/createDiscussion.ts +++ b/apps/meteor/app/discussion/server/methods/createDiscussion.ts @@ -186,13 +186,13 @@ const create = async ({ discussionMsg = await createDiscussionMessage(prid, user, discussion._id, discussionName); } - if (discussionMsg) { - callbacks.runAsync('afterSaveMessage', discussionMsg, parentRoom); - } - if (reply) { await sendMessage(user, { msg: reply }, discussion); } + + if (discussionMsg) { + callbacks.runAsync('afterSaveMessage', discussionMsg, parentRoom); + } return discussion; }; diff --git a/apps/meteor/app/lib/server/functions/createDirectRoom.ts b/apps/meteor/app/lib/server/functions/createDirectRoom.ts index 92db702dd4ec..d76fd4b34507 100644 --- a/apps/meteor/app/lib/server/functions/createDirectRoom.ts +++ b/apps/meteor/app/lib/server/functions/createDirectRoom.ts @@ -19,6 +19,7 @@ const generateSubscription = ( extra: MatchKeysAndValues, ): MatchKeysAndValues => ({ _id: Random.id(), + ts: new Date(), alert: false, unread: 0, userMentions: 0, diff --git a/apps/meteor/app/lib/server/functions/deleteMessage.ts b/apps/meteor/app/lib/server/functions/deleteMessage.ts index 6fddbd719fa9..c197f93518ce 100644 --- a/apps/meteor/app/lib/server/functions/deleteMessage.ts +++ b/apps/meteor/app/lib/server/functions/deleteMessage.ts @@ -5,6 +5,7 @@ import { Meteor } from 'meteor/meteor'; import { Apps } from '../../../../ee/server/apps'; import { callbacks } from '../../../../lib/callbacks'; +import { broadcastMessageSentEvent } from '../../../../server/modules/watchers/lib/messages'; import { canDeleteMessageAsync } from '../../../authorization/server/functions/canDeleteMessage'; import { FileUpload } from '../../../file-upload/server'; import { settings } from '../../../settings/server'; @@ -68,7 +69,6 @@ export async function deleteMessage(message: IMessage, user: IUser): Promise>); @@ -86,11 +86,18 @@ export async function deleteMessage(message: IMessage, user: IUser): Promise api.broadcast('message.sent', message), + }); + } + if (bridges) { void bridges.getListenerBridge().messageEvent('IPostMessageDeleted', deletedMsg, user); } diff --git a/apps/meteor/app/lib/server/functions/deleteUser.ts b/apps/meteor/app/lib/server/functions/deleteUser.ts index 21ae3fecf81c..d63593af1486 100644 --- a/apps/meteor/app/lib/server/functions/deleteUser.ts +++ b/apps/meteor/app/lib/server/functions/deleteUser.ts @@ -41,9 +41,11 @@ export async function deleteUser(userId: string, confirmRelinquish = false, dele // Users without username can't do anything, so there is nothing to remove if (user.username != null) { + let userToReplaceWhenUnlinking: IUser | null = null; + const nameAlias = i18n.t('Removed_User'); await relinquishRoomOwnerships(userId, subscribedRooms); - const messageErasureType = settings.get('Message_ErasureType'); + const messageErasureType = settings.get<'Delete' | 'Unlink' | 'Keep'>('Message_ErasureType'); switch (messageErasureType) { case 'Delete': const store = FileUpload.getStore('Uploads'); @@ -68,12 +70,11 @@ export async function deleteUser(userId: string, confirmRelinquish = false, dele break; case 'Unlink': - const rocketCat = await Users.findOneById('rocket.cat'); - const nameAlias = i18n.t('Removed_User'); - if (!rocketCat?._id || !rocketCat?.username) { + userToReplaceWhenUnlinking = await Users.findOneById('rocket.cat'); + if (!userToReplaceWhenUnlinking?._id || !userToReplaceWhenUnlinking?.username) { break; } - await Messages.unlinkUserId(userId, rocketCat?._id, rocketCat?.username, nameAlias); + await Messages.unlinkUserId(userId, userToReplaceWhenUnlinking?._id, userToReplaceWhenUnlinking?.username, nameAlias); break; } @@ -104,8 +105,16 @@ export async function deleteUser(userId: string, confirmRelinquish = false, dele await Integrations.disableByUserId(userId); // Disables all the integrations which rely on the user being deleted. // Don't broadcast user.deleted for Erasure Type of 'Keep' so that messages don't disappear from logged in sessions - if (messageErasureType !== 'Keep') { - void api.broadcast('user.deleted', user); + if (messageErasureType === 'Delete') { + void api.broadcast('user.deleted', user, { + messageErasureType, + }); + } + if (messageErasureType === 'Unlink' && userToReplaceWhenUnlinking) { + void api.broadcast('user.deleted', user, { + messageErasureType, + replaceByUser: { _id: userToReplaceWhenUnlinking._id, username: userToReplaceWhenUnlinking?.username, alias: nameAlias }, + }); } } diff --git a/apps/meteor/app/lib/server/functions/notifications/desktop.ts b/apps/meteor/app/lib/server/functions/notifications/desktop.ts index ac43cce997b6..2d06cc51f222 100644 --- a/apps/meteor/app/lib/server/functions/notifications/desktop.ts +++ b/apps/meteor/app/lib/server/functions/notifications/desktop.ts @@ -30,7 +30,9 @@ export async function notifyDesktopUser({ duration: number; notificationMessage: string; }): Promise { - const { title, text } = await roomCoordinator.getRoomDirectives(room.t).getNotificationDetails(room, user, notificationMessage, userId); + const { title, text, name } = await roomCoordinator + .getRoomDirectives(room.t) + .getNotificationDetails(room, user, notificationMessage, userId); const payload = { title: title || '', @@ -42,11 +44,11 @@ export async function notifyDesktopUser({ tmid: message.tmid, sender: message.u, type: room.t, - name: room.name, message: { msg: message.msg, t: message.t, }, + name, }, }; diff --git a/apps/meteor/app/lib/server/functions/sendMessage.js b/apps/meteor/app/lib/server/functions/sendMessage.js index 72247d4b1870..e2f45d38fcbc 100644 --- a/apps/meteor/app/lib/server/functions/sendMessage.js +++ b/apps/meteor/app/lib/server/functions/sendMessage.js @@ -1,4 +1,4 @@ -import { Message } from '@rocket.chat/core-services'; +import { Message, api } from '@rocket.chat/core-services'; import { Messages } from '@rocket.chat/models'; import { Match, check } from 'meteor/check'; @@ -6,6 +6,7 @@ import { Apps } from '../../../../ee/server/apps'; import { callbacks } from '../../../../lib/callbacks'; import { isRelativeURL } from '../../../../lib/utils/isRelativeURL'; import { isURL } from '../../../../lib/utils/isURL'; +import { broadcastMessageSentEvent } from '../../../../server/modules/watchers/lib/messages'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { FileUpload } from '../../../file-upload/server'; import notifications from '../../../notifications/server/lib/Notifications'; @@ -248,9 +249,9 @@ export const sendMessage = async function (user, message, room, upsert = false, parseUrlsInMessage(message, previewUrls); - message = await Message.beforeSave({ message, room, user }); - message = await callbacks.run('beforeSaveMessage', message, room); + + message = await Message.beforeSave({ message, room, user }); if (message) { if (message.t === 'otr') { const otrStreamer = notifications.streamRoomMessage; @@ -288,6 +289,10 @@ export const sendMessage = async function (user, message, room, upsert = false, // Execute all callbacks await callbacks.run('afterSaveMessage', message, room); + void broadcastMessageSentEvent({ + id: message._id, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); return message; } }; diff --git a/apps/meteor/app/lib/server/functions/updateMessage.ts b/apps/meteor/app/lib/server/functions/updateMessage.ts index 9c544bd9a333..88c0b829e77d 100644 --- a/apps/meteor/app/lib/server/functions/updateMessage.ts +++ b/apps/meteor/app/lib/server/functions/updateMessage.ts @@ -1,10 +1,11 @@ -import { Message } from '@rocket.chat/core-services'; +import { Message, api } from '@rocket.chat/core-services'; import type { IEditedMessage, IMessage, IUser, AtLeast } from '@rocket.chat/core-typings'; import { Messages, Rooms } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { Apps } from '../../../../ee/server/apps'; import { callbacks } from '../../../../lib/callbacks'; +import { broadcastMessageSentEvent } from '../../../../server/modules/watchers/lib/messages'; import { settings } from '../../../settings/server'; import { parseUrlsInMessage } from './parseUrlsInMessage'; @@ -54,11 +55,11 @@ export const updateMessage = async function ( return; } + message = await callbacks.run('beforeSaveMessage', message); + // TODO remove type cast message = await Message.beforeSave({ message: message as IMessage, room, user }); - message = await callbacks.run('beforeSaveMessage', message); - const { _id, ...editedMessage } = message; if (!editedMessage.msg) { @@ -86,6 +87,11 @@ export const updateMessage = async function ( const msg = await Messages.findOneById(_id); if (msg) { await callbacks.run('afterSaveMessage', msg, room, user._id); + void broadcastMessageSentEvent({ + id: msg._id, + data: msg, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); } }); }; diff --git a/apps/meteor/app/lib/server/index.ts b/apps/meteor/app/lib/server/index.ts index 8fa779ec9644..c2d4bdda7472 100644 --- a/apps/meteor/app/lib/server/index.ts +++ b/apps/meteor/app/lib/server/index.ts @@ -21,8 +21,6 @@ import './methods/createToken'; import './methods/deleteMessage'; import './methods/deleteUserOwnAccount'; import './methods/executeSlashCommandPreview'; -import './startup/filterATAllTag'; -import './startup/filterATHereTag'; import './methods/getChannelHistory'; import './methods/getRoomJoinCode'; import './methods/getRoomRoles'; diff --git a/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.js b/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.js index 8c70ee3f9a4f..b55a272de558 100644 --- a/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.js +++ b/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.js @@ -191,4 +191,9 @@ export async function notifyUsersOnMessage(message, room) { return message; } -callbacks.add('afterSaveMessage', (message, room) => notifyUsersOnMessage(message, room), callbacks.priority.LOW, 'notifyUsersOnMessage'); +callbacks.add( + 'afterSaveMessage', + (message, room) => notifyUsersOnMessage(message, room), + callbacks.priority.MEDIUM, + 'notifyUsersOnMessage', +); diff --git a/apps/meteor/app/lib/server/startup/filterATAllTag.ts b/apps/meteor/app/lib/server/startup/filterATAllTag.ts deleted file mode 100644 index dfa3b1b1d84a..000000000000 --- a/apps/meteor/app/lib/server/startup/filterATAllTag.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { api } from '@rocket.chat/core-services'; -import { isEditedMessage } from '@rocket.chat/core-typings'; -import { Users } from '@rocket.chat/models'; -import { Meteor } from 'meteor/meteor'; -import moment from 'moment'; -import _ from 'underscore'; - -import { callbacks } from '../../../../lib/callbacks'; -import { i18n } from '../../../../server/lib/i18n'; -import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; - -callbacks.add( - 'beforeSaveMessage', - async (message) => { - // If the message was edited, or is older than 60 seconds (imported) - // the notifications will be skipped, so we can also skip this validation - if (isEditedMessage(message) || (message.ts && Math.abs(moment(message.ts).diff(moment())) > 60000)) { - return message; - } - - // Test if the message mentions include @all. - if (message.mentions != null && _.pluck(message.mentions, '_id').some((item) => item === 'all')) { - // Check if the user has permissions to use @all in both global and room scopes. - if ( - !(await hasPermissionAsync(message.u._id, 'mention-all')) && - !(await hasPermissionAsync(message.u._id, 'mention-all', message.rid)) - ) { - // Get the language of the user for the error notification. - const { language } = (await Users.findOneById(message.u._id)) || {}; - const action = i18n.t('Notify_all_in_this_room', { lng: language }); - - // Add a notification to the chat, informing the user that this - // action is not allowed. - void api.broadcast('notify.ephemeralMessage', message.u._id, message.rid, { - // TODO: i18n - msg: i18n.t('error-action-not-allowed', { action } as any, language), - }); - - // Also throw to stop propagation of 'sendMessage'. - throw new Meteor.Error('error-action-not-allowed', 'Notify all in this room not allowed', { - method: 'filterATAllTag', - action: 'Notify_all_in_this_room', - }); - } - } - - return message; - }, - callbacks.priority.MEDIUM, - 'filterATAllTag', -); diff --git a/apps/meteor/app/lib/server/startup/filterATHereTag.ts b/apps/meteor/app/lib/server/startup/filterATHereTag.ts deleted file mode 100644 index 305f03455d81..000000000000 --- a/apps/meteor/app/lib/server/startup/filterATHereTag.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { api } from '@rocket.chat/core-services'; -import { isEditedMessage } from '@rocket.chat/core-typings'; -import { Users } from '@rocket.chat/models'; -import { Meteor } from 'meteor/meteor'; -import moment from 'moment'; -import _ from 'underscore'; - -import { callbacks } from '../../../../lib/callbacks'; -import { i18n } from '../../../../server/lib/i18n'; -import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; - -callbacks.add( - 'beforeSaveMessage', - async (message) => { - // If the message was edited, or is older than 60 seconds (imported) - // the notifications will be skipped, so we can also skip this validation - if (isEditedMessage(message) || (message.ts && Math.abs(moment(message.ts).diff(moment())) > 60000)) { - return message; - } - - // Test if the message mentions include @here. - if (message.mentions != null && _.pluck(message.mentions, '_id').some((item) => item === 'here')) { - // Check if the user has permissions to use @here in both global and room scopes. - if ( - !(await hasPermissionAsync(message.u._id, 'mention-here')) && - !(await hasPermissionAsync(message.u._id, 'mention-here', message.rid)) - ) { - // Get the language of the user for the error notification. - const { language } = (await Users.findOneById(message.u._id)) || {}; - const action = i18n.t('Notify_active_in_this_room', { lng: language }); - - // Add a notification to the chat, informing the user that this - // action is not allowed. - void api.broadcast('notify.ephemeralMessage', message.u._id, message.rid, { - // TODO: i18n - msg: i18n.t('error-action-not-allowed', { action } as any, language), - }); - - // Also throw to stop propagation of 'sendMessage'. - throw new Meteor.Error('error-action-not-allowed', 'Notify here in this room not allowed', { - method: 'filterATHereTag', - action: 'Notify_active_in_this_room', - }); - } - } - - return message; - }, - callbacks.priority.MEDIUM, - 'filterATHereTag', -); diff --git a/apps/meteor/app/livechat/imports/server/rest/departments.ts b/apps/meteor/app/livechat/imports/server/rest/departments.ts index 095baefaa294..b8788aae2eed 100644 --- a/apps/meteor/app/livechat/imports/server/rest/departments.ts +++ b/apps/meteor/app/livechat/imports/server/rest/departments.ts @@ -16,7 +16,6 @@ import { findArchivedDepartments, } from '../../../server/api/lib/departments'; import { DepartmentHelper } from '../../../server/lib/Departments'; -import { Livechat } from '../../../server/lib/Livechat'; import { Livechat as LivechatTs } from '../../../server/lib/LivechatTyped'; API.v1.addRoute( @@ -110,10 +109,6 @@ API.v1.addRoute( const permissionToSave = await hasPermissionAsync(this.userId, 'manage-livechat-departments'); const permissionToAddAgents = await hasPermissionAsync(this.userId, 'add-livechat-department-agents'); - check(this.urlParams, { - _id: String, - }); - check(this.bodyParams, { department: Object, agents: Match.Maybe(Array), @@ -128,13 +123,13 @@ API.v1.addRoute( } if (success && agents && permissionToAddAgents) { - success = Livechat.saveDepartmentAgents(_id, { upsert: agents }); + success = await LivechatTs.saveDepartmentAgents(_id, { upsert: agents }); } if (success) { return API.v1.success({ department: await LivechatDepartment.findOneById(_id), - agents: await LivechatDepartmentAgents.find({ departmentId: _id }).toArray(), + agents: await LivechatDepartmentAgents.findByDepartmentId(_id).toArray(), }); } @@ -266,10 +261,6 @@ API.v1.addRoute( return API.v1.success(agents); }, async post() { - check(this.urlParams, { - _id: String, - }); - check( this.bodyParams, Match.ObjectIncluding({ @@ -277,7 +268,7 @@ API.v1.addRoute( remove: Array, }), ); - await Livechat.saveDepartmentAgents(this.urlParams._id, this.bodyParams); + await LivechatTs.saveDepartmentAgents(this.urlParams._id, this.bodyParams); return API.v1.success(); }, diff --git a/apps/meteor/app/livechat/imports/server/rest/users.ts b/apps/meteor/app/livechat/imports/server/rest/users.ts index a292b7ffb9e5..0ed8bf187cd9 100644 --- a/apps/meteor/app/livechat/imports/server/rest/users.ts +++ b/apps/meteor/app/livechat/imports/server/rest/users.ts @@ -7,7 +7,6 @@ import { API } from '../../../../api/server'; import { getPaginationItems } from '../../../../api/server/helpers/getPaginationItems'; import { hasAtLeastOnePermissionAsync } from '../../../../authorization/server/functions/hasPermission'; import { findAgents, findManagers } from '../../../server/api/lib/users'; -import { Livechat as LivechatJS } from '../../../server/lib/Livechat'; import { Livechat } from '../../../server/lib/LivechatTyped'; const emptyStringArray: string[] = []; @@ -74,12 +73,12 @@ API.v1.addRoute( }, async post() { if (this.urlParams.type === 'agent') { - const user = await LivechatJS.addAgent(this.bodyParams.username); + const user = await Livechat.addAgent(this.bodyParams.username); if (user) { return API.v1.success({ user }); } } else if (this.urlParams.type === 'manager') { - const user = await LivechatJS.addManager(this.bodyParams.username); + const user = await Livechat.addManager(this.bodyParams.username); if (user) { return API.v1.success({ user }); } diff --git a/apps/meteor/app/livechat/server/api/v1/agent.ts b/apps/meteor/app/livechat/server/api/v1/agent.ts index 7a7b70ea7c8b..4c3cad33c130 100644 --- a/apps/meteor/app/livechat/server/api/v1/agent.ts +++ b/apps/meteor/app/livechat/server/api/v1/agent.ts @@ -5,7 +5,6 @@ import { isGETAgentNextToken, isPOSTLivechatAgentStatusProps } from '@rocket.cha import { API } from '../../../../api/server'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { Livechat } from '../../lib/Livechat'; import { Livechat as LivechatTyped } from '../../lib/LivechatTyped'; import { findRoom, findGuest, findAgent, findOpenRoom } from '../lib/livechat'; @@ -95,7 +94,7 @@ API.v1.addRoute( return API.v1.success({ status: agent.statusLivechat }); } - const canChangeStatus = await Livechat.allowAgentChangeServiceStatus(newStatus, agentId); + const canChangeStatus = await LivechatTyped.allowAgentChangeServiceStatus(newStatus, agentId); if (agentId !== this.userId) { if (!(await hasPermissionAsync(this.userId, 'manage-livechat-agents'))) { @@ -106,7 +105,7 @@ API.v1.addRoute( // Next version we'll update this to return an error // And update the FE accordingly if (canChangeStatus) { - await Livechat.setUserStatusLivechat(agentId, newStatus); + await LivechatTyped.setUserStatusLivechat(agentId, newStatus); return API.v1.success({ status: newStatus }); } @@ -117,7 +116,7 @@ API.v1.addRoute( return API.v1.failure('error-business-hours-are-closed'); } - await Livechat.setUserStatusLivechat(agentId, newStatus); + await LivechatTyped.setUserStatusLivechat(agentId, newStatus); return API.v1.success({ status: newStatus }); }, diff --git a/apps/meteor/app/livechat/server/api/v1/config.ts b/apps/meteor/app/livechat/server/api/v1/config.ts index 37264721cb49..79a6132136c5 100644 --- a/apps/meteor/app/livechat/server/api/v1/config.ts +++ b/apps/meteor/app/livechat/server/api/v1/config.ts @@ -5,7 +5,7 @@ import { API } from '../../../../api/server'; import { Livechat } from '../../lib/LivechatTyped'; import { settings, findOpenRoom, getExtraConfigInfo, findAgent } from '../lib/livechat'; -const cachedSettings = mem(settings, { maxAge: 1000, cacheKey: JSON.stringify }); +const cachedSettings = mem(settings, { maxAge: process.env.TEST_MODE === 'true' ? 1 : 1000, cacheKey: JSON.stringify }); API.v1.addRoute( 'livechat/config', diff --git a/apps/meteor/app/livechat/server/api/v1/room.ts b/apps/meteor/app/livechat/server/api/v1/room.ts index 1ec602bf516d..23d7fe2c507a 100644 --- a/apps/meteor/app/livechat/server/api/v1/room.ts +++ b/apps/meteor/app/livechat/server/api/v1/room.ts @@ -24,7 +24,6 @@ import { hasPermissionAsync } from '../../../../authorization/server/functions/h import { addUserToRoom } from '../../../../lib/server/functions/addUserToRoom'; import { settings as rcSettings } from '../../../../settings/server'; import { normalizeTransferredByData } from '../../lib/Helper'; -import { Livechat } from '../../lib/Livechat'; import type { CloseRoomParams } from '../../lib/LivechatTyped'; import { Livechat as LivechatTyped } from '../../lib/LivechatTyped'; import { findGuest, findRoom, getRoom, settings, findAgent, onCheckRoomParams } from '../lib/livechat'; @@ -455,7 +454,7 @@ API.v1.addRoute( } // We want this both operations to be concurrent, so we have to go with Promise.allSettled - const result = await Promise.allSettled([LivechatTyped.saveGuest(guestData, this.userId), Livechat.saveRoomInfo(roomData)]); + const result = await Promise.allSettled([LivechatTyped.saveGuest(guestData, this.userId), LivechatTyped.saveRoomInfo(roomData)]); const firstError = result.find((item) => item.status === 'rejected'); if (firstError) { diff --git a/apps/meteor/app/livechat/server/api/v1/visitor.ts b/apps/meteor/app/livechat/server/api/v1/visitor.ts index 6488d34eab7a..59be77d298f1 100644 --- a/apps/meteor/app/livechat/server/api/v1/visitor.ts +++ b/apps/meteor/app/livechat/server/api/v1/visitor.ts @@ -1,4 +1,4 @@ -import type { IRoom } from '@rocket.chat/core-typings'; +import type { ILivechatVisitor, IRoom } from '@rocket.chat/core-typings'; import { LivechatVisitors as VisitorsRaw, LivechatCustomField, LivechatRooms } from '@rocket.chat/models'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -6,7 +6,6 @@ import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../../lib/callbacks'; import { API } from '../../../../api/server'; import { settings } from '../../../../settings/server'; -import { Livechat } from '../../lib/Livechat'; import { Livechat as LivechatTyped } from '../../lib/LivechatTyped'; import { findGuest, normalizeHttpHeaderData } from '../lib/livechat'; @@ -45,12 +44,23 @@ API.v1.addRoute('livechat/visitor', { const visitorId = await LivechatTyped.registerGuest(guest); - let visitor = await VisitorsRaw.findOneEnabledById(visitorId, {}); + let visitor: ILivechatVisitor | null = await VisitorsRaw.findOneEnabledById(visitorId, {}); if (visitor) { const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}); // If it's updating an existing visitor, it must also update the roomInfo const rooms = await LivechatRooms.findOpenByVisitorToken(visitor?.token, {}, extraQuery).toArray(); - await Promise.all(rooms.map((room: IRoom) => Livechat.saveRoomInfo(room, visitor))); + await Promise.all( + rooms.map( + (room: IRoom) => + visitor && + LivechatTyped.saveRoomInfo(room, { + _id: visitor._id, + name: visitor.name, + phone: visitor.phone?.[0]?.phoneNumber, + livechatData: visitor.livechatData as { [k: string]: string }, + }), + ), + ); } if (customFields && Array.isArray(customFields)) { @@ -193,7 +203,7 @@ API.v1.addRoute('livechat/visitor.status', { throw new Meteor.Error('invalid-token'); } - await Livechat.notifyGuestStatusChanged(token, status); + await LivechatTyped.notifyGuestStatusChanged(token, status); return API.v1.success({ token, status }); }, diff --git a/apps/meteor/app/livechat/server/hooks/afterUserActions.ts b/apps/meteor/app/livechat/server/hooks/afterUserActions.ts index d236e746d471..6fe7f1db7479 100644 --- a/apps/meteor/app/livechat/server/hooks/afterUserActions.ts +++ b/apps/meteor/app/livechat/server/hooks/afterUserActions.ts @@ -2,7 +2,6 @@ import { type IUser } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; -import { Livechat } from '../lib/Livechat'; import { Livechat as LivechatTyped } from '../lib/LivechatTyped'; type IAfterSaveUserProps = { @@ -21,14 +20,14 @@ const handleAgentUpdated = async (userData: IAfterSaveUserProps) => { } if (!wasAgent(oldUser) && isAgent(newUser)) { - await Livechat.afterAgentAdded(newUser); + await LivechatTyped.afterAgentAdded(newUser); } }; const handleAgentCreated = async (user: IUser) => { // created === no prev roles :) if (isAgent(user)) { - await Livechat.afterAgentAdded(user); + await LivechatTyped.afterAgentAdded(user); } }; @@ -39,8 +38,8 @@ const handleDeactivateUser = async (user: IUser) => { }; const handleActivateUser = async (user: IUser) => { - if (isAgent(user)) { - await Livechat.addAgent(user.username); + if (isAgent(user) && user.username) { + await LivechatTyped.addAgent(user.username); } }; diff --git a/apps/meteor/app/livechat/server/hooks/sendToCRM.ts b/apps/meteor/app/livechat/server/hooks/sendToCRM.ts index d435da17e8ec..a39c1076169c 100644 --- a/apps/meteor/app/livechat/server/hooks/sendToCRM.ts +++ b/apps/meteor/app/livechat/server/hooks/sendToCRM.ts @@ -5,7 +5,6 @@ import { LivechatRooms, Messages } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; import { settings } from '../../../settings/server'; import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; -import { Livechat } from '../lib/Livechat'; import { Livechat as LivechatTyped } from '../lib/LivechatTyped'; type AdditionalFields = @@ -87,12 +86,14 @@ async function sendToCRM( return room; } - const postData: Awaited> & { type: string; messages: IOmnichannelSystemMessage[] } = - { - ...(await Livechat.getLivechatRoomGuestInfo(room)), - type, - messages: [], - }; + const postData: Awaited> & { + type: string; + messages: IOmnichannelSystemMessage[]; + } = { + ...(await LivechatTyped.getLivechatRoomGuestInfo(room)), + type, + messages: [], + }; let messages: IOmnichannelSystemMessage[] | null = null; if (typeof includeMessages === 'boolean' && includeMessages) { @@ -269,7 +270,7 @@ callbacks.add( if (message.token && !settings.get('Livechat_webhook_on_visitor_message')) { return message; } - if (!settings.get('Livechat_webhook_on_agent_message')) { + if (!message.token && !settings.get('Livechat_webhook_on_agent_message')) { return message; } // if the message has a type means it is a special message (like the closing comment), so skips diff --git a/apps/meteor/app/livechat/server/lib/AnalyticsTyped.ts b/apps/meteor/app/livechat/server/lib/AnalyticsTyped.ts index 20717d6e02dd..1b0f7b4c2919 100644 --- a/apps/meteor/app/livechat/server/lib/AnalyticsTyped.ts +++ b/apps/meteor/app/livechat/server/lib/AnalyticsTyped.ts @@ -7,6 +7,6 @@ export const getAgentOverviewDataCached = mem(Analytics.getAgentOverviewData, { // while the data on the overview page is cached for 1 minute export const getAnalyticsOverviewDataCached = mem(Analytics.getAnalyticsOverviewData, { maxAge: 60000, cacheKey: JSON.stringify }); export const getAnalyticsOverviewDataCachedForRealtime = mem(Analytics.getAnalyticsOverviewData, { - maxAge: 5000, + maxAge: process.env.TEST_MODE === 'true' ? 1 : 5000, cacheKey: JSON.stringify, }); diff --git a/apps/meteor/app/livechat/server/lib/Helper.ts b/apps/meteor/app/livechat/server/lib/Helper.ts index 29e4e18f0e05..78351cdc6683 100644 --- a/apps/meteor/app/livechat/server/lib/Helper.ts +++ b/apps/meteor/app/livechat/server/lib/Helper.ts @@ -1,5 +1,5 @@ import { LivechatTransferEventType } from '@rocket.chat/apps-engine/definition/livechat'; -import { api, Message } from '@rocket.chat/core-services'; +import { api, Message, Omnichannel } from '@rocket.chat/core-services'; import type { ILivechatVisitor, IOmnichannelRoom, @@ -543,10 +543,8 @@ export const forwardRoomToDepartment = async (room: IOmnichannelRoom, guest: ILi agent = { agentId, username }; } - if (!RoutingManager.getConfig()?.autoAssignAgent) { - logger.debug( - `Routing algorithm doesn't support auto assignment (using ${RoutingManager.methodName}). Chat will be on department queue`, - ); + if (!RoutingManager.getConfig()?.autoAssignAgent || !(await Omnichannel.isWithinMACLimit(room))) { + logger.debug(`Room ${room._id} will be on department queue`); await LivechatTyped.saveTransferHistory(room, transferData); return RoutingManager.unassignAgent(inquiry, departmentId); } diff --git a/apps/meteor/app/livechat/server/lib/Livechat.js b/apps/meteor/app/livechat/server/lib/Livechat.js index 58a07f00a0d3..6ef74c33dfd4 100644 --- a/apps/meteor/app/livechat/server/lib/Livechat.js +++ b/apps/meteor/app/livechat/server/lib/Livechat.js @@ -1,31 +1,8 @@ // Note: Please don't add any new methods to this file, since its still in js and we are migrating to ts // Please add new methods to LivechatTyped.ts import { Logger } from '@rocket.chat/logger'; -import { - LivechatVisitors, - LivechatCustomField, - LivechatRooms, - LivechatInquiry, - Subscriptions, - LivechatDepartment as LivechatDepartmentRaw, - Rooms, - Users, -} from '@rocket.chat/models'; -import { Match, check } from 'meteor/check'; -import { Meteor } from 'meteor/meteor'; -import UAParser from 'ua-parser-js'; -import { Apps, AppEvents } from '../../../../ee/server/apps'; -import { callbacks } from '../../../../lib/callbacks'; -import { trim } from '../../../../lib/utils/stringUtils'; -import { i18n } from '../../../../server/lib/i18n'; -import { addUserRolesAsync } from '../../../../server/lib/roles/addUserRoles'; -import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import * as Mailer from '../../../mailer/server/api'; -import { businessHourManager } from '../business-hour'; import { Analytics } from './Analytics'; -import { parseAgentCustomFields, updateDepartmentAgents } from './Helper'; -import { RoutingManager } from './RoutingManager'; const logger = new Logger('Livechat'); @@ -33,220 +10,4 @@ export const Livechat = { Analytics, logger, - - async saveRoomInfo(roomData, guestData, userId) { - Livechat.logger.debug(`Saving room information on room ${roomData._id}`); - const { livechatData = {} } = roomData; - const customFields = {}; - - if ((!userId || (await hasPermissionAsync(userId, 'edit-livechat-room-customfields'))) && Object.keys(livechatData).length) { - Livechat.logger.debug(`Updating custom fields on room ${roomData._id}`); - const fields = LivechatCustomField.findByScope('room'); - for await (const field of fields) { - if (!livechatData.hasOwnProperty(field._id)) { - continue; - } - const value = trim(livechatData[field._id]); - if (value !== '' && field.regexp !== undefined && field.regexp !== '') { - const regexp = new RegExp(field.regexp); - if (!regexp.test(value)) { - throw new Meteor.Error(i18n.t('error-invalid-custom-field-value', { field: field.label })); - } - } - customFields[field._id] = value; - } - roomData.livechatData = customFields; - Livechat.logger.debug(`About to update ${Object.keys(customFields).length} custom fields on room ${roomData._id}`); - } - - if (!(await LivechatRooms.saveRoomById(roomData))) { - Livechat.logger.debug(`Failed to save room information on room ${roomData._id}`); - return false; - } - - setImmediate(() => { - Apps.triggerEvent(AppEvents.IPostLivechatRoomSaved, roomData._id); - }); - callbacks.runAsync('livechat.saveRoom', roomData); - - if (guestData?.name?.trim().length) { - const { _id: rid } = roomData; - const { name } = guestData; - return ( - (await Rooms.setFnameById(rid, name)) && - (await LivechatInquiry.setNameByRoomId(rid, name)) && - // This one needs to be the last since the agent may not have the subscription - // when the conversation is in the queue, then the result will be 0(zero) - Subscriptions.updateDisplayNameByRoomId(rid, name) - ); - } - }, - - async getLivechatRoomGuestInfo(room) { - const visitor = await LivechatVisitors.findOneEnabledById(room.v._id); - const agent = await Users.findOneById(room.servedBy && room.servedBy._id); - - const ua = new UAParser(); - ua.setUA(visitor.userAgent); - - const postData = { - _id: room._id, - label: room.fname || room.label, // using same field for compatibility - topic: room.topic, - createdAt: room.ts, - lastMessageAt: room.lm, - tags: room.tags, - customFields: room.livechatData, - visitor: { - _id: visitor._id, - token: visitor.token, - name: visitor.name, - username: visitor.username, - email: null, - phone: null, - department: visitor.department, - ip: visitor.ip, - os: ua.getOS().name && `${ua.getOS().name} ${ua.getOS().version}`, - browser: ua.getBrowser().name && `${ua.getBrowser().name} ${ua.getBrowser().version}`, - customFields: visitor.livechatData, - }, - }; - - if (agent) { - const customFields = parseAgentCustomFields(agent.customFields); - - postData.agent = { - _id: agent._id, - username: agent.username, - name: agent.name, - email: null, - ...(customFields && { customFields }), - }; - - if (agent.emails && agent.emails.length > 0) { - postData.agent.email = agent.emails[0].address; - } - } - - if (room.crmData) { - postData.crmData = room.crmData; - } - - if (visitor.visitorEmails && visitor.visitorEmails.length > 0) { - postData.visitor.email = visitor.visitorEmails; - } - if (visitor.phone && visitor.phone.length > 0) { - postData.visitor.phone = visitor.phone; - } - - return postData; - }, - - async afterAgentAdded(user) { - await Users.setOperator(user._id, true); - await this.setUserStatusLivechat(user._id, user.status !== 'offline' ? 'available' : 'not-available'); - - callbacks.runAsync('livechat.onNewAgentCreated', user._id); - - return user; - }, - - async addAgent(username) { - check(username, String); - - const user = await Users.findOneByUsername(username, { projection: { _id: 1, username: 1 } }); - - if (!user) { - throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'livechat:addAgent' }); - } - - if (await addUserRolesAsync(user._id, ['livechat-agent'])) { - return this.afterAgentAdded(user); - } - - return false; - }, - - async addManager(username) { - check(username, String); - - const user = await Users.findOneByUsername(username, { projection: { _id: 1, username: 1 } }); - - if (!user) { - throw new Meteor.Error('error-invalid-user', 'Invalid user', { - method: 'livechat:addManager', - }); - } - - if (await addUserRolesAsync(user._id, ['livechat-manager'])) { - return user; - } - - return false; - }, - - async setUserStatusLivechat(userId, status) { - const user = await Users.setLivechatStatus(userId, status); - callbacks.runAsync('livechat.setUserStatusLivechat', { userId, status }); - return user; - }, - - async saveDepartmentAgents(_id, departmentAgents) { - check(_id, String); - check(departmentAgents, { - upsert: Match.Maybe([ - Match.ObjectIncluding({ - agentId: String, - username: String, - count: Match.Maybe(Match.Integer), - order: Match.Maybe(Match.Integer), - }), - ]), - remove: Match.Maybe([ - Match.ObjectIncluding({ - agentId: String, - username: Match.Maybe(String), - count: Match.Maybe(Match.Integer), - order: Match.Maybe(Match.Integer), - }), - ]), - }); - - const department = await LivechatDepartmentRaw.findOneById(_id); - if (!department) { - throw new Meteor.Error('error-department-not-found', 'Department not found', { - method: 'livechat:saveDepartmentAgents', - }); - } - - return updateDepartmentAgents(_id, departmentAgents, department.enabled); - }, - - showConnecting() { - const { showConnecting } = RoutingManager.getConfig(); - return showConnecting; - }, - - async sendEmail(from, to, replyTo, subject, html) { - return Mailer.send({ - to, - from, - replyTo, - subject, - html, - }); - }, - - async notifyGuestStatusChanged(token, status) { - await LivechatInquiry.updateVisitorStatus(token, status); - await LivechatRooms.updateVisitorStatus(token, status); - }, - - async allowAgentChangeServiceStatus(statusLivechat, agentId) { - if (statusLivechat !== 'available') { - return true; - } - - return businessHourManager.allowAgentChangeServiceStatus(agentId); - }, }; diff --git a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts index 317d2e6c7b53..1b77aeecabbc 100644 --- a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts +++ b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts @@ -17,9 +17,10 @@ import type { TransferData, MessageAttachment, IMessageInbox, - ILivechatAgentStatus, + IOmnichannelAgent, + ILivechatDepartmentAgents, } from '@rocket.chat/core-typings'; -import { UserStatus, isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { ILivechatAgentStatus, UserStatus, isOmnichannelRoom } from '@rocket.chat/core-typings'; import { Logger, type MainLogger } from '@rocket.chat/logger'; import { LivechatDepartment, @@ -37,13 +38,16 @@ import { } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; import { serverFetch as fetch } from '@rocket.chat/server-fetch'; +import { Match, check } from 'meteor/check'; import moment from 'moment-timezone'; import type { Filter, FindCursor, UpdateFilter } from 'mongodb'; +import UAParser from 'ua-parser-js'; import { Apps, AppEvents } from '../../../../ee/server/apps'; import { callbacks } from '../../../../lib/callbacks'; import { trim } from '../../../../lib/utils/stringUtils'; import { i18n } from '../../../../server/lib/i18n'; +import { addUserRolesAsync } from '../../../../server/lib/roles/addUserRoles'; import { removeUserFromRolesAsync } from '../../../../server/lib/roles/removeUserFromRoles'; import { canAccessRoomAsync } from '../../../authorization/server'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; @@ -56,7 +60,8 @@ import * as Mailer from '../../../mailer/server/api'; import { metrics } from '../../../metrics/server'; import { settings } from '../../../settings/server'; import { getTimezone } from '../../../utils/server/lib/getTimezone'; -import { updateDepartmentAgents, validateEmail, normalizeTransferredByData } from './Helper'; +import { businessHourManager } from '../business-hour'; +import { parseAgentCustomFields, updateDepartmentAgents, validateEmail, normalizeTransferredByData } from './Helper'; import { QueueManager } from './QueueManager'; import { RoutingManager } from './RoutingManager'; @@ -134,6 +139,26 @@ type AKeyOf = { type PageInfo = { title: string; location: { href: string }; change: string }; +type ICRMData = { + _id: string; + label?: string; + topic?: string; + createdAt: Date; + lastMessageAt?: Date; + tags?: string[]; + customFields?: IOmnichannelRoom['livechatData']; + visitor: Pick & { + email?: ILivechatVisitor['visitorEmails']; + os?: string; + browser?: string; + customFields: ILivechatVisitor['livechatData']; + }; + agent?: Pick & { + email?: NonNullable[number]['address']; + }; + crmData?: IOmnichannelRoom['crmData']; +}; + const dnsResolveMx = util.promisify(dns.resolveMx); class LivechatClass { @@ -527,11 +552,7 @@ class LivechatClass { throw new Error('error-invalid-room'); } - if (!(await Omnichannel.isWithinMACLimit(room))) { - throw new Error('error-mac-limit-reached'); - } - - const showAgentInfo = settings.get('Livechat_show_agent_info'); + const showAgentInfo = settings.get('Livechat_show_agent_info'); const closingMessage = await Messages.findLivechatClosingMessage(rid, { projection: { ts: 1 } }); const ignoredMessageTypes: MessageTypesValues[] = [ 'livechat_navigation_history', @@ -1546,6 +1567,224 @@ class LivechatClass { return removeUserFromRolesAsync(user._id, ['livechat-manager']); } + + async getLivechatRoomGuestInfo(room: IOmnichannelRoom) { + const visitor = await LivechatVisitors.findOneEnabledById(room.v._id); + if (!visitor) { + throw new Error('error-invalid-visitor'); + } + + const agent = room.servedBy?._id ? await Users.findOneById(room.servedBy?._id) : null; + + const ua = new UAParser(); + ua.setUA(visitor.userAgent || ''); + + const postData: ICRMData = { + _id: room._id, + label: room.fname || room.label, // using same field for compatibility + topic: room.topic, + createdAt: room.ts, + lastMessageAt: room.lm, + tags: room.tags, + customFields: room.livechatData, + visitor: { + _id: visitor._id, + token: visitor.token, + name: visitor.name, + username: visitor.username, + department: visitor.department, + ip: visitor.ip, + os: ua.getOS().name && `${ua.getOS().name} ${ua.getOS().version}`, + browser: ua.getBrowser().name && `${ua.getBrowser().name} ${ua.getBrowser().version}`, + customFields: visitor.livechatData, + }, + }; + + if (agent) { + const customFields = parseAgentCustomFields(agent.customFields); + + postData.agent = { + _id: agent._id, + username: agent.username, + name: agent.name, + ...(customFields && { customFields }), + }; + + if (agent.emails && agent.emails.length > 0) { + postData.agent.email = agent.emails[0].address; + } + } + + if (room.crmData) { + postData.crmData = room.crmData; + } + + if (visitor.visitorEmails && visitor.visitorEmails.length > 0) { + postData.visitor.email = visitor.visitorEmails; + } + if (visitor.phone && visitor.phone.length > 0) { + postData.visitor.phone = visitor.phone; + } + + return postData; + } + + async allowAgentChangeServiceStatus(statusLivechat: ILivechatAgentStatus, agentId: string) { + if (statusLivechat !== ILivechatAgentStatus.AVAILABLE) { + return true; + } + + return businessHourManager.allowAgentChangeServiceStatus(agentId); + } + + async notifyGuestStatusChanged(token: string, status: UserStatus) { + await LivechatInquiry.updateVisitorStatus(token, status); + await LivechatRooms.updateVisitorStatus(token, status); + } + + async setUserStatusLivechat(userId: string, status: ILivechatAgentStatus) { + const user = await Users.setLivechatStatus(userId, status); + callbacks.runAsync('livechat.setUserStatusLivechat', { userId, status }); + return user; + } + + async afterAgentAdded(user: IUser) { + await Promise.all([ + Users.setOperator(user._id, true), + this.setUserStatusLivechat(user._id, user.status !== 'offline' ? ILivechatAgentStatus.AVAILABLE : ILivechatAgentStatus.NOT_AVAILABLE), + ]); + callbacks.runAsync('livechat.onNewAgentCreated', user._id); + + return user; + } + + async addAgent(username: string) { + check(username, String); + + const user = await Users.findOneByUsername(username, { projection: { _id: 1, username: 1 } }); + + if (!user) { + throw new Meteor.Error('error-invalid-user'); + } + + if (await addUserRolesAsync(user._id, ['livechat-agent'])) { + return this.afterAgentAdded(user); + } + + return false; + } + + async addManager(username: string) { + check(username, String); + + const user = await Users.findOneByUsername(username, { projection: { _id: 1, username: 1 } }); + + if (!user) { + throw new Meteor.Error('error-invalid-user'); + } + + if (await addUserRolesAsync(user._id, ['livechat-manager'])) { + return user; + } + + return false; + } + + async saveDepartmentAgents( + _id: string, + departmentAgents: { + upsert?: Pick[]; + remove?: Pick[]; + }, + ) { + check(_id, String); + check(departmentAgents, { + upsert: Match.Maybe([ + Match.ObjectIncluding({ + agentId: String, + username: String, + count: Match.Maybe(Match.Integer), + order: Match.Maybe(Match.Integer), + }), + ]), + remove: Match.Maybe([ + Match.ObjectIncluding({ + agentId: String, + username: Match.Maybe(String), + count: Match.Maybe(Match.Integer), + order: Match.Maybe(Match.Integer), + }), + ]), + }); + + const department = await LivechatDepartment.findOneById>(_id, { projection: { enabled: 1 } }); + if (!department) { + throw new Meteor.Error('error-department-not-found', 'Department not found'); + } + + return updateDepartmentAgents(_id, departmentAgents, department.enabled); + } + + async saveRoomInfo( + roomData: { + _id: string; + topic?: string; + tags?: string[]; + livechatData?: { [k: string]: string }; + // For priority and SLA, if the value is blank (ie ""), then system will remove the priority or SLA from the room + priorityId?: string; + slaId?: string; + }, + guestData?: { + _id: string; + name?: string; + email?: string; + phone?: string; + livechatData?: { [k: string]: string }; + }, + userId?: string, + ) { + this.logger.debug(`Saving room information on room ${roomData._id}`); + const { livechatData = {} } = roomData; + const customFields: Record = {}; + + if ((!userId || (await hasPermissionAsync(userId, 'edit-livechat-room-customfields'))) && Object.keys(livechatData).length) { + const fields = LivechatCustomField.findByScope('room'); + for await (const field of fields) { + if (!livechatData.hasOwnProperty(field._id)) { + continue; + } + const value = trim(livechatData[field._id]); + if (value !== '' && field.regexp !== undefined && field.regexp !== '') { + const regexp = new RegExp(field.regexp); + if (!regexp.test(value)) { + throw new Meteor.Error(i18n.t('error-invalid-custom-field-value', { field: field.label })); + } + } + customFields[field._id] = value; + } + roomData.livechatData = customFields; + Livechat.logger.debug(`About to update ${Object.keys(customFields).length} custom fields on room ${roomData._id}`); + } + + await LivechatRooms.saveRoomById(roomData); + + setImmediate(() => { + void Apps.triggerEvent(AppEvents.IPostLivechatRoomSaved, roomData._id); + }); + + if (guestData?.name?.trim().length) { + const { _id: rid } = roomData; + const { name } = guestData; + await Promise.all([ + Rooms.setFnameById(rid, name), + LivechatInquiry.setNameByRoomId(rid, name), + Subscriptions.updateDisplayNameByRoomId(rid, name), + ]); + + return true; + } + } } export const Livechat = new LivechatClass(); diff --git a/apps/meteor/app/livechat/server/lib/RoutingManager.ts b/apps/meteor/app/livechat/server/lib/RoutingManager.ts index e9c173d86913..7b85c31f26ac 100644 --- a/apps/meteor/app/livechat/server/lib/RoutingManager.ts +++ b/apps/meteor/app/livechat/server/lib/RoutingManager.ts @@ -10,6 +10,7 @@ import type { InquiryWithAgentInfo, TransferData, } from '@rocket.chat/core-typings'; +import { License } from '@rocket.chat/license'; import { Logger } from '@rocket.chat/logger'; import { LivechatInquiry, LivechatRooms, Subscriptions, Rooms, Users } from '@rocket.chat/models'; import { Match, check } from 'meteor/check'; @@ -82,6 +83,13 @@ export const RoutingManager: Routing = { this.methodName = name; } + const shouldPreventQueueStart = await License.shouldPreventAction('monthlyActiveContacts'); + + if (shouldPreventQueueStart) { + logger.error('Monthly Active Contacts limit reached. Queue will not start'); + return; + } + void (await Omnichannel.getQueueWorker()).shouldStart(); }, @@ -178,10 +186,6 @@ export const RoutingManager: Routing = { return false; } - if (!(await Omnichannel.isWithinMACLimit(room))) { - throw new Error('error-mac-limit-reached'); - } - if (departmentId && departmentId !== department) { logger.debug(`Switching department for inquiry ${inquiry._id} [Current: ${department} | Next: ${departmentId}]`); await updateChatDepartment({ @@ -269,10 +273,6 @@ export const RoutingManager: Routing = { }, async transferRoom(room, guest, transferData) { - if (!(await Omnichannel.isWithinMACLimit(room))) { - throw new Error('error-mac-limit-reached'); - } - logger.debug(`Transfering room ${room._id} by ${transferData.transferredBy._id}`); if (transferData.departmentId) { logger.debug(`Transfering room ${room._id} to department ${transferData.departmentId}`); diff --git a/apps/meteor/app/livechat/server/methods/addAgent.ts b/apps/meteor/app/livechat/server/methods/addAgent.ts index 4c7281d6b830..6160db590ece 100644 --- a/apps/meteor/app/livechat/server/methods/addAgent.ts +++ b/apps/meteor/app/livechat/server/methods/addAgent.ts @@ -4,7 +4,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -import { Livechat } from '../lib/Livechat'; +import { Livechat } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention diff --git a/apps/meteor/app/livechat/server/methods/addManager.ts b/apps/meteor/app/livechat/server/methods/addManager.ts index f3078d8ec73d..347c4f07d63f 100644 --- a/apps/meteor/app/livechat/server/methods/addManager.ts +++ b/apps/meteor/app/livechat/server/methods/addManager.ts @@ -4,7 +4,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -import { Livechat } from '../lib/Livechat'; +import { Livechat } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention diff --git a/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts b/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts index 76392fcdf721..8ccfcd5ec468 100644 --- a/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts +++ b/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts @@ -1,15 +1,16 @@ +import { ILivechatAgentStatus } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -import { Livechat } from '../lib/Livechat'; +import { Livechat as LivechatTS } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { - 'livechat:changeLivechatStatus'(params?: { status?: string; agentId?: string }): unknown; + 'livechat:changeLivechatStatus'(params?: { status?: ILivechatAgentStatus; agentId?: string }): unknown; } } @@ -44,7 +45,9 @@ Meteor.methods({ }); } - const newStatus = status || (agent.statusLivechat === 'available' ? 'not-available' : 'available'); + const newStatus: ILivechatAgentStatus = + status || + (agent.statusLivechat === ILivechatAgentStatus.AVAILABLE ? ILivechatAgentStatus.NOT_AVAILABLE : ILivechatAgentStatus.AVAILABLE); if (newStatus === agent.statusLivechat) { return; @@ -56,15 +59,15 @@ Meteor.methods({ method: 'livechat:changeLivechatStatus', }); } - return Livechat.setUserStatusLivechat(agentId, newStatus); + return LivechatTS.setUserStatusLivechat(agentId, newStatus); } - if (!(await Livechat.allowAgentChangeServiceStatus(newStatus, agentId))) { + if (!(await LivechatTS.allowAgentChangeServiceStatus(newStatus, agentId))) { throw new Meteor.Error('error-business-hours-are-closed', 'Not allowed', { method: 'livechat:changeLivechatStatus', }); } - return Livechat.setUserStatusLivechat(agentId, newStatus); + return LivechatTS.setUserStatusLivechat(agentId, newStatus); }, }); diff --git a/apps/meteor/app/livechat/server/methods/registerGuest.ts b/apps/meteor/app/livechat/server/methods/registerGuest.ts index e35b2693400d..01f720b85a4d 100644 --- a/apps/meteor/app/livechat/server/methods/registerGuest.ts +++ b/apps/meteor/app/livechat/server/methods/registerGuest.ts @@ -5,7 +5,6 @@ import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -import { Livechat } from '../lib/Livechat'; import { Livechat as LivechatTyped } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { @@ -58,10 +57,23 @@ Meteor.methods({ }, }); + if (!visitor) { + throw new Meteor.Error('error-invalid-visitor', 'Invalid visitor', { method: 'livechat:registerGuest' }); + } + const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}); // If it's updating an existing visitor, it must also update the roomInfo const rooms: IRoom[] = await LivechatRooms.findOpenByVisitorToken(token, {}, extraQuery).toArray(); - await Promise.all(rooms.map((room) => Livechat.saveRoomInfo(room, visitor))); + await Promise.all( + rooms.map((room) => + LivechatTyped.saveRoomInfo(room, { + _id: visitor._id, + name: visitor.name, + phone: visitor.phone?.[0]?.phoneNumber, + livechatData: visitor.livechatData as { [k: string]: string }, + }), + ), + ); if (customFields && customFields instanceof Array) { for await (const customField of customFields) { diff --git a/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts b/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts index edc15f940322..73a471869926 100644 --- a/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts +++ b/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts @@ -1,20 +1,17 @@ +import type { ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -import { Livechat } from '../lib/Livechat'; +import { Livechat } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveDepartmentAgents'( _id: string, - departmentAgents: { - agentId: string; - count?: number; - order?: number; - }[], + departmentAgents: Pick[], ): boolean; } } diff --git a/apps/meteor/app/livechat/server/methods/saveInfo.ts b/apps/meteor/app/livechat/server/methods/saveInfo.ts index ab0e5c729ac0..a057706fdc23 100644 --- a/apps/meteor/app/livechat/server/methods/saveInfo.ts +++ b/apps/meteor/app/livechat/server/methods/saveInfo.ts @@ -7,7 +7,6 @@ import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -import { Livechat } from '../lib/Livechat'; import { Livechat as LivechatTyped } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { @@ -78,9 +77,9 @@ Meteor.methods({ delete guestData.phone; } - // Note: type is right, but `check` converts it to something else // Since the endpoint is going to be deprecated, we can live with this for a while - await Promise.allSettled([LivechatTyped.saveGuest(guestData as any, userId), Livechat.saveRoomInfo(roomData)]); + // @ts-expect-error - type is right, but `check` converts it to something else + await Promise.allSettled([LivechatTyped.saveGuest(guestData as any, userId), LivechatTyped.saveRoomInfo(roomData)]); const user = await Users.findOne({ _id: userId }, { projection: { _id: 1, username: 1 } }); diff --git a/apps/meteor/app/livechat/server/methods/sendTranscript.ts b/apps/meteor/app/livechat/server/methods/sendTranscript.ts index 01744c04b726..366a73c8bb0a 100644 --- a/apps/meteor/app/livechat/server/methods/sendTranscript.ts +++ b/apps/meteor/app/livechat/server/methods/sendTranscript.ts @@ -1,4 +1,5 @@ -import { Users } from '@rocket.chat/models'; +import { Omnichannel } from '@rocket.chat/core-services'; +import { LivechatRooms, Users } from '@rocket.chat/models'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -29,6 +30,15 @@ Meteor.methods({ const user = await Users.findOneById(uid, { projection: { _id: 1, username: 1, name: 1, utcOffset: 1 }, }); + + const room = await LivechatRooms.findOneById(rid, { projection: { activity: 1 } }); + if (!room) { + throw new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'livechat:sendTranscript' }); + } + if (!(await Omnichannel.isWithinMACLimit(room))) { + throw new Meteor.Error('error-mac-limit-reached', 'MAC limit reached', { method: 'livechat:sendTranscript' }); + } + return Livechat.sendTranscript({ token, rid, email, subject, user }); }, }); diff --git a/apps/meteor/app/livechat/server/methods/setUpConnection.ts b/apps/meteor/app/livechat/server/methods/setUpConnection.ts index 658f6249c9b1..788b2384c4d3 100644 --- a/apps/meteor/app/livechat/server/methods/setUpConnection.ts +++ b/apps/meteor/app/livechat/server/methods/setUpConnection.ts @@ -1,8 +1,9 @@ +import { UserStatus } from '@rocket.chat/core-typings'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -import { Livechat } from '../lib/Livechat'; +import { Livechat } from '../lib/LivechatTyped'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -32,7 +33,7 @@ Meteor.methods({ if (this.connection && !this.connection.livechatToken) { this.connection.livechatToken = token; this.connection.onClose(async () => { - await Livechat.notifyGuestStatusChanged(token, 'offline'); + await Livechat.notifyGuestStatusChanged(token, UserStatus.OFFLINE); }); } }, diff --git a/apps/meteor/app/message-pin/server/pinMessage.ts b/apps/meteor/app/message-pin/server/pinMessage.ts index 906f0c98c181..652f465188c1 100644 --- a/apps/meteor/app/message-pin/server/pinMessage.ts +++ b/apps/meteor/app/message-pin/server/pinMessage.ts @@ -1,4 +1,4 @@ -import { Message } from '@rocket.chat/core-services'; +import { Message, api } from '@rocket.chat/core-services'; import { isQuoteAttachment, isRegisterUser } from '@rocket.chat/core-typings'; import type { IMessage, MessageAttachment, MessageQuoteAttachment } from '@rocket.chat/core-typings'; import { Messages, Rooms, Subscriptions, Users, ReadReceipts } from '@rocket.chat/models'; @@ -9,6 +9,7 @@ import { Meteor } from 'meteor/meteor'; import { Apps, AppEvents } from '../../../ee/server/apps/orchestrator'; import { callbacks } from '../../../lib/callbacks'; import { isTruthy } from '../../../lib/isTruthy'; +import { broadcastMessageSentEvent } from '../../../server/modules/watchers/lib/messages'; import { canAccessRoomAsync, roomAccessAttributes } from '../../authorization/server'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { isTheLastMessage } from '../../lib/server/functions/isTheLastMessage'; @@ -108,10 +109,10 @@ Meteor.methods({ username: me.username, }; - originalMessage = await Message.beforeSave({ message: originalMessage, room, user: me }); - originalMessage = await callbacks.run('beforeSaveMessage', originalMessage); + originalMessage = await Message.beforeSave({ message: originalMessage, room, user: me }); + await Messages.setPinnedByIdAndUserId(originalMessage._id, originalMessage.pinnedBy, originalMessage.pinned); if (settings.get('Message_Read_Receipt_Store_Users')) { await ReadReceipts.setPinnedByMessageId(message._id, originalMessage.pinned); @@ -211,10 +212,10 @@ Meteor.methods({ throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'unpinMessage' }); } - originalMessage = await Message.beforeSave({ message: originalMessage, room, user: me }); - originalMessage = await callbacks.run('beforeSaveMessage', originalMessage); + originalMessage = await Message.beforeSave({ message: originalMessage, room, user: me }); + if (isTheLastMessage(room, message)) { await Rooms.setLastMessagePinned(room._id, originalMessage.pinnedBy, originalMessage.pinned); } @@ -226,6 +227,10 @@ Meteor.methods({ if (settings.get('Message_Read_Receipt_Store_Users')) { await ReadReceipts.setPinnedByMessageId(originalMessage._id, originalMessage.pinned); } + void broadcastMessageSentEvent({ + id: message._id, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); return true; }, diff --git a/apps/meteor/app/message-star/server/starMessage.ts b/apps/meteor/app/message-star/server/starMessage.ts index 006951ad0b72..aaa5657c5b35 100644 --- a/apps/meteor/app/message-star/server/starMessage.ts +++ b/apps/meteor/app/message-star/server/starMessage.ts @@ -1,9 +1,11 @@ +import { api } from '@rocket.chat/core-services'; import type { IMessage } from '@rocket.chat/core-typings'; import { Messages, Subscriptions, Rooms } from '@rocket.chat/models'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { Apps, AppEvents } from '../../../ee/server/apps/orchestrator'; +import { broadcastMessageSentEvent } from '../../../server/modules/watchers/lib/messages'; import { canAccessRoomAsync, roomAccessAttributes } from '../../authorization/server'; import { isTheLastMessage } from '../../lib/server/functions/isTheLastMessage'; import { settings } from '../../settings/server'; @@ -60,6 +62,11 @@ Meteor.methods({ await Messages.updateUserStarById(message._id, uid, message.starred); + void broadcastMessageSentEvent({ + id: message._id, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); + return true; }, }); diff --git a/apps/meteor/app/otr/client/OTRRoom.ts b/apps/meteor/app/otr/client/OTRRoom.ts index d0d1ae84cd3e..0fdcecd91a28 100644 --- a/apps/meteor/app/otr/client/OTRRoom.ts +++ b/apps/meteor/app/otr/client/OTRRoom.ts @@ -89,7 +89,10 @@ export class OTRRoom implements IOTRRoom { if (!user) { return; } - await sdk.call('sendSystemMessages', this._roomId, user.username, otrSystemMessages.USER_REQUESTED_OTR_KEY_REFRESH); + await sdk.rest.post('/v1/chat.otr', { + roomId: this._roomId, + type: otrSystemMessages.USER_REQUESTED_OTR_KEY_REFRESH, + }); this.isFirstOTR = false; } } catch (e) { diff --git a/apps/meteor/app/reactions/server/setReaction.ts b/apps/meteor/app/reactions/server/setReaction.ts index 50ffe76810dc..fab1100fc615 100644 --- a/apps/meteor/app/reactions/server/setReaction.ts +++ b/apps/meteor/app/reactions/server/setReaction.ts @@ -8,6 +8,7 @@ import _ from 'underscore'; import { AppEvents, Apps } from '../../../ee/server/apps/orchestrator'; import { callbacks } from '../../../lib/callbacks'; import { i18n } from '../../../server/lib/i18n'; +import { broadcastMessageSentEvent } from '../../../server/modules/watchers/lib/messages'; import { canAccessRoomAsync } from '../../authorization/server'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { emoji } from '../../emoji/server'; @@ -106,6 +107,11 @@ async function setReaction(room: IRoom, user: IUser, message: IMessage, reaction } await Apps.triggerEvent(AppEvents.IPostMessageReacted, message, user, reaction, isReacted); + + void broadcastMessageSentEvent({ + id: message._id, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); } export async function executeSetReaction(userId: string, reaction: string, messageId: IMessage['_id'], shouldReact?: boolean) { diff --git a/apps/meteor/app/smarsh-connector/server/functions/generateEml.ts b/apps/meteor/app/smarsh-connector/server/functions/generateEml.ts index f2b6ff355730..ce110cbff430 100644 --- a/apps/meteor/app/smarsh-connector/server/functions/generateEml.ts +++ b/apps/meteor/app/smarsh-connector/server/functions/generateEml.ts @@ -90,7 +90,12 @@ export const generateEml = async (): Promise => { if (message.t) { const messageType = MessageTypes.getType(message); if (messageType) { - rows.push(i18n.t(messageType.message, messageType.data ? messageType.data(message) : {}, 'en')); + rows.push( + i18n.t(messageType.message, { + lng: 'en', + replace: messageType.data ? messageType.data(message) : {}, + }), + ); } else { rows.push(`${message.msg} (${message.t})`); } diff --git a/apps/meteor/app/spotify/lib/spotify.ts b/apps/meteor/app/spotify/lib/spotify.ts deleted file mode 100644 index 46683fdba2b4..000000000000 --- a/apps/meteor/app/spotify/lib/spotify.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { IMessage } from '@rocket.chat/core-typings'; - -const process = ( - message: IMessage, - source: string, - callback: (msg: IMessage, msgParts: string[], index: number, part: string) => void, -): void => { - if (!source?.trim()) { - return; - } - - const msgParts = source.split(/(```\w*[\n ]?[\s\S]*?```+?)|(`(?:[^`]+)`)/); - for (let index = 0; index < msgParts.length; index++) { - const part = msgParts[index]; - if (!/(?:```(\w*)[\n ]?([\s\S]*?)```+?)|(?:`(?:[^`]+)`)/.test(part)) { - callback(message, msgParts, index, part); - } - } -}; - -export const createSpotifyBeforeSaveMessageHandler = - (): ((msg: IMessage) => IMessage) => - (message: IMessage): IMessage => { - const urls = Array.isArray(message.urls) ? message.urls : []; - - let changed = false; - - process(message, message.msg, (_message: IMessage, _msgParts: string[], _index: number, part: string) => { - const re = /(?:^|\s)spotify:([^:\s]+):([^:\s]+)(?::([^:\s]+))?(?::(\S+))?(?:\s|$)/g; - - let match; - while ((match = re.exec(part)) != null) { - const data = match.slice(1).filter(Boolean); - const path = data.map((value) => encodeURI(value)).join('/'); - const url = `https://open.spotify.com/${path}`; - urls.push({ url, source: `spotify:${data.join(':')}`, meta: {} }); - changed = true; - } - }); - - if (changed) { - message.urls = urls; - } - - return message; - }; diff --git a/apps/meteor/app/spotify/server/index.ts b/apps/meteor/app/spotify/server/index.ts deleted file mode 100644 index f12b38c6b38b..000000000000 --- a/apps/meteor/app/spotify/server/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { callbacks } from '../../../lib/callbacks'; -import { createSpotifyBeforeSaveMessageHandler } from '../lib/spotify'; - -Meteor.startup(() => { - const beforeSaveMessage = createSpotifyBeforeSaveMessageHandler(); - - callbacks.add('beforeSaveMessage', beforeSaveMessage, callbacks.priority.LOW, 'spotify-save'); -}); diff --git a/apps/meteor/app/threads/server/hooks/aftersavemessage.ts b/apps/meteor/app/threads/server/hooks/aftersavemessage.ts index 6af3b2eedb7e..6fa780e12f8d 100644 --- a/apps/meteor/app/threads/server/hooks/aftersavemessage.ts +++ b/apps/meteor/app/threads/server/hooks/aftersavemessage.ts @@ -1,9 +1,11 @@ +import { api } from '@rocket.chat/core-services'; import type { IMessage, IRoom } from '@rocket.chat/core-typings'; import { isEditedMessage } from '@rocket.chat/core-typings'; import { Messages } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; +import { broadcastMessageSentEvent } from '../../../../server/modules/watchers/lib/messages'; import { updateThreadUsersSubscriptions, getMentions } from '../../../lib/server/lib/notifyUsersOnMessage'; import { sendMessageNotifications } from '../../../lib/server/lib/sendNotificationsOnMessage'; import { settings } from '../../../settings/server'; @@ -61,6 +63,10 @@ export async function processThreads(message: IMessage, room: IRoom) { await notifyUsersOnReply(message, replies, room); await metaData(message, parentMessage, replies); await notification(message, room, replies); + void broadcastMessageSentEvent({ + id: message.tmid, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); return message; } diff --git a/apps/meteor/app/ui-message/client/ActionManager.ts b/apps/meteor/app/ui-message/client/ActionManager.ts index 5c5ec622b4c8..dc66a5407a8e 100644 --- a/apps/meteor/app/ui-message/client/ActionManager.ts +++ b/apps/meteor/app/ui-message/client/ActionManager.ts @@ -1,21 +1,18 @@ import type { DistributiveOmit, UiKit } from '@rocket.chat/core-typings'; import { Emitter } from '@rocket.chat/emitter'; import { Random } from '@rocket.chat/random'; -import type { ActionManagerContext, RouterContext } from '@rocket.chat/ui-contexts'; +import type { RouterContext, IActionManager } from '@rocket.chat/ui-contexts'; import type { ContextType } from 'react'; import { lazy } from 'react'; import * as banners from '../../../client/lib/banners'; import { imperativeModal } from '../../../client/lib/imperativeModal'; -import { router } from '../../../client/providers/RouterProvider'; import { sdk } from '../../utils/client/lib/SDKClient'; import { UiKitTriggerTimeoutError } from './UiKitTriggerTimeoutError'; const UiKitModal = lazy(() => import('../../../client/views/modal/uikit/UiKitModal')); -type ActionManagerType = Exclude, undefined>; - -export class ActionManager implements ActionManagerType { +export class ActionManager implements IActionManager { protected static TRIGGER_TIMEOUT = 5000; protected static TRIGGER_TIMEOUT_ERROR = 'TRIGGER_TIMEOUT_ERROR'; @@ -58,6 +55,14 @@ export class ActionManager implements ActionManagerType { return this.events.off(eventName, listener); } + public notifyBusy() { + this.events.emit('busy', { busy: true }); + } + + public notifyIdle() { + this.events.emit('busy', { busy: false }); + } + public generateTriggerId(appId: string | undefined) { const triggerId = Random.id(); this.triggersId.set(triggerId, appId); @@ -66,7 +71,7 @@ export class ActionManager implements ActionManagerType { } public async emitInteraction(appId: string, userInteraction: DistributiveOmit) { - this.events.emit('busy', { busy: true }); + this.notifyBusy(); const triggerId = this.generateTriggerId(appId); @@ -84,7 +89,7 @@ export class ActionManager implements ActionManagerType { .then((interaction) => this.handleServerInteraction(interaction)), ]).finally(() => { if (timeout) clearTimeout(timeout); - this.events.emit('busy', { busy: false }); + this.notifyIdle(); }); } @@ -266,6 +271,3 @@ export class ActionManager implements ActionManagerType { this.viewInstances.delete(viewId); } } - -/** @deprecated consumer should use the context instead */ -export const actionManager = new ActionManager(router); diff --git a/apps/meteor/app/ui/client/lib/ChatMessages.ts b/apps/meteor/app/ui/client/lib/ChatMessages.ts index 4563bae81d52..2e7c4a479e86 100644 --- a/apps/meteor/app/ui/client/lib/ChatMessages.ts +++ b/apps/meteor/app/ui/client/lib/ChatMessages.ts @@ -1,5 +1,6 @@ import type { IMessage, IRoom, IUser } from '@rocket.chat/core-typings'; import { isVideoConfMessage } from '@rocket.chat/core-typings'; +import type { IActionManager } from '@rocket.chat/ui-contexts'; import type { UIEvent } from 'react'; import type { ChatAPI, ComposerAPI, DataAPI, UploadsAPI } from '../../../../client/lib/chats/ChatAPI'; @@ -18,7 +19,6 @@ import { setHighlightMessage, clearHighlightMessage, } from '../../../../client/views/room/MessageList/providers/messageHighlightSubscription'; -import { actionManager } from '../../../ui-message/client/ActionManager'; import { UserAction } from './UserAction'; type DeepWritable = T extends (...args: any) => any @@ -144,13 +144,14 @@ export class ChatMessages implements ChatAPI { rid: IRoom['_id']; tmid?: IMessage['_id']; uid: IUser['_id'] | null; + actionManager: IActionManager; }, ) { const { rid, tmid } = params; this.uid = params.uid; this.data = createDataAPI({ rid, tmid }); this.uploads = createUploadsAPI({ rid, tmid }); - this.ActionManager = actionManager; + this.ActionManager = params.actionManager; const unimplemented = () => { throw new Error('Flow is not implemented'); diff --git a/apps/meteor/app/ui/client/lib/KonchatNotification.ts b/apps/meteor/app/ui/client/lib/KonchatNotification.ts index 1af8ca18d337..dbffdf2a80a1 100644 --- a/apps/meteor/app/ui/client/lib/KonchatNotification.ts +++ b/apps/meteor/app/ui/client/lib/KonchatNotification.ts @@ -1,4 +1,4 @@ -import type { IMessage, IRoom, IUser, RoomType } from '@rocket.chat/core-typings'; +import type { INotificationDesktop, IRoom, IUser } from '@rocket.chat/core-typings'; import { Random } from '@rocket.chat/random'; import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; @@ -22,25 +22,6 @@ declare global { } } -export type NotificationEvent = { - icon?: string; - title: string; - text: string; - duration?: number; - payload: { - _id?: IMessage['_id']; - rid?: IRoom['_id']; - tmid?: IMessage['_id']; - sender?: Pick; - type?: RoomType; - name?: string; - message?: { - msg: string; - t?: string; - }; - }; -}; - class KonchatNotification { public notificationStatus = new ReactiveVar(undefined); @@ -52,7 +33,7 @@ class KonchatNotification { } } - public async notify(notification: NotificationEvent) { + public async notify(notification: INotificationDesktop) { if (typeof window.Notification === 'undefined' || Notification.permission !== 'granted') { return; } @@ -146,11 +127,20 @@ class KonchatNotification { }, search: { ...router.getSearchParameters(), jump: notification.payload._id }, }); + case 'l': + return router.navigate({ + pattern: '/live/:id/:tab?/:context?', + params: { + id: notification.payload.rid, + tab: 'room-info', + }, + search: { ...router.getSearchParameters(), jump: notification.payload._id }, + }); } }; } - public async showDesktop(notification: NotificationEvent) { + public async showDesktop(notification: INotificationDesktop) { if (!notification.payload.rid) { return; } diff --git a/apps/meteor/app/ui/client/lib/userCard.tsx b/apps/meteor/app/ui/client/lib/userCard.tsx index 98bfca9e53fc..e4fd5b343140 100644 --- a/apps/meteor/app/ui/client/lib/userCard.tsx +++ b/apps/meteor/app/ui/client/lib/userCard.tsx @@ -68,7 +68,7 @@ export const openUserCard = (params: Omit) => { if (!unregisterPortal) { const children = createElement(UserCardWithProps); - const portal = createPortal(children, container); + const portal = <>{createPortal(children, container)}; unregisterPortal = registerPortal(container, portal); } diff --git a/apps/meteor/app/utils/lib/i18n.ts b/apps/meteor/app/utils/lib/i18n.ts index 7fa491d965e8..a491159e49e9 100644 --- a/apps/meteor/app/utils/lib/i18n.ts +++ b/apps/meteor/app/utils/lib/i18n.ts @@ -5,7 +5,7 @@ import { isObject } from '../../../lib/utils/isObject'; export const i18n = i18next.use(sprintf); -export const addSprinfToI18n = function (t: (typeof i18n)['t']) { +export const addSprinfToI18n = function (t: (key: string, ...replaces: any) => string) { return function (key: string, ...replaces: any): string { if (replaces[0] === undefined || (isObject(replaces[0]) && !Array.isArray(replaces[0]))) { return t(key, ...replaces); diff --git a/apps/meteor/client/components/AutoCompleteDepartment.tsx b/apps/meteor/client/components/AutoCompleteDepartment.tsx index b4017b954eed..4688899890fb 100644 --- a/apps/meteor/client/components/AutoCompleteDepartment.tsx +++ b/apps/meteor/client/components/AutoCompleteDepartment.tsx @@ -1,7 +1,7 @@ import { PaginatedSelectFiltered } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { ReactElement } from 'react'; +import type { ComponentProps, ReactElement } from 'react'; import React, { memo, useMemo, useState } from 'react'; import { useRecordList } from '../hooks/lists/useRecordList'; @@ -16,7 +16,7 @@ type AutoCompleteDepartmentProps = { haveAll?: boolean; haveNone?: boolean; showArchived?: boolean; -}; +} & Omit, 'options' | 'setFilter'>; const AutoCompleteDepartment = ({ value, @@ -26,6 +26,7 @@ const AutoCompleteDepartment = ({ haveAll, haveNone, showArchived = false, + ...props }: AutoCompleteDepartmentProps): ReactElement | null => { const t = useTranslation(); const [departmentsFilter, setDepartmentsFilter] = useState(''); @@ -50,6 +51,7 @@ const AutoCompleteDepartment = ({ return ( { const [tooltipRoot] = useState(() => createAnchor('react-tooltip')); useEffect(() => (): void => deleteAnchor(tooltipRoot), [tooltipRoot]); - return createPortal(children, tooltipRoot); + return <>{createPortal(children, tooltipRoot)}; }; export default memo(TooltipPortal); diff --git a/apps/meteor/client/components/message/uikit/UiKitMessageBlock.tsx b/apps/meteor/client/components/message/uikit/UiKitMessageBlock.tsx index 22db3777518b..dbdd8f4e731b 100644 --- a/apps/meteor/client/components/message/uikit/UiKitMessageBlock.tsx +++ b/apps/meteor/client/components/message/uikit/UiKitMessageBlock.tsx @@ -2,7 +2,6 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; import { MessageBlock } from '@rocket.chat/fuselage'; import { UiKitComponent, UiKitMessage as UiKitMessageSurfaceRender, UiKitContext } from '@rocket.chat/fuselage-ui-kit'; import type { MessageSurfaceLayout } from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; import React from 'react'; import { useMessageBlockContextValue } from '../../../uikit/hooks/useMessageBlockContextValue'; @@ -14,7 +13,7 @@ type UiKitMessageBlockProps = { blocks: MessageSurfaceLayout; }; -const UiKitMessageBlock = ({ rid, mid, blocks }: UiKitMessageBlockProps): ReactElement => { +const UiKitMessageBlock = ({ rid, mid, blocks }: UiKitMessageBlockProps) => { const contextValue = useMessageBlockContextValue(rid, mid); return ( diff --git a/apps/meteor/client/components/modal/ModalPortal.tsx b/apps/meteor/client/components/modal/ModalPortal.tsx index 2b2b198462f5..577f89e72103 100644 --- a/apps/meteor/client/components/modal/ModalPortal.tsx +++ b/apps/meteor/client/components/modal/ModalPortal.tsx @@ -1,5 +1,5 @@ import type { ReactElement, ReactNode } from 'react'; -import { memo, useEffect, useState } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { createAnchor } from '../../lib/utils/createAnchor'; @@ -15,7 +15,7 @@ type ModalPortalProps = { const ModalPortal = ({ children }: ModalPortalProps): ReactElement => { const [modalRoot] = useState(() => createAnchor('modal-root')); useEffect(() => (): void => deleteAnchor(modalRoot), [modalRoot]); - return createPortal(children, modalRoot); + return <>{createPortal(children, modalRoot)}; }; export default memo(ModalPortal); diff --git a/apps/meteor/client/hooks/useAppTranslations.ts b/apps/meteor/client/hooks/useAppTranslations.ts deleted file mode 100644 index bf4f83e48d85..000000000000 --- a/apps/meteor/client/hooks/useAppTranslations.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { useDebouncedCallback } from '@rocket.chat/fuselage-hooks'; -import { useEndpoint, useSingleStream, useUserId } from '@rocket.chat/ui-contexts'; -import { useQuery, useQueryClient } from '@tanstack/react-query'; -import { useEffect } from 'react'; - -import { i18n } from '../../app/utils/lib/i18n'; -import { Utilities } from '../../ee/lib/misc/Utilities'; - -export const useAppTranslations = () => { - const queryClient = useQueryClient(); - - const apps = useSingleStream('apps'); - const uid = useUserId(); - - const getAppsLanguages = useEndpoint('GET', '/apps/languages'); - - const result = useQuery(['apps', 'translations'], () => getAppsLanguages(), { - staleTime: Infinity, - }); - - useEffect(() => { - if (result.data) { - result.data.apps.forEach(({ id, languages }) => { - loadAppI18nResources(id, languages); - }); - } - }, [result.data]); - - const invalidate = useDebouncedCallback( - () => { - queryClient.invalidateQueries(['apps', 'translations']); - }, - 100, - [], - ); - - useEffect(() => { - if (!uid) { - return; - } - - return apps('apps', ([key]) => { - if (['app/added'].includes(key)) { - invalidate(); - } - }); - }, [uid, apps, invalidate]); - - const loadAppI18nResources = ( - appId: string, - languages: { - [key: string]: { - Params: string; - Description: string; - Setting_Name: string; - Setting_Description: string; - }; - }, - ) => { - Object.entries(languages).forEach(([language, translations]) => { - const regex = /([a-z]{2,3})-([a-z]{2,4})/; - const match = regex.exec(language); - const normalizedLanguage = match ? `${match[1]}-${match[2].toUpperCase()}` : language; - - // Translations keys must be scoped under app id - const scopedTranslations = Object.entries(translations).reduce>((acc, [key, value]) => { - acc[Utilities.getI18nKeyForApp(key, appId)] = value; - return acc; - }, {}); - - i18n.addResourceBundle(normalizedLanguage, 'core', scopedTranslations); - }); - }; -}; diff --git a/apps/meteor/client/hooks/useIsEnterprise.ts b/apps/meteor/client/hooks/useIsEnterprise.ts index f91d754014c4..e2622d8b695d 100644 --- a/apps/meteor/client/hooks/useIsEnterprise.ts +++ b/apps/meteor/client/hooks/useIsEnterprise.ts @@ -1,13 +1,8 @@ import type { OperationResult } from '@rocket.chat/rest-typings'; -import { useEndpoint } from '@rocket.chat/ui-contexts'; import type { UseQueryResult } from '@tanstack/react-query'; -import { useQuery } from '@tanstack/react-query'; -export const useIsEnterprise = (): UseQueryResult> => { - const isEnterpriseEdition = useEndpoint('GET', '/v1/licenses.isEnterprise'); +import { useLicenseBase } from './useLicense'; - return useQuery(['licenses', 'isEnterprise'], () => isEnterpriseEdition(), { - keepPreviousData: true, - staleTime: Infinity, - }); +export const useIsEnterprise = (): UseQueryResult> => { + return useLicenseBase({ select: (data) => ({ isEnterprise: Boolean(data?.license.license) }) }); }; diff --git a/apps/meteor/client/hooks/useLicense.ts b/apps/meteor/client/hooks/useLicense.ts index 70f83e8f6187..bdf983061d66 100644 --- a/apps/meteor/client/hooks/useLicense.ts +++ b/apps/meteor/client/hooks/useLicense.ts @@ -5,7 +5,7 @@ import type { QueryClient, UseQueryResult } from '@tanstack/react-query'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useEffect } from 'react'; -type LicenseDataType = Awaited>['license']; +type LicenseDataType = Serialized>>; type LicenseParams = { loadValues?: boolean; @@ -18,12 +18,18 @@ const invalidateQueryClientLicenses = (() => { clearTimeout(timeout); timeout = setTimeout(() => { timeout = undefined; - queryClient.invalidateQueries(['licenses', 'getLicenses']); + queryClient.invalidateQueries(['licenses']); }, 5000); }; })(); -export const useLicense = (params?: LicenseParams): UseQueryResult> => { +export const useLicenseBase = ({ + params, + select, +}: { + params?: LicenseParams; + select: (data: LicenseDataType) => TData; +}) => { const uid = useUserId(); const getLicenses = useEndpoint('GET', '/v1/licenses.info'); @@ -34,32 +40,27 @@ export const useLicense = (params?: LicenseParams): UseQueryResult notify('license', () => invalidateQueries()), [notify, invalidateQueries]); - return useQuery(['licenses', 'getLicenses', params?.loadValues], () => getLicenses({ ...params }), { + return useQuery(['licenses', 'getLicenses', params], () => getLicenses({ ...params }), { staleTime: Infinity, keepPreviousData: true, - select: (data) => data.license, + select, enabled: !!uid, }); }; -export const useLicenseName = (params?: LicenseParams) => { - const getLicenses = useEndpoint('GET', '/v1/licenses.info'); - - const invalidateQueries = useInvalidateLicense(); - - const notify = useSingleStream('notify-all'); +export const useLicense = (params?: LicenseParams) => { + return useLicenseBase({ params, select: (data) => data.license }); +}; - useEffect(() => notify('license', () => invalidateQueries()), [notify, invalidateQueries]); +export const useHasLicense = (): UseQueryResult => { + return useLicenseBase({ select: (data) => Boolean(data.license) }); +}; - return useQuery(['licenses', 'getLicenses', params?.loadValues], () => getLicenses({ ...params }), { - staleTime: Infinity, - keepPreviousData: true, - select: (data) => data.license.tags?.map((tag) => tag.name).join(' ') ?? 'Community', - }); +export const useLicenseName = (params?: LicenseParams) => { + return useLicenseBase({ params, select: (data) => data?.license.tags?.map((tag) => tag.name).join(' ') || 'Community' }); }; export const useInvalidateLicense = () => { const queryClient = useQueryClient(); - return () => invalidateQueryClientLicenses(queryClient); }; diff --git a/apps/meteor/client/hooks/useTranslationsForApps.ts b/apps/meteor/client/hooks/useTranslationsForApps.ts new file mode 100644 index 000000000000..9cc4fd8c0991 --- /dev/null +++ b/apps/meteor/client/hooks/useTranslationsForApps.ts @@ -0,0 +1,58 @@ +import { normalizeLanguage } from '@rocket.chat/tools'; +import { useEndpoint, useSingleStream, useUserId } from '@rocket.chat/ui-contexts'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { withDebouncing } from '../../lib/utils/highOrderFunctions'; + +export const useTranslationsForApps = () => { + const getAppsLanguages = useEndpoint('GET', '/apps/languages'); + + const { isSuccess, data } = useQuery({ + queryKey: ['apps', 'translations'] as const, + queryFn: () => getAppsLanguages(), + staleTime: Infinity, + }); + + const { i18n } = useTranslation(); + + useEffect(() => { + if (!isSuccess) { + return; + } + + data.apps.forEach(({ id: appId, languages }) => { + Object.entries(languages).forEach(([language, translations]) => { + const normalizedLanguage = normalizeLanguage(language); + const namespace = `app-${appId}`; + i18n.addResourceBundle(normalizedLanguage, namespace, translations); + }); + }); + }, [i18n, data, isSuccess]); + + const queryClient = useQueryClient(); + const subscribeToApps = useSingleStream('apps'); + const uid = useUserId(); + + useEffect(() => { + if (!uid) { + return; + } + + const invalidate = withDebouncing({ wait: 100 })(() => { + queryClient.invalidateQueries(['apps', 'translations']); + }); + + const unsubscribe = subscribeToApps('apps', ([key]) => { + if (key === 'app/added') { + invalidate(); + } + }); + + return () => { + unsubscribe(); + invalidate.cancel(); + }; + }, [uid, subscribeToApps, queryClient]); +}; diff --git a/apps/meteor/client/lib/appLayout.tsx b/apps/meteor/client/lib/appLayout.tsx index 1c39e3dece10..3962a0f300cb 100644 --- a/apps/meteor/client/lib/appLayout.tsx +++ b/apps/meteor/client/lib/appLayout.tsx @@ -7,6 +7,7 @@ const BannerRegion = lazy(() => import('../views/banners/BannerRegion')); const PortalsWrapper = lazy(() => import('../views/root/PortalsWrapper')); const ModalRegion = lazy(() => import('../views/modal/ModalRegion')); const ActionManagerBusyState = lazy(() => import('../components/ActionManagerBusyState')); +const CloudAnnouncementsRegion = lazy(() => import('../views/cloud/CloudAnnouncementsRegion')); type AppLayoutDescriptor = ReactElement | null; @@ -23,10 +24,6 @@ class AppLayoutSubscription extends Emitter<{ update: void }> { } render(element: ReactElement): void { - this.setCurrentValue(this.wrap(element)); - } - - renderStandalone(element: ReactElement): void { this.setCurrentValue(element); } @@ -35,6 +32,7 @@ class AppLayoutSubscription extends Emitter<{ update: void }> { <> + {element} diff --git a/apps/meteor/client/lib/chats/ChatAPI.ts b/apps/meteor/client/lib/chats/ChatAPI.ts index 8242de07d791..36f40f404a4f 100644 --- a/apps/meteor/client/lib/chats/ChatAPI.ts +++ b/apps/meteor/client/lib/chats/ChatAPI.ts @@ -1,4 +1,5 @@ import type { IMessage, IRoom, ISubscription } from '@rocket.chat/core-typings'; +import type { IActionManager } from '@rocket.chat/ui-contexts'; import type { UIEvent } from 'react'; import type { FormattingButton } from '../../../app/ui-message/client/messageBox/messageBoxFormatting'; @@ -141,7 +142,7 @@ export type ChatAPI = { performContinuously(action: 'recording' | 'uploading' | 'playing'): void; }; - ActionManager: any; + ActionManager: IActionManager; readonly flows: { readonly uploadFiles: (files: readonly File[], resetFileInput?: () => void) => Promise; diff --git a/apps/meteor/client/lib/chats/flows/processSlashCommand.ts b/apps/meteor/client/lib/chats/flows/processSlashCommand.ts index c9922162a67c..52fa050c743f 100644 --- a/apps/meteor/client/lib/chats/flows/processSlashCommand.ts +++ b/apps/meteor/client/lib/chats/flows/processSlashCommand.ts @@ -4,7 +4,6 @@ import { escapeHTML } from '@rocket.chat/string-helpers'; import { hasAtLeastOnePermission } from '../../../../app/authorization/client'; import { settings } from '../../../../app/settings/client'; -import { actionManager } from '../../../../app/ui-message/client/ActionManager'; import { slashCommands } from '../../../../app/utils/client'; import { sdk } from '../../../../app/utils/client/lib/SDKClient'; import { t } from '../../../../app/utils/lib/i18n'; @@ -78,7 +77,7 @@ export const processSlashCommand = async (chat: ChatAPI, message: IMessage): Pro params: [{ eventName: 'slashCommandsStats', timestamp: Date.now(), command: commandName }], }); - const triggerId = actionManager.generateTriggerId(appId); + const triggerId = chat.ActionManager.generateTriggerId(appId); const data = { cmd: commandName, @@ -89,7 +88,7 @@ export const processSlashCommand = async (chat: ChatAPI, message: IMessage): Pro try { if (appId) { - chat.ActionManager.events.emit('busy', { busy: true }); + chat.ActionManager.notifyBusy(); } const result = await sdk.call('slashCommand', { cmd: commandName, params, msg: message, triggerId }); @@ -101,7 +100,7 @@ export const processSlashCommand = async (chat: ChatAPI, message: IMessage): Pro } if (appId) { - chat.ActionManager.events.emit('busy', { busy: false }); + chat.ActionManager.notifyIdle(); } return true; diff --git a/apps/meteor/client/lib/utils/isOverLicenseLimits.ts b/apps/meteor/client/lib/utils/isOverLicenseLimits.ts index 3bb8d1d50dbf..e2978a2d4c28 100644 --- a/apps/meteor/client/lib/utils/isOverLicenseLimits.ts +++ b/apps/meteor/client/lib/utils/isOverLicenseLimits.ts @@ -9,4 +9,4 @@ type Limits = Record< >; export const isOverLicenseLimits = (limits: Limits): boolean => - Object.values(limits).some((limit) => limit.value !== undefined && limit.value > limit.max); + Object.values(limits).some((limit) => limit.value !== undefined && limit.max !== -1 && limit.value > limit.max); diff --git a/apps/meteor/client/portals/VideoConfPopupPortal.ts b/apps/meteor/client/portals/VideoConfPopupPortal.tsx similarity index 82% rename from apps/meteor/client/portals/VideoConfPopupPortal.ts rename to apps/meteor/client/portals/VideoConfPopupPortal.tsx index 5e4f22612c62..b1c0746e93e2 100644 --- a/apps/meteor/client/portals/VideoConfPopupPortal.ts +++ b/apps/meteor/client/portals/VideoConfPopupPortal.tsx @@ -1,5 +1,5 @@ import type { ReactElement, ReactNode } from 'react'; -import { memo, useEffect, useState } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { createAnchor } from '../lib/utils/createAnchor'; @@ -12,7 +12,7 @@ type VideoConfPortalProps = { const VideoConfPortal = ({ children }: VideoConfPortalProps): ReactElement => { const [videoConfRoot] = useState(() => createAnchor('video-conf-root')); useEffect(() => (): void => deleteAnchor(videoConfRoot), [videoConfRoot]); - return createPortal(children, videoConfRoot); + return <>{createPortal(children, videoConfRoot)}; }; export default memo(VideoConfPortal); diff --git a/apps/meteor/client/providers/ActionManagerProvider.tsx b/apps/meteor/client/providers/ActionManagerProvider.tsx index e8961ec357e9..7305a4b1a674 100644 --- a/apps/meteor/client/providers/ActionManagerProvider.tsx +++ b/apps/meteor/client/providers/ActionManagerProvider.tsx @@ -1,19 +1,22 @@ -import { ActionManagerContext } from '@rocket.chat/ui-contexts'; +import { ActionManagerContext, useRouter } from '@rocket.chat/ui-contexts'; import type { ReactNode, ReactElement } from 'react'; import React from 'react'; -import { actionManager } from '../../app/ui-message/client/ActionManager'; +import { ActionManager } from '../../app/ui-message/client/ActionManager'; import { useAppActionButtons } from '../hooks/useAppActionButtons'; import { useAppSlashCommands } from '../hooks/useAppSlashCommands'; -import { useAppTranslations } from '../hooks/useAppTranslations'; import { useAppUiKitInteraction } from '../hooks/useAppUiKitInteraction'; +import { useTranslationsForApps } from '../hooks/useTranslationsForApps'; +import { useInstance } from '../views/room/providers/hooks/useInstance'; type ActionManagerProviderProps = { children?: ReactNode; }; const ActionManagerProvider = ({ children }: ActionManagerProviderProps): ReactElement => { - useAppTranslations(); + const router = useRouter(); + const actionManager = useInstance(() => [new ActionManager(router)], [router]); + useTranslationsForApps(); useAppActionButtons(); useAppSlashCommands(); useAppUiKitInteraction(actionManager.handleServerInteraction.bind(actionManager)); diff --git a/apps/meteor/client/providers/AppsProvider.tsx b/apps/meteor/client/providers/AppsProvider.tsx index 45ea9eadec29..bb35c01c4ae2 100644 --- a/apps/meteor/client/providers/AppsProvider.tsx +++ b/apps/meteor/client/providers/AppsProvider.tsx @@ -6,6 +6,8 @@ import React, { useEffect } from 'react'; import { AppClientOrchestratorInstance } from '../../ee/client/apps/orchestrator'; import { AppsContext } from '../contexts/AppsContext'; +import { useIsEnterprise } from '../hooks/useIsEnterprise'; +import { useInvalidateLicense } from '../hooks/useLicense'; import { AsyncStatePhase } from '../lib/asyncState'; import { useInvalidateAppsCountQueryCallback } from '../views/marketplace/hooks/useAppsCountQuery'; import type { App } from '../views/marketplace/types'; @@ -17,7 +19,11 @@ const AppsProvider: FC = ({ children }) => { const queryClient = useQueryClient(); + const { data } = useIsEnterprise(); + const isEnterprise = !!data?.isEnterprise; + const invalidateAppsCountQuery = useInvalidateAppsCountQueryCallback(); + const invalidateLicenseQuery = useInvalidateLicense(); const stream = useSingleStream('apps'); @@ -35,8 +41,11 @@ const AppsProvider: FC = ({ children }) => { if (['app/added', 'app/removed', 'app/updated', 'app/statusUpdate', 'app/settingUpdated'].includes(key)) { invalidate(); } + if (['app/added', 'app/removed'].includes(key) && !isEnterprise) { + invalidateLicenseQuery(); + } }); - }, [invalidate, stream]); + }, [invalidate, invalidateLicenseQuery, isEnterprise, stream]); const marketplace = useQuery( ['marketplace', 'apps-marketplace', isAdminUser], diff --git a/apps/meteor/client/providers/RouterProvider.tsx b/apps/meteor/client/providers/RouterProvider.tsx index 0f146ec83128..4f0aab3a602b 100644 --- a/apps/meteor/client/providers/RouterProvider.tsx +++ b/apps/meteor/client/providers/RouterProvider.tsx @@ -131,7 +131,7 @@ const defineRoutes = (routes: RouteObject[]) => { const flowRoutes = routes.map((route) => { if (route.path === '*') { FlowRouter.notFound = { - action: () => appLayout.renderStandalone(<>{route.element}), + action: () => appLayout.render(<>{route.element}), }; return FlowRouter.notFound; @@ -139,7 +139,7 @@ const defineRoutes = (routes: RouteObject[]) => { return FlowRouter.route(route.path, { name: route.id, - action: () => appLayout.renderStandalone(<>{route.element}), + action: () => appLayout.render(<>{route.element}), }); }); @@ -156,7 +156,7 @@ const defineRoutes = (routes: RouteObject[]) => { delete FlowRouter._routesMap[flowRoute.name]; } else { FlowRouter.notFound = { - action: () => appLayout.renderStandalone(<>), + action: () => appLayout.render(<>), }; } }); diff --git a/apps/meteor/client/providers/TranslationProvider.tsx b/apps/meteor/client/providers/TranslationProvider.tsx index 2cf47066c4e4..f9fdf299a5d6 100644 --- a/apps/meteor/client/providers/TranslationProvider.tsx +++ b/apps/meteor/client/providers/TranslationProvider.tsx @@ -1,6 +1,7 @@ import { useLocalStorage, useMutableCallback } from '@rocket.chat/fuselage-hooks'; import languages from '@rocket.chat/i18n/dist/languages'; import en from '@rocket.chat/i18n/src/locales/en.i18n.json'; +import { normalizeLanguage } from '@rocket.chat/tools'; import type { TranslationKey, TranslationContextValue } from '@rocket.chat/ui-contexts'; import { useMethod, useSetting, TranslationContext } from '@rocket.chat/ui-contexts'; import type i18next from 'i18next'; @@ -16,7 +17,6 @@ import { getURL } from '../../app/utils/client'; import { i18n, addSprinfToI18n } from '../../app/utils/lib/i18n'; import { AppClientOrchestratorInstance } from '../../ee/client/apps/orchestrator'; import { applyCustomTranslations } from '../lib/utils/applyCustomTranslations'; -import { filterLanguage } from '../lib/utils/filterLanguage'; import { isRTLScriptLanguage } from '../lib/utils/isRTLScriptLanguage'; i18n.use(I18NextHttpBackend).use(initReactI18next).use(sprintf); @@ -180,7 +180,7 @@ type TranslationProviderProps = { const useAutoLanguage = () => { const serverLanguage = useSetting('Language'); - const browserLanguage = filterLanguage(window.navigator.userLanguage ?? window.navigator.language); + const browserLanguage = normalizeLanguage(window.navigator.userLanguage ?? window.navigator.language); const defaultUserLanguage = browserLanguage || serverLanguage || 'en'; // if the language is supported, if not remove the region diff --git a/apps/meteor/client/sidebar/SidebarPortal.tsx b/apps/meteor/client/sidebar/SidebarPortal.tsx index 2b6594d11561..59856df71773 100644 --- a/apps/meteor/client/sidebar/SidebarPortal.tsx +++ b/apps/meteor/client/sidebar/SidebarPortal.tsx @@ -10,7 +10,7 @@ const SidebarPortal: FC = ({ children }) => { return null; } - return createPortal({children}, sidebarRoot); + return <>{createPortal({children}, sidebarRoot)}; }; export default memo(SidebarPortal); diff --git a/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.spec.tsx b/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.spec.tsx index a5a280262bd4..95d2d219bc14 100644 --- a/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.spec.tsx +++ b/apps/meteor/client/sidebar/header/actions/hooks/useAuditItems.spec.tsx @@ -6,7 +6,12 @@ import { useAuditItems } from './useAuditItems'; it('should return an empty array if doesn`t have license', async () => { const { result, waitFor } = renderHook(() => useAuditItems(), { wrapper: mockAppRoot() - .withMethod('license:getModules', () => []) + .withEndpoint('GET', '/v1/licenses.info', () => ({ + // @ts-expect-error: just for testing + license: { + activeModules: [], + }, + })) .withJohnDoe() .withPermission('can-audit') .withPermission('can-audit-log') @@ -21,6 +26,16 @@ it('should return an empty array if doesn`t have license', async () => { it('should return an empty array if have license and not have permissions', async () => { const { result, waitFor } = renderHook(() => useAuditItems(), { wrapper: mockAppRoot() + .withEndpoint('GET', '/v1/licenses.info', () => ({ + license: { + license: { + // @ts-expect-error: just for testing + grantedModules: [{ module: 'auditing' }], + }, + // @ts-expect-error: just for testing + activeModules: ['auditing'], + }, + })) .withMethod('license:getModules', () => ['auditing']) .withJohnDoe() .build(), @@ -34,7 +49,16 @@ it('should return an empty array if have license and not have permissions', asyn it('should return auditItems if have license and permissions', async () => { const { result, waitFor } = renderHook(() => useAuditItems(), { wrapper: mockAppRoot() - .withMethod('license:getModules', () => ['auditing']) + .withEndpoint('GET', '/v1/licenses.info', () => ({ + license: { + license: { + // @ts-expect-error: just for testing + grantedModules: [{ module: 'auditing' }], + }, + // @ts-expect-error: just for testing + activeModules: ['auditing'], + }, + })) .withJohnDoe() .withPermission('can-audit') .withPermission('can-audit-log') @@ -59,7 +83,16 @@ it('should return auditItems if have license and permissions', async () => { it('should return auditMessages item if have license and can-audit permission', async () => { const { result, waitFor } = renderHook(() => useAuditItems(), { wrapper: mockAppRoot() - .withMethod('license:getModules', () => ['auditing']) + .withEndpoint('GET', '/v1/licenses.info', () => ({ + license: { + license: { + // @ts-expect-error: just for testing + grantedModules: [{ module: 'auditing' }], + }, + // @ts-expect-error: just for testing + activeModules: ['auditing'], + }, + })) .withJohnDoe() .withPermission('can-audit') .build(), @@ -77,7 +110,16 @@ it('should return auditMessages item if have license and can-audit permission', it('should return audiLogs item if have license and can-audit-log permission', async () => { const { result, waitFor } = renderHook(() => useAuditItems(), { wrapper: mockAppRoot() - .withMethod('license:getModules', () => ['auditing']) + .withEndpoint('GET', '/v1/licenses.info', () => ({ + license: { + license: { + // @ts-expect-error: just for testing + grantedModules: [{ module: 'auditing' }], + }, + // @ts-expect-error: just for testing + activeModules: ['auditing'], + }, + })) .withJohnDoe() .withPermission('can-audit-log') .build(), diff --git a/apps/meteor/client/sidebar/search/SearchList.tsx b/apps/meteor/client/sidebar/search/SearchList.tsx index 85718146b3e6..e63be149cc7d 100644 --- a/apps/meteor/client/sidebar/search/SearchList.tsx +++ b/apps/meteor/client/sidebar/search/SearchList.tsx @@ -55,7 +55,7 @@ const shortcut = ((): string => { if (window.navigator.platform.toLowerCase().includes('mac')) { return '(\u2318+K)'; } - return '(\u2303+K)'; + return '(Ctrl+K)'; })(); const LIMIT = parseInt(String(getConfig('Sidebar_Search_Spotlight_LIMIT', 20))); diff --git a/apps/meteor/client/startup/UserDeleted.ts b/apps/meteor/client/startup/UserDeleted.ts index 0e7b75bf4efa..bbaeb6bc0229 100644 --- a/apps/meteor/client/startup/UserDeleted.ts +++ b/apps/meteor/client/startup/UserDeleted.ts @@ -4,7 +4,23 @@ import { ChatMessage } from '../../app/models/client'; import { Notifications } from '../../app/notifications/client'; Meteor.startup(() => { - Notifications.onLogged('Users:Deleted', ({ userId }) => { + Notifications.onLogged('Users:Deleted', ({ userId, messageErasureType, replaceByUser }) => { + if (messageErasureType === 'Unlink' && replaceByUser) { + return ChatMessage.update( + { + 'u._id': userId, + }, + { + $set: { + 'alias': replaceByUser.alias, + 'u._id': replaceByUser._id, + 'u.username': replaceByUser.username, + 'u.name': undefined, + }, + }, + { multi: true }, + ); + } ChatMessage.remove({ 'u._id': userId, }); diff --git a/apps/meteor/client/startup/actionButtons/index.ts b/apps/meteor/client/startup/actionButtons/index.ts index 18aede35b215..97ccf359d567 100644 --- a/apps/meteor/client/startup/actionButtons/index.ts +++ b/apps/meteor/client/startup/actionButtons/index.ts @@ -5,7 +5,6 @@ import './jumpToStarMessage'; import './permalinkPinned'; import './permalinkStar'; import './pinMessage'; -import './readReceipt'; import './starMessage'; import './unpinMessage'; import './unstarMessage'; diff --git a/apps/meteor/client/startup/actionButtons/readReceipt.ts b/apps/meteor/client/startup/actionButtons/readReceipt.ts deleted file mode 100644 index cd215c84f107..000000000000 --- a/apps/meteor/client/startup/actionButtons/readReceipt.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Tracker } from 'meteor/tracker'; - -import { settings } from '../../../app/settings/client'; -import { MessageAction } from '../../../app/ui-utils/client'; -import { imperativeModal } from '../../lib/imperativeModal'; -import { messageArgs } from '../../lib/utils/messageArgs'; -import ReadReceiptsModal from '../../views/room/modals/ReadReceiptsModal'; - -Meteor.startup(() => { - Tracker.autorun(() => { - const enabled = settings.get('Message_Read_Receipt_Store_Users'); - - if (!enabled) { - return MessageAction.removeButton('receipt-detail'); - } - - MessageAction.addButton({ - id: 'receipt-detail', - icon: 'info-circled', - label: 'Info', - context: ['starred', 'message', 'message-mobile', 'threads', 'videoconf', 'videoconf-threads'], - type: 'duplication', - action(_, props) { - const { message = messageArgs(this).msg } = props; - imperativeModal.open({ - component: ReadReceiptsModal, - props: { messageId: message._id, onClose: imperativeModal.close }, - }); - }, - order: 10, - group: 'menu', - }); - }); -}); diff --git a/apps/meteor/client/startup/startup.ts b/apps/meteor/client/startup/startup.ts index 6b2b66ec69d7..2541529a1aef 100644 --- a/apps/meteor/client/startup/startup.ts +++ b/apps/meteor/client/startup/startup.ts @@ -5,14 +5,11 @@ import { Session } from 'meteor/session'; import { Tracker } from 'meteor/tracker'; import moment from 'moment'; -import { hasPermission } from '../../app/authorization/client'; import { register } from '../../app/markdown/lib/hljs'; import { settings } from '../../app/settings/client'; import { getUserPreference } from '../../app/utils/client'; import 'hljs9/styles/github.css'; import { sdk } from '../../app/utils/client/lib/SDKClient'; -import { t } from '../../app/utils/lib/i18n'; -import * as banners from '../lib/banners'; import { synchronizeUserData, removeLocalUserData } from '../lib/userData'; import { fireGlobalEvent } from '../lib/utils/fireGlobalEvent'; @@ -60,31 +57,6 @@ Meteor.startup(() => { fireGlobalEvent('status-changed', status); } }); - - Tracker.autorun(async (c) => { - const uid = Meteor.userId(); - if (!uid) { - return; - } - - if (!hasPermission('manage-cloud')) { - return; - } - - const { - registrationStatus: { workspaceRegistered }, - } = await sdk.rest.get('/v1/cloud.registrationStatus'); - c.stop(); - - if (workspaceRegistered !== true) { - banners.open({ - id: 'cloud-registration', - title: () => t('Cloud_registration_pending_title'), - html: () => t('Cloud_registration_pending_html'), - modifiers: ['large', 'danger'], - }); - } - }); }); Meteor.startup(() => { Tracker.autorun(() => { diff --git a/apps/meteor/client/views/account/preferences/PreferencesNotificationsSection.tsx b/apps/meteor/client/views/account/preferences/PreferencesNotificationsSection.tsx index 2643eab0ebc7..1dfcdf917c2d 100644 --- a/apps/meteor/client/views/account/preferences/PreferencesNotificationsSection.tsx +++ b/apps/meteor/client/views/account/preferences/PreferencesNotificationsSection.tsx @@ -1,3 +1,4 @@ +import type { INotificationDesktop } from '@rocket.chat/core-typings'; import type { SelectOption } from '@rocket.chat/fuselage'; import { Accordion, Field, FieldLabel, FieldRow, FieldHint, Select, FieldGroup, ToggleSwitch, Button, Box } from '@rocket.chat/fuselage'; import { useUniqueId } from '@rocket.chat/fuselage-hooks'; @@ -45,7 +46,7 @@ const PreferencesNotificationsSection = () => { const onSendNotification = useCallback(() => { KonchatNotification.notify({ - payload: { sender: { _id: 'rocket.cat', username: 'rocket.cat' } }, + payload: { sender: { _id: 'rocket.cat', username: 'rocket.cat' }, rid: 'GENERAL' } as INotificationDesktop['payload'], title: t('Desktop_Notification_Test'), text: t('This_is_a_desktop_notification'), }); diff --git a/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx b/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx index d82bb6cd3d28..8982492bb4a8 100644 --- a/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx +++ b/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx @@ -62,13 +62,12 @@ export const SubscriptionCalloutLimits = () => { const map = (key: keyof typeof limits) => t(`subscription.callout.${key}`); - const handleClick = (e: React.MouseEvent) => { + const handleClick = (params: Record) => (e: React.MouseEvent) => { e.preventDefault(); if (mutation.isLoading) { return; } - - mutation.mutate(); + mutation.mutate(params); }; return ( @@ -77,7 +76,14 @@ export const SubscriptionCalloutLimits = () => { Your workspace reached the <>{{ val: start_fair_policy.map(map) }} limit. - + Manage your subscription to increase limits. @@ -88,7 +94,14 @@ export const SubscriptionCalloutLimits = () => { Your workspace exceeded the <>{{ val: prevent_action.map(map) }} license limit. - + Manage your subscription to increase limits. @@ -100,9 +113,16 @@ export const SubscriptionCalloutLimits = () => { Your workspace exceeded the <>{{ val: disable_modules.map(map) }} license limit. - + Manage your subscription - {' '} + to increase limits. @@ -112,7 +132,14 @@ export const SubscriptionCalloutLimits = () => { Your workspace exceeded the <>{{ val: invalidate_license.map(map) }} license limit. - + Manage your subscription to increase limits. diff --git a/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx b/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx index fdaf1e5467f5..e6b03b0237a4 100644 --- a/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx +++ b/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx @@ -1,11 +1,11 @@ import { Box, Button, ButtonGroup, Callout, Grid, Throbber } from '@rocket.chat/fuselage'; import { useRouter } from '@rocket.chat/ui-contexts'; import { t } from 'i18next'; -import React, { memo, useEffect } from 'react'; +import React, { memo, useCallback, useEffect } from 'react'; import Page from '../../../components/Page'; import { useIsEnterprise } from '../../../hooks/useIsEnterprise'; -import { useLicense } from '../../../hooks/useLicense'; +import { useInvalidateLicense, useLicense } from '../../../hooks/useLicense'; import { useRegistrationStatus } from '../../../hooks/useRegistrationStatus'; import { SubscriptionCalloutLimits } from './SubscriptionCalloutLimits'; import SubscriptionPageSkeleton from './SubscriptionPageSkeleton'; @@ -27,8 +27,9 @@ const SubscriptionPage = () => { const router = useRouter(); const { data: enterpriseData } = useIsEnterprise(); const { isRegistered } = useRegistrationStatus(); - const { data: licensesData, isLoading: isLicenseLoading, refetch: refetchLicense } = useLicense({ loadValues: true }); + const { data: licensesData, isLoading: isLicenseLoading } = useLicense({ loadValues: true }); const syncLicenseUpdate = useWorkspaceSync(); + const invalidateLicenseQuery = useInvalidateLicense(); const { subscriptionSuccess } = router.getSearchParameters(); @@ -46,24 +47,17 @@ const SubscriptionPage = () => { const macLimit = getKeyLimit('monthlyActiveContacts'); const seatsLimit = getKeyLimit('activeUsers'); - const handleSyncLicenseUpdateClick = () => { - syncLicenseUpdate.mutate(); - }; + const handleSyncLicenseUpdate = useCallback(() => { + syncLicenseUpdate.mutate(undefined, { + onSuccess: () => invalidateLicenseQuery(), + }); + }, [invalidateLicenseQuery, syncLicenseUpdate]); useEffect(() => { if (subscriptionSuccess && syncLicenseUpdate.isIdle) { - syncLicenseUpdate.mutate(undefined, { - onSuccess: () => - router.navigate( - { - name: router.getRouteName()!, - params: Object.fromEntries(Object.entries(router.getSearchParameters()).filter(([key]) => key !== 'subscriptionSuccess')), - }, - { replace: true }, - ), - }); + handleSyncLicenseUpdate(); } - }, [refetchLicense, router, subscriptionSuccess, syncLicenseUpdate]); + }, [handleSyncLicenseUpdate, subscriptionSuccess, syncLicenseUpdate]); return ( @@ -73,12 +67,12 @@ const SubscriptionPage = () => { )} - + {t(isEnterprise ? 'Manage_subscription' : 'Upgrade')} @@ -111,7 +105,7 @@ const SubscriptionPage = () => { {seatsLimit.value !== undefined && ( {seatsLimit.max !== Infinity ? ( - + ) : ( )} @@ -121,7 +115,7 @@ const SubscriptionPage = () => { {macLimit.value !== undefined && ( {macLimit.max !== Infinity ? ( - + ) : ( )} diff --git a/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx b/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx index eca4b58695de..bcde39d701fd 100644 --- a/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx @@ -3,7 +3,6 @@ import type { ReactElement, ReactNode } from 'react'; import React, { memo } from 'react'; import InfoTextIconModal from './InfoTextIconModal'; -import UpgradeButton from './UpgradeButton'; type FeatureUsageCardProps = { children?: ReactNode; @@ -13,11 +12,11 @@ type FeatureUsageCardProps = { export type CardProps = { title: string; infoText?: string; - upgradeButtonText?: string; + upgradeButton?: ReactNode; }; const FeatureUsageCard = ({ children, card }: FeatureUsageCardProps): ReactElement => { - const { title, infoText, upgradeButtonText } = card; + const { title, infoText, upgradeButton } = card; return ( @@ -28,11 +27,7 @@ const FeatureUsageCard = ({ children, card }: FeatureUsageCardProps): ReactEleme {children} - {upgradeButtonText && ( - - {upgradeButtonText} - - )} + {upgradeButton && {upgradeButton}} ); }; diff --git a/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx b/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx index e6a89240b73d..7c28094ff58a 100644 --- a/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx +++ b/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx @@ -5,7 +5,15 @@ import React, { memo } from 'react'; import { useCheckoutUrlAction } from '../hooks/useCheckoutUrl'; -const UpgradeButton = ({ children, ...props }: Partial): ReactElement => { +const UpgradeButton = ({ + children, + target = '_blank', + action, + ...props +}: Partial & { + target: string; + action: string; +}): ReactElement => { const mutation = useCheckoutUrlAction(); const handleBtnClick = () => { @@ -13,7 +21,10 @@ const UpgradeButton = ({ children, ...props }: Partial): ReactEleme return; } - mutation.mutate(); + mutation.mutate({ + target, + action, + }); }; return ( diff --git a/apps/meteor/client/views/admin/subscription/components/UsagePieGraph.tsx b/apps/meteor/client/views/admin/subscription/components/UsagePieGraph.tsx index af5d4b673410..143f85bd34e6 100644 --- a/apps/meteor/client/views/admin/subscription/components/UsagePieGraph.tsx +++ b/apps/meteor/client/views/admin/subscription/components/UsagePieGraph.tsx @@ -87,9 +87,11 @@ const UsagePieGraph = ({ used = 0, total = 0, label, color, size = 140 }: UsageP {used} / {unlimited ? '∞' : total} - - {label} - + {label && ( + + {label} + + )} ); }; diff --git a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx index 74f50474f7ec..fbd850f262ba 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx @@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next'; import { useActiveConnections } from '../../../../hooks/useActiveConnections'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; const getLimits = ({ max, current }: { max: number; current: number }) => { const total = max || 0; @@ -30,6 +31,7 @@ const ActiveSessionsCard = (): ReactElement => { title: t('ActiveSessions'), infoText: t('ActiveSessions_InfoText'), }; + if (result.isLoading || result.isError) { return ( @@ -45,7 +47,11 @@ const ActiveSessionsCard = (): ReactElement => { card={{ ...card, ...(exceedLimit && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }} > diff --git a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx index 7015e5b93145..f62ec2ad164c 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx @@ -7,6 +7,7 @@ import { useFormatDate } from '../../../../../hooks/useFormatDate'; import { useStatistics } from '../../../../hooks/useStatistics'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; const ActiveSessionsPeakCard = (): ReactElement => { const { t } = useTranslation(); @@ -24,13 +25,17 @@ const ActiveSessionsPeakCard = (): ReactElement => { title: t('ActiveSessionsPeak'), infoText: t('ActiveSessionsPeak_InfoText'), ...(exceedLimit && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }; return ( - {!isLoading && maxMonthlyPeakConnections ? ( + {!isLoading && maxMonthlyPeakConnections !== undefined ? ( {used} / {total} diff --git a/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx index a8d3891c8570..0043e12d02d1 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; type AppsUsageCardProps = { privateAppsLimit?: { value?: number; max: number }; @@ -26,7 +27,11 @@ const AppsUsageCard = ({ privateAppsLimit, marketplaceAppsLimit }: AppsUsageCard title: t('Apps'), infoText: t('Apps_InfoText'), ...((marketplaceAppsPercentage || 0) >= 80 && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }; diff --git a/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx index 4c4232034ce8..e22231294fae 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx @@ -5,9 +5,18 @@ import { useTranslation } from 'react-i18next'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; import UsagePieGraph from '../UsagePieGraph'; -const MACCard = ({ value = 0, max }: { value: number; max: number }): ReactElement => { +const MACCard = ({ + value = 0, + max, + hideManageSubscription, +}: { + value: number; + max: number; + hideManageSubscription?: boolean; +}): ReactElement => { const { t } = useTranslation(); const pieGraph = { @@ -22,15 +31,26 @@ const MACCard = ({ value = 0, max }: { value: number; max: number }): ReactEleme const card: CardProps = { title: t('Monthly_active_contacts'), infoText: t('MAC_InfoText'), - upgradeButtonText: t('Buy_more'), - ...(nearLimit && { - upgradeButtonText: t('Upgrade'), + ...(hideManageSubscription && { + upgradeButton: ( + + {t('Buy_more')} + + ), + + ...(nearLimit && { + upgradeButton: ( + + {t('Upgrade')} + + ), + }), }), }; const color = nearLimit ? Palette.statusColor['status-font-on-danger'].toString() : undefined; - const message = macLeft > 0 ? t('MAC_Available', { macLeft }) : t('MAC_Required', { macRequired: -macLeft }); + const message = macLeft > 0 ? t('MAC_Available', { macLeft }) : undefined; return ( diff --git a/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardPremium.tsx b/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardPremium.tsx index de298c10e43a..d829cd4affc2 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardPremium.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardPremium.tsx @@ -44,18 +44,20 @@ const PlanCardPremium = ({ licenseInformation, licenseLimits }: PlanCardProps): {licenseLimits?.activeUsers.max !== Infinity && licenseLimits?.monthlyActiveContacts.max === Infinity && t('Unlimited_MACs')} ))} - - - - {isAutoRenew ? ( - t('Renews_DATE', { date: formatDate(visualExpiration) }) - ) : ( - - Contact sales to check plan renew date. - - )} + {visualExpiration && ( + + + + {isAutoRenew ? ( + t('Renews_DATE', { date: formatDate(visualExpiration) }) + ) : ( + + Contact sales to check plan renew date. + + )} + - + )} {!isLoading ? ( {isSelfHosted ? t('Self_managed_hosting') : t('Cloud_hosting')} diff --git a/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx b/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx index 38005bbef870..f1d3001bd508 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx @@ -22,14 +22,15 @@ const PlanCardTrial = ({ licenseInformation }: PlanCardProps): ReactElement => { const isSalesAssisted = licenseInformation.grantedBy?.method !== 'self-service' || true; const { visualExpiration } = licenseInformation; - const trialDaysLeft = differenceInDays(new Date(visualExpiration), new Date()); - return ( - - {t('Trial_active')} {t('n_days_left', { n: trialDaysLeft })} - + {visualExpiration && ( + + {t('Trial_active')}{' '} + {t('n_days_left', { n: differenceInDays(new Date(visualExpiration), new Date()) })} + + )} {isSalesAssisted ? ( @@ -48,7 +49,7 @@ const PlanCardTrial = ({ licenseInformation }: PlanCardProps): ReactElement => { - + {isSalesAssisted ? t('Finish_purchase') : t('Contact_sales')} diff --git a/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx index 90b9a0d43029..34a58fb1791c 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx @@ -5,14 +5,16 @@ import { useTranslation } from 'react-i18next'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; import UsagePieGraph from '../UsagePieGraph'; type SeatsCardProps = { value: number; max: number; + hideManageSubscription?: boolean; }; -const SeatsCard = ({ value, max }: SeatsCardProps): ReactElement => { +const SeatsCard = ({ value, max, hideManageSubscription }: SeatsCardProps): ReactElement => { const { t } = useTranslation(); const pieGraph = { @@ -25,15 +27,20 @@ const SeatsCard = ({ value, max }: SeatsCardProps): ReactElement => { const card: CardProps = { title: t('Seats'), infoText: t('Seats_InfoText'), - ...(nearLimit && { - upgradeButtonText: t('Buy_more'), - }), + ...(hideManageSubscription && + nearLimit && { + upgradeButton: ( + + {t('Buy_more')} + + ), + }), }; const seatsLeft = pieGraph.total - pieGraph.used; const color = pieGraph.used / pieGraph.total >= 0.8 ? Palette.statusColor['status-font-on-danger'].toString() : undefined; - const message = seatsLeft > 0 ? t('Seats_Available', { seatsLeft }) : t('Seats_Required', { seatsRequired: -seatsLeft }); + const message = seatsLeft > 0 ? t('Seats_Available', { seatsLeft }) : undefined; return ( diff --git a/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts b/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts index 56ef0396e93e..e4ea7ef042bd 100644 --- a/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts +++ b/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts @@ -9,12 +9,29 @@ export const useCheckoutUrlAction = () => { const handleExternalLink = useExternalLink(); return useMutation({ - mutationFn: async () => { + mutationFn: async (extraData?: Record) => { const { url } = await getCheckoutUrl(); - handleExternalLink(url); + + const extraUrlParams = new URL(url); + + if (extraData) { + Object.entries(extraData).forEach(([key, value]) => { + extraUrlParams.searchParams.append(key, value.toString()); + }); + } + + handleExternalLink(extraUrlParams.toString()); }, - onError: () => { - handleExternalLink(CONTACT_SALES_LINK); + onError: (_e, extraData) => { + const extraUrlParams = new URL(CONTACT_SALES_LINK); + + if (extraData) { + Object.entries(extraData).forEach(([key, value]) => { + extraUrlParams.searchParams.append(key, value.toString()); + }); + } + + handleExternalLink(extraUrlParams.toString()); }, }); }; diff --git a/apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx b/apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx index d318d15bf516..3af049a25809 100644 --- a/apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx +++ b/apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx @@ -29,22 +29,6 @@ type VersionCardProps = { serverInfo: IWorkspaceInfo; }; -const getVersionStatus = (serverVersion: string, versions: { version: string }[]): VersionStatus => { - const coercedServerVersion = String(semver.coerce(serverVersion)); - const highestVersion = versions.reduce((prev, current) => (prev.version > current.version ? prev : current)); - const isSupported = versions.some((v) => v.version === coercedServerVersion || v.version === serverVersion); - - if (semver.gte(coercedServerVersion, highestVersion.version)) { - return 'latest'; - } - - if (isSupported && semver.gt(highestVersion.version, coercedServerVersion)) { - return 'available_version'; - } - - return 'outdated'; -}; - const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { const mediaQuery = useMediaQuery('(min-width: 1024px)'); @@ -62,29 +46,31 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { const formatDate = useFormatDate(); - const { data: licenseData, isLoading, refetch: refetchLicense } = useLicense(); + const { data: licenseData, isLoading, refetch: refetchLicense } = useLicense({ loadValues: true }); const { isRegistered } = useRegistrationStatus(); const { license, limits } = licenseData || {}; const isAirgapped = license?.information?.offline; const licenseName = useLicenseName(); - const visualExpiration = formatDate(license?.information?.visualExpiration || ''); const serverVersion = serverInfo.version; - const supportedVersions = useMemo( - () => decodeBase64(serverInfo?.supportedVersions?.signed || ''), - [serverInfo?.supportedVersions?.signed], - ); + const { versionStatus, versions } = useMemo(() => { + const supportedVersions = serverInfo?.supportedVersions?.signed ? decodeBase64(serverInfo?.supportedVersions?.signed) : undefined; - const isOverLimits = limits && isOverLicenseLimits(limits); - - const versionStatus = useMemo(() => { - if (!supportedVersions.versions) { - return; + if (!supportedVersions) { + return {}; } - return getVersionStatus(serverVersion, supportedVersions.versions); - }, [serverVersion, supportedVersions.versions]); + + const versionStatus = getVersionStatus(serverVersion, supportedVersions?.versions); + + return { + versionStatus, + versions: supportedVersions?.versions, + }; + }, [serverInfo?.supportedVersions?.signed, serverVersion]); + + const isOverLimits = limits && isOverLicenseLimits(limits); const actionButton: | undefined @@ -109,7 +95,7 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { }; } - if (versionStatus === 'outdated') { + if (versionStatus?.label === 'outdated') { return { action: () => { window.open(RELEASES_EXTERNAL_LINK, '_blank'); @@ -137,7 +123,7 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { icon: 'check', label: t('Operating_withing_plan_limits'), }, - isAirgapped && { + (isAirgapped || !versions) && { type: 'neutral', icon: 'warning', label: ( @@ -149,28 +135,28 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { ), }, - versionStatus !== 'outdated' - ? { - type: 'neutral', - icon: 'check', - label: ( - - Version - supported - until {visualExpiration} - - ), - } - : { - type: 'danger', - icon: 'warning', - label: ( - - Version - not supported - - ), - }, + versionStatus?.label !== 'outdated' && + versionStatus?.expiration && { + type: 'neutral', + icon: 'check', + label: ( + + Version + supported + until {formatDate(versionStatus?.expiration)} + + ), + }, + versionStatus?.label === 'outdated' && { + type: 'danger', + icon: 'warning', + label: ( + + Version + not supported + + ), + }, isRegistered ? { type: 'neutral', @@ -184,7 +170,7 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { }, ].filter(Boolean) as VersionActionItem[] ).sort((a) => (a.type === 'danger' ? -1 : 1)); - }, [isOverLimits, isAirgapped, versionStatus, isRegistered, t, visualExpiration]); + }, [isOverLimits, t, isAirgapped, versions, versionStatus?.label, versionStatus?.expiration, formatDate, isRegistered]); return ( @@ -196,7 +182,7 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { {t('Version_version', { version: serverVersion })} - + {!isAirgapped && versions && } @@ -228,7 +214,33 @@ const VersionCard = ({ serverInfo }: VersionCardProps): ReactElement => { export default VersionCard; -const decodeBase64 = (b64: string): SupportedVersions => { +const decodeBase64 = (b64: string): SupportedVersions | undefined => { const [, bodyEncoded] = b64.split('.'); + if (!bodyEncoded) { + return; + } + return JSON.parse(atob(bodyEncoded)); }; + +const getVersionStatus = ( + serverVersion: string, + versions: SupportedVersions['versions'], +): { label: VersionStatus; expiration: Date | undefined } => { + const coercedServerVersion = String(semver.coerce(serverVersion)); + const highestVersion = versions.reduce((prev, current) => (prev.version > current.version ? prev : current)); + const currentVersionData = versions.find((v) => v.version.includes(coercedServerVersion) || v.version.includes(serverVersion)); + const isSupported = currentVersionData?.version === coercedServerVersion || currentVersionData?.version === serverVersion; + + const versionStatus: { + label: VersionStatus; + expiration: Date | undefined; + } = { + label: 'outdated', + ...(semver.gte(coercedServerVersion, highestVersion.version) && { label: 'latest' }), + ...(isSupported && semver.gt(highestVersion.version, coercedServerVersion) && { label: 'available_version' }), + expiration: currentVersionData?.expiration, + }; + + return versionStatus; +}; diff --git a/apps/meteor/client/views/cloud/CloudAnnouncementHandler.tsx b/apps/meteor/client/views/cloud/CloudAnnouncementHandler.tsx new file mode 100644 index 000000000000..c2fef93c6f29 --- /dev/null +++ b/apps/meteor/client/views/cloud/CloudAnnouncementHandler.tsx @@ -0,0 +1,56 @@ +import type { Cloud, UiKit } from '@rocket.chat/core-typings'; +import { useEffect, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { exhaustiveCheck } from '../../../lib/utils/exhaustiveCheck'; +import { useUiKitActionManager } from '../../uikit/hooks/useUiKitActionManager'; + +type CloudAnnouncementHandlerProps = Pick; + +const CloudAnnouncementHandler = ({ dictionary = {}, surface, view }: CloudAnnouncementHandlerProps) => { + const { i18n } = useTranslation(); + + useEffect(() => { + const appNs = `app-cloud-announcements-core`; + + for (const [language, translations] of Object.entries(dictionary)) { + i18n.addResources(language, appNs, translations); + } + }, [i18n, dictionary]); + + const actionManager = useUiKitActionManager(); + + const viewRef = useRef({ ...view, appId: 'cloud-announcements-core' }); + viewRef.current = { ...view, appId: 'cloud-announcements-core' }; + + useEffect(() => { + switch (surface) { + case 'modal': { + const modalView = viewRef.current as UiKit.ModalView; + + actionManager.openView('modal', modalView); + + return () => { + actionManager.disposeView(modalView.id); + }; + } + + case 'banner': { + const bannerView = viewRef.current as UiKit.BannerView; + + actionManager.openView('banner', { ...bannerView }); + + return () => { + actionManager.disposeView(bannerView.viewId); + }; + } + + default: + exhaustiveCheck(surface); + } + }, [actionManager, surface]); + + return null; +}; + +export default CloudAnnouncementHandler; diff --git a/apps/meteor/client/views/cloud/CloudAnnouncementsRegion.tsx b/apps/meteor/client/views/cloud/CloudAnnouncementsRegion.tsx new file mode 100644 index 000000000000..7f08fb3f83ae --- /dev/null +++ b/apps/meteor/client/views/cloud/CloudAnnouncementsRegion.tsx @@ -0,0 +1,32 @@ +import { useEndpoint, useUserId } from '@rocket.chat/ui-contexts'; +import { useQuery } from '@tanstack/react-query'; +import React from 'react'; + +import CloudAnnouncementHandler from './CloudAnnouncementHandler'; + +const CloudAnnouncementsRegion = () => { + const uid = useUserId(); + + const getAnnouncements = useEndpoint('GET', '/v1/cloud.announcements'); + + const { isSuccess, data: announcements } = useQuery({ + queryKey: ['cloud', 'announcements'], + queryFn: () => getAnnouncements(), + select: (data) => data.announcements, + enabled: !!uid, + }); + + if (!isSuccess) { + return null; + } + + return ( + <> + {announcements.map((announcement) => ( + + ))} + + ); +}; + +export default CloudAnnouncementsRegion; diff --git a/apps/meteor/client/views/invite/hooks/useValidateInviteQuery.ts b/apps/meteor/client/views/invite/hooks/useValidateInviteQuery.ts index a68f47a3fb09..0d5d8bfc6dc1 100644 --- a/apps/meteor/client/views/invite/hooks/useValidateInviteQuery.ts +++ b/apps/meteor/client/views/invite/hooks/useValidateInviteQuery.ts @@ -37,7 +37,7 @@ export const useValidateInviteQuery = (userId: string | null, token: string | un } if (registrationForm !== 'Disabled') { - setLoginDefaultState('register'); + setLoginDefaultState('invite-register'); } else { setLoginDefaultState('login'); } diff --git a/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.stories.tsx b/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.stories.tsx index 961454a3d1bf..ec8ebc1c15cc 100644 --- a/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.stories.tsx +++ b/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.stories.tsx @@ -8,5 +8,5 @@ export default { component: AppearanceForm, } as ComponentMeta; -export const Default: ComponentStory = (args) => ; +export const Default: ComponentStory = () => ; Default.storyName = 'AppearanceForm'; diff --git a/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx b/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx index 4983c5ca8837..7b0b541eba87 100644 --- a/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx +++ b/apps/meteor/client/views/omnichannel/appearance/AppearanceForm.tsx @@ -11,259 +11,247 @@ import { TextAreaInput, NumberInput, } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC, FormEvent } from 'react'; +import type { ChangeEvent } from 'react'; import React from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; -type AppearanceFormProps = { - values: { - Livechat_title?: string; - Livechat_title_color?: string; - Livechat_show_agent_info?: boolean; - Livechat_show_agent_email?: boolean; - Livechat_display_offline_form?: boolean; - Livechat_offline_form_unavailable?: string; - Livechat_offline_message?: string; - Livechat_offline_title?: string; - Livechat_offline_title_color?: string; - Livechat_offline_email?: string; - Livechat_offline_success_message?: string; - Livechat_registration_form?: boolean; - Livechat_name_field_registration_form?: boolean; - Livechat_email_field_registration_form?: boolean; - Livechat_registration_form_message?: string; - Livechat_conversation_finished_message?: string; - Livechat_conversation_finished_text?: string; - Livechat_enable_message_character_limit?: boolean; - Livechat_message_character_limit?: number; - }; - handlers: { - handleLivechat_title?: (event: FormEvent) => void; - handleLivechat_title_color?: (event: FormEvent) => void; - handleLivechat_show_agent_info?: (event: FormEvent) => void; - handleLivechat_show_agent_email?: (event: FormEvent) => void; - handleLivechat_display_offline_form?: (event: FormEvent) => void; - handleLivechat_offline_form_unavailable?: (event: FormEvent) => void; - handleLivechat_offline_message?: (event: FormEvent) => void; - handleLivechat_offline_title?: (event: FormEvent) => void; - handleLivechat_offline_title_color?: (event: FormEvent) => void; - handleLivechat_offline_email?: (event: FormEvent) => void; - handleLivechat_offline_success_message?: (event: FormEvent) => void; - handleLivechat_registration_form?: (event: FormEvent) => void; - handleLivechat_name_field_registration_form?: (event: FormEvent) => void; - handleLivechat_email_field_registration_form?: (event: FormEvent) => void; - handleLivechat_registration_form_message?: (event: FormEvent) => void; - handleLivechat_conversation_finished_message?: (event: FormEvent) => void; - handleLivechat_conversation_finished_text?: (event: FormEvent) => void; - handleLivechat_enable_message_character_limit?: (event: FormEvent) => void; - handleLivechat_message_character_limit?: (value: number) => void; - }; -}; - -const AppearanceForm: FC = ({ values = {}, handlers = {} }) => { +const AppearanceForm = () => { const t = useTranslation(); - const { - Livechat_title, - Livechat_title_color, - Livechat_show_agent_info, - Livechat_show_agent_email, - Livechat_display_offline_form, - Livechat_offline_form_unavailable, - Livechat_offline_message, - Livechat_offline_title, - Livechat_offline_title_color, - Livechat_offline_email, - Livechat_offline_success_message, - Livechat_registration_form, - Livechat_name_field_registration_form, - Livechat_email_field_registration_form, - Livechat_registration_form_message, - Livechat_conversation_finished_message, - Livechat_conversation_finished_text, - Livechat_enable_message_character_limit, - Livechat_message_character_limit, - } = values; - - const { - handleLivechat_title, - handleLivechat_title_color, - handleLivechat_show_agent_info, - handleLivechat_show_agent_email, - handleLivechat_display_offline_form, - handleLivechat_offline_form_unavailable, - handleLivechat_offline_message, - handleLivechat_offline_title, - handleLivechat_offline_title_color, - handleLivechat_offline_email, - handleLivechat_offline_success_message, - handleLivechat_registration_form, - handleLivechat_name_field_registration_form, - handleLivechat_email_field_registration_form, - handleLivechat_registration_form_message, - handleLivechat_conversation_finished_message, - handleLivechat_conversation_finished_text, - handleLivechat_enable_message_character_limit, - handleLivechat_message_character_limit, - } = handlers; + const { control, watch } = useFormContext(); + const { Livechat_enable_message_character_limit } = watch(); - const onChangeCharacterLimit = useMutableCallback(({ currentTarget: { value } }) => { - handleLivechat_message_character_limit?.(Number(value) < 0 ? 0 : value); - }); + const livechatTitleField = useUniqueId(); + const livechatTitleColorField = useUniqueId(); + const livechatEnableMessageCharacterLimit = useUniqueId(); + const livechatMessageCharacterLimit = useUniqueId(); + const livechatShowAgentInfo = useUniqueId(); + const livechatShowAgentEmail = useUniqueId(); + const livechatDisplayOfflineForm = useUniqueId(); + const livechatOfflineFormUnavailableField = useUniqueId(); + const livechatOfflineMessageField = useUniqueId(); + const livechatOfflineTitleField = useUniqueId(); + const livechatOfflineTitleColorField = useUniqueId(); + const livechatOfflineEmailField = useUniqueId(); + const livechatOfflineSuccessMessageField = useUniqueId(); + const livechatRegistrationForm = useUniqueId(); + const livechatNameFieldRegistrationForm = useUniqueId(); + const livechatEmailFieldRegistrationForm = useUniqueId(); + const livechatRegistrationFormMessageField = useUniqueId(); + const livechatConversationFinishedMessageField = useUniqueId(); + const livechatConversationFinishedTextField = useUniqueId(); return ( - {t('Title')} + {t('Title')} - + } + /> - {t('Title_bar_color')} + {t('Title_bar_color')} - + } + /> - {t('Message_Characther_Limit')} + {t('Livechat_enable_message_character_limit')} - + ( + + )} + /> + + + {t('Message_Characther_Limit')} - ( + ) => onChange(Number(e.currentTarget.value) < 0 ? 0 : e.currentTarget.value)} + /> + )} /> - {t('Show_agent_info')} + {t('Show_agent_info')} - + } + /> - {t('Show_agent_email')} + {t('Show_agent_email')} - + } + /> - - {t('Display_offline_form')} + {t('Display_offline_form')} - + } + /> - {t('Offline_form_unavailable_message')} + {t('Offline_form_unavailable_message')} - } /> - {t('Offline_message')} + {t('Offline_message')} - } /> - {t('Title_offline')} + {t('Title_offline')} - + } + /> - {t('Title_bar_color_offline')} + {t('Title_bar_color_offline')} - + } + /> - {t('Email_address_to_send_offline_messages')} + {t('Email_address_to_send_offline_messages')} - } /> - {t('Offline_success_message')} + {t('Offline_success_message')} - } /> - - {t('Enabled')} + {t('Enabled')} - + } + /> - {t('Show_name_field')} + {t('Show_name_field')} - + ( + + )} + /> - {t('Show_email_field')} + {t('Show_email_field')} - + ( + + )} + /> - {t('Livechat_registration_form_message')} + {t('Livechat_registration_form_message')} - ( + + )} /> @@ -272,24 +260,26 @@ const AppearanceForm: FC = ({ values = {}, handlers = {} }) - {t('Conversation_finished_message')} + {t('Conversation_finished_message')} - ( + + )} /> - {t('Conversation_finished_text')} + {t('Conversation_finished_text')} - ( + + )} /> diff --git a/apps/meteor/client/views/omnichannel/appearance/AppearancePage.tsx b/apps/meteor/client/views/omnichannel/appearance/AppearancePage.tsx index 4bdbf94ff2f7..92add7cd0272 100644 --- a/apps/meteor/client/views/omnichannel/appearance/AppearancePage.tsx +++ b/apps/meteor/client/views/omnichannel/appearance/AppearancePage.tsx @@ -1,12 +1,11 @@ import type { ISetting, Serialized } from '@rocket.chat/core-typings'; import { ButtonGroup, Button, Box } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useMutableCallback, useUniqueId } from '@rocket.chat/fuselage-hooks'; import { useToastMessageDispatch, useEndpoint, useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; import React from 'react'; +import { useForm, FormProvider } from 'react-hook-form'; import Page from '../../../components/Page'; -import { useForm } from '../../../hooks/useForm'; import AppearanceForm from './AppearanceForm'; type LivechatAppearanceSettings = { @@ -39,45 +38,56 @@ const reduceAppearance = (settings: Serialized[]): AppearanceSettings return acc; }, {}); -type AppearancePageProps = { - settings: Serialized[]; -}; - -const AppearancePage: FC = ({ settings }) => { +const AppearancePage = ({ settings }: { settings: Serialized[] }) => { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); - const save = useEndpoint('POST', '/v1/livechat/appearance'); + const saveAction = useEndpoint('POST', '/v1/livechat/appearance'); - const { values, handlers, commit, reset, hasUnsavedChanges } = useForm(reduceAppearance(settings)); + const methods = useForm({ defaultValues: reduceAppearance(settings) }); + const { + reset, + formState: { isDirty }, + handleSubmit, + watch, + } = methods; - const handleSave = useMutableCallback(async () => { - const mappedAppearance = Object.entries(values).map(([_id, value]) => ({ _id, value })) as { + const currentData = watch(); + + const handleSave = useMutableCallback(async (data) => { + const mappedAppearance = Object.entries(data).map(([_id, value]) => ({ _id, value })) as { _id: string; value: string | boolean | number; }[]; try { - await save(mappedAppearance); + await saveAction(mappedAppearance); dispatchToastMessage({ type: 'success', message: t('Settings_updated') }); - commit(); - } catch (error: unknown) { + } catch (error) { dispatchToastMessage({ type: 'error', message: error }); + } finally { + reset(currentData); } }); + const formId = useUniqueId(); + return ( - + +
+ + +
- + - diff --git a/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx b/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx index 6659386df72b..633f1f6c0975 100644 --- a/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx +++ b/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx @@ -1,9 +1,10 @@ import { Box, Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; -import React, { useMemo } from 'react'; +import { hashQueryKey, useQuery } from '@tanstack/react-query'; +import React, { useMemo, useState } from 'react'; +import FilterByText from '../../../components/FilterByText'; import GenericNoResults from '../../../components/GenericNoResults/GenericNoResults'; import { GenericTable, @@ -23,6 +24,10 @@ import RemoveManagerButton from './RemoveManagerButton'; // TODO: Missing error state const ManagersTable = () => { const t = useTranslation(); + + const [text, setText] = useState(''); + const debouncedText = useDebouncedValue(text, 500); + const { sortBy, sortDirection, setSort } = useSort<'name' | 'username' | 'emails.address'>('name'); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); @@ -30,18 +35,24 @@ const ManagersTable = () => { const query = useDebouncedValue( useMemo( () => ({ + text: debouncedText, fields: JSON.stringify({ name: 1, username: 1, emails: 1, avatarETag: 1 }), sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`, count: itemsPerPage, offset: current, }), - [itemsPerPage, current, sortBy, sortDirection], + [debouncedText, sortBy, sortDirection, itemsPerPage, current], ), 500, ); const getManagers = useEndpoint('GET', '/v1/livechat/users/manager'); - const { data, isLoading, isSuccess, refetch } = useQuery(['livechat-manager', query], async () => getManagers(query)); + const { data, isLoading, isSuccess, refetch } = useQuery(['omnichannel', 'managers', 'livechat-manager', query], async () => + getManagers(query), + ); + + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); const headers = ( <> @@ -69,8 +80,9 @@ const ManagersTable = () => { return ( <> + {((isSuccess && data?.users.length > 0) || queryHasChanged) && setText(text)} />} {isLoading && ( - + {headers} @@ -88,7 +100,7 @@ const ManagersTable = () => { )} {isSuccess && data.users.length > 0 && ( <> - + {headers} {data.users.map((user) => ( diff --git a/apps/meteor/client/views/room/hooks/useOpenRoom.ts b/apps/meteor/client/views/room/hooks/useOpenRoom.ts index d529145aaf17..8af6d62b6450 100644 --- a/apps/meteor/client/views/room/hooks/useOpenRoom.ts +++ b/apps/meteor/client/views/room/hooks/useOpenRoom.ts @@ -75,7 +75,7 @@ export function useOpenRoom({ type, reference }: { type: RoomType; reference: st const { LegacyRoomManager } = await import('../../../../app/ui-utils/client'); - if (room._id !== reference && type === 'd') { + if (reference !== undefined && room._id !== reference && type === 'd') { // Redirect old url using username to rid await LegacyRoomManager.close(type + reference); directRoute.push({ rid: room._id }, (prev) => prev); diff --git a/apps/meteor/client/views/room/modals/FileUploadModal/FileUploadModal.tsx b/apps/meteor/client/views/room/modals/FileUploadModal/FileUploadModal.tsx index d1145f91a106..312776397b32 100644 --- a/apps/meteor/client/views/room/modals/FileUploadModal/FileUploadModal.tsx +++ b/apps/meteor/client/views/room/modals/FileUploadModal/FileUploadModal.tsx @@ -1,6 +1,7 @@ import { Modal, Box, Field, FieldGroup, FieldLabel, FieldRow, FieldError, TextInput, Button } from '@rocket.chat/fuselage'; import { useAutoFocus } from '@rocket.chat/fuselage-hooks'; -import { useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; +import { useToastMessageDispatch, useTranslation, useSetting } from '@rocket.chat/ui-contexts'; +import fileSize from 'filesize'; import type { ReactElement, ChangeEvent, FormEventHandler, ComponentProps } from 'react'; import React, { memo, useState, useEffect } from 'react'; @@ -29,6 +30,7 @@ const FileUploadModal = ({ const [description, setDescription] = useState(fileDescription || ''); const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); + const maxFileSize = useSetting('FileUpload_MaxFileSize') as number; const ref = useAutoFocus(); @@ -48,6 +50,16 @@ const FileUploadModal = ({ message: t('error-the-field-is-required', { field: t('Name') }), }); } + + // -1 maxFileSize means there is no limit + if (maxFileSize > -1 && (file.size || 0) > maxFileSize) { + onClose(); + return dispatchToastMessage({ + type: 'error', + message: t('File_exceeds_allowed_size_of_bytes', { size: fileSize(maxFileSize) }), + }); + } + onSubmit(name, description); }; diff --git a/apps/meteor/client/views/room/providers/hooks/useChatMessagesInstance.ts b/apps/meteor/client/views/room/providers/hooks/useChatMessagesInstance.ts index 93ccddeadff3..a468efd68fc6 100644 --- a/apps/meteor/client/views/room/providers/hooks/useChatMessagesInstance.ts +++ b/apps/meteor/client/views/room/providers/hooks/useChatMessagesInstance.ts @@ -5,6 +5,7 @@ import { useEffect } from 'react'; import { ChatMessages } from '../../../../../app/ui/client/lib/ChatMessages'; import { useEmojiPicker } from '../../../../contexts/EmojiPickerContext'; import type { ChatAPI } from '../../../../lib/chats/ChatAPI'; +import { useUiKitActionManager } from '../../../../uikit/hooks/useUiKitActionManager'; import { useRoomSubscription } from '../../contexts/RoomContext'; import { useInstance } from './useInstance'; import { useUserCard } from './useUserCard'; @@ -12,8 +13,9 @@ import { useUserCard } from './useUserCard'; export function useChatMessagesInstance({ rid, tmid }: { rid: IRoom['_id']; tmid?: IMessage['_id'] }): ChatAPI { const uid = useUserId(); const subscription = useRoomSubscription(); + const actionManager = useUiKitActionManager(); const chatMessages = useInstance(() => { - const instance = new ChatMessages({ rid, tmid, uid }); + const instance = new ChatMessages({ rid, tmid, uid, actionManager }); return [instance, () => instance.release()]; }, [rid, tmid, uid]); diff --git a/apps/meteor/client/views/root/AppLayout.tsx b/apps/meteor/client/views/root/AppLayout.tsx index 83614e4ae67f..5bdcd9d6a5b5 100644 --- a/apps/meteor/client/views/root/AppLayout.tsx +++ b/apps/meteor/client/views/root/AppLayout.tsx @@ -5,7 +5,6 @@ import { useAnalytics } from '../../../app/analytics/client/loadScript'; import { useAnalyticsEventTracking } from '../../hooks/useAnalyticsEventTracking'; import { appLayout } from '../../lib/appLayout'; import PageLoading from './PageLoading'; -import { useCloudAnnouncements } from './hooks/useCloudAnnouncements'; import { useEscapeKeyStroke } from './hooks/useEscapeKeyStroke'; import { useGoogleTagManager } from './hooks/useGoogleTagManager'; import { useMessageLinkClicks } from './hooks/useMessageLinkClicks'; @@ -24,7 +23,6 @@ const AppLayout = () => { useAnalytics(); useEscapeKeyStroke(); useAnalyticsEventTracking(); - useCloudAnnouncements(); const layout = useSyncExternalStore(appLayout.subscribe, appLayout.getSnapshot); diff --git a/apps/meteor/client/views/root/hooks/useCloudAnnouncements.ts b/apps/meteor/client/views/root/hooks/useCloudAnnouncements.ts deleted file mode 100644 index a6326565b80d..000000000000 --- a/apps/meteor/client/views/root/hooks/useCloudAnnouncements.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { UiKit } from '@rocket.chat/core-typings'; -import { useEndpoint, useUserId } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; -import { useEffect } from 'react'; - -import { useUiKitActionManager } from '../../../uikit/hooks/useUiKitActionManager'; - -export const useCloudAnnouncements = () => { - const uid = useUserId(); - - const getAnnouncements = useEndpoint('GET', '/v1/cloud.announcements'); - - const actionManager = useUiKitActionManager(); - - const { data: firstModalAnnouncement } = useQuery({ - queryKey: ['cloud', 'announcements'], - queryFn: () => getAnnouncements(), - select: (data) => data.announcements.filter((announcement) => announcement.surface === 'modal')[0], - enabled: !!uid, - }); - - useEffect(() => { - if (!firstModalAnnouncement) { - return; - } - - const view = firstModalAnnouncement.view as UiKit.ModalView; - - actionManager.openView('modal', view); - - return () => { - actionManager.disposeView(view.id); - }; - }, [firstModalAnnouncement, actionManager]); - - const { data: firstBannerAnnouncement } = useQuery({ - queryKey: ['cloud', 'announcements'], - queryFn: () => getAnnouncements(), - select: (data) => data.announcements.filter((announcement) => announcement.surface === 'banner')[0], - enabled: !!uid, - }); - - useEffect(() => { - if (!firstBannerAnnouncement) { - return; - } - - const view = firstBannerAnnouncement.view as UiKit.BannerView; - - actionManager.openView('banner', view); - - return () => { - actionManager.disposeView(view.viewId); - }; - }, [firstBannerAnnouncement, actionManager]); -}; diff --git a/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx b/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx index 26d69a5ff6fc..b8370897104b 100644 --- a/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx +++ b/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx @@ -37,8 +37,13 @@ const RegisterServerStep = (): ReactElement => { staleTime: Infinity, }); - const { data } = useQuery(['setupWizard/registerIntent'], async () => registerPreIntent(), { + const { + data: offline, + isLoading, + isError, + } = useQuery(['setupWizard/registerIntent'], async () => registerPreIntent(), { staleTime: Infinity, + select: (data) => data.offline, }); const { mutate } = useMutation( @@ -77,7 +82,7 @@ const RegisterServerStep = (): ReactElement => { stepCount={maxSteps} onSubmit={handleRegister} currentStep={currentStep} - offline={!data || data.offline} + offline={isError || (!isLoading && offline)} /> ); }; diff --git a/apps/meteor/definition/IRoomTypeConfig.ts b/apps/meteor/definition/IRoomTypeConfig.ts index a5910aeb6e86..8ac27be14caf 100644 --- a/apps/meteor/definition/IRoomTypeConfig.ts +++ b/apps/meteor/definition/IRoomTypeConfig.ts @@ -105,7 +105,7 @@ export interface IRoomTypeServerDirectives { sender: AtLeast, notificationMessage: string, userId: string, - ) => Promise<{ title: string | undefined; text: string }>; + ) => Promise<{ title: string | undefined; text: string; name: string | undefined }>; getMsgSender: (senderId: IUser['_id']) => Promise; includeInRoomSearch: () => boolean; getReadReceiptsExtraData: (message: IMessage) => Partial; diff --git a/apps/meteor/ee/app/canned-responses/client/startup/responses.js b/apps/meteor/ee/app/canned-responses/client/startup/responses.js index 7979f74b0630..6d5834d91cc0 100644 --- a/apps/meteor/ee/app/canned-responses/client/startup/responses.js +++ b/apps/meteor/ee/app/canned-responses/client/startup/responses.js @@ -24,20 +24,23 @@ Meteor.startup(() => { if (!hasPermission('view-canned-responses')) { return; } - try { - // TODO: check options - sdk.stream('canned-responses', 'canned-responses', (response, options) => { - const { agentsId } = options || {}; - if (Array.isArray(agentsId) && !agentsId.includes(Meteor.userId())) { - return; - } - events[response.type](response); - }); - const { responses } = await sdk.rest.get('/v1/canned-responses.get'); - responses.forEach((response) => CannedResponse.insert(response)); - c.stop(); - } catch (error) { - console.log(error); - } + Tracker.afterFlush(() => { + try { + // TODO: check options + sdk.stream('canned-responses', ['canned-responses'], (response, options) => { + const { agentsId } = options || {}; + if (Array.isArray(agentsId) && !agentsId.includes(Meteor.userId())) { + return; + } + events[response.type](response); + }); + } catch (error) { + console.log(error); + } + }); + + const { responses } = await sdk.rest.get('/v1/canned-responses.get'); + responses.forEach((response) => CannedResponse.insert(response)); + c.stop(); }); }); diff --git a/apps/meteor/ee/app/license/server/maxSeatsBanners.ts b/apps/meteor/ee/app/license/server/maxSeatsBanners.ts index b5aba719f29d..c94ee41248bf 100644 --- a/apps/meteor/ee/app/license/server/maxSeatsBanners.ts +++ b/apps/meteor/ee/app/license/server/maxSeatsBanners.ts @@ -15,7 +15,7 @@ const makeWarningBanner = (seats: number): IBanner => ({ view: { icon: 'warning', variant: 'warning', - viewId: '', + viewId: WARNING_BANNER_ID, appId: 'banner-core', blocks: [ { @@ -49,7 +49,7 @@ const makeDangerBanner = (): IBanner => ({ view: { icon: 'ban', variant: 'danger', - viewId: '', + viewId: DANGER_BANNER_ID, appId: 'banner-core', blocks: [ { diff --git a/apps/meteor/ee/app/license/server/settings.ts b/apps/meteor/ee/app/license/server/settings.ts index 8cf8c6237f52..beea68ee2b5f 100644 --- a/apps/meteor/ee/app/license/server/settings.ts +++ b/apps/meteor/ee/app/license/server/settings.ts @@ -14,7 +14,6 @@ Meteor.startup(async () => { await this.add('Enterprise_License_Data', '', { type: 'string', hidden: true, - blocked: true, public: false, }); await this.add('Enterprise_License_Status', '', { diff --git a/apps/meteor/ee/app/license/server/startup.ts b/apps/meteor/ee/app/license/server/startup.ts index 422e453b591c..e0dd567da392 100644 --- a/apps/meteor/ee/app/license/server/startup.ts +++ b/apps/meteor/ee/app/license/server/startup.ts @@ -42,7 +42,29 @@ const applyLicense = async (license: string, isNewLicense: boolean): Promise { +/** + * This is a debounced function that will sync the workspace data to the cloud. + * it caches the context, waits for a second and then syncs the data. + */ + +const syncByTriggerDebounced = (() => { + let timeout: NodeJS.Timeout | undefined; + const contexts: Set = new Set(); + return async (context: string) => { + contexts.add(context); + if (timeout) { + clearTimeout(timeout); + } + + timeout = setTimeout(() => { + timeout = undefined; + void syncByTrigger([...contexts]); + contexts.clear(); + }, 1000); + }; +})(); + +const syncByTrigger = async (contexts: string[]) => { if (!License.encryptedLicense) { return; } @@ -60,16 +82,19 @@ const syncByTrigger = async (context: string) => { const [, , signed] = License.encryptedLicense.split('.'); // Check if this sync has already been done. Based on License, behavior. - if (existingData.signed === signed && existingData[context] === period) { + + if ([...contexts.values()].every((context) => existingData.signed === signed && existingData[context] === period)) { return; } + const obj = Object.fromEntries(contexts.map((context) => [context, period])); + await Settings.updateValueById( 'Enterprise_License_Data', JSON.stringify({ ...(existingData.signed === signed && existingData), ...existingData, - [context]: period, + ...obj, signed, }), ); @@ -91,11 +116,11 @@ settings.onReady(async () => { callbacks.add('workspaceLicenseChanged', async (updatedLicense) => applyLicense(updatedLicense, true)); - License.onBehaviorTriggered('prevent_action', (context) => syncByTrigger(`prevent_action_${context.limit}`)); + License.onBehaviorTriggered('prevent_action', (context) => syncByTriggerDebounced(`prevent_action_${context.limit}`)); - License.onBehaviorTriggered('start_fair_policy', async (context) => syncByTrigger(`start_fair_policy_${context.limit}`)); + License.onBehaviorTriggered('start_fair_policy', async (context) => syncByTriggerDebounced(`start_fair_policy_${context.limit}`)); - License.onBehaviorTriggered('disable_modules', async (context) => syncByTrigger(`disable_modules_${context.limit}`)); + License.onBehaviorTriggered('disable_modules', async (context) => syncByTriggerDebounced(`disable_modules_${context.limit}`)); License.onChange(() => api.broadcast('license.sync')); @@ -123,4 +148,4 @@ License.setLicenseLimitCounter('guestUsers', () => Users.getActiveLocalGuestCoun License.setLicenseLimitCounter('roomsPerGuest', async (context) => (context?.userId ? Subscriptions.countByUserId(context.userId) : 0)); License.setLicenseLimitCounter('privateApps', () => getAppCount('private')); License.setLicenseLimitCounter('marketplaceApps', () => getAppCount('marketplace')); -License.setLicenseLimitCounter('monthlyActiveContacts', async () => LivechatVisitors.countVisitorsOnPeriod(moment.utc().format('YYYY-MM'))); +License.setLicenseLimitCounter('monthlyActiveContacts', () => LivechatVisitors.countVisitorsOnPeriod(moment.utc().format('YYYY-MM'))); diff --git a/apps/meteor/ee/client/apps/orchestrator.ts b/apps/meteor/ee/client/apps/orchestrator.ts index 2433d79aa7b5..eaaf367796ae 100644 --- a/apps/meteor/ee/client/apps/orchestrator.ts +++ b/apps/meteor/ee/client/apps/orchestrator.ts @@ -1,14 +1,13 @@ import { AppClientManager } from '@rocket.chat/apps-engine/client/AppClientManager'; -import type { IApiEndpointMetadata } from '@rocket.chat/apps-engine/definition/api'; import type { IPermission } from '@rocket.chat/apps-engine/definition/permissions/IPermission'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; -import type { AppScreenshot, AppRequestFilter, Serialized, AppRequestsStats, PaginatedAppRequests } from '@rocket.chat/core-typings'; +import type { Serialized } from '@rocket.chat/core-typings'; import { hasAtLeastOnePermission } from '../../../app/authorization/client'; import { sdk } from '../../../app/utils/client/lib/SDKClient'; import { dispatchToastMessage } from '../../../client/lib/toast'; import type { App } from '../../../client/views/marketplace/types'; -import type { IAppLanguage, IAppExternalURL, ICategory } from './@types/IOrchestrator'; +import type { IAppExternalURL, ICategory } from './@types/IOrchestrator'; import { RealAppsEngineUIHost } from './RealAppsEngineUIHost'; class AppClientOrchestrator { @@ -43,11 +42,6 @@ class AppClientOrchestrator { } } - public async screenshots(appId: string): Promise { - const { screenshots } = await sdk.rest.get(`/apps/${appId}/screenshots`); - return screenshots; - } - public async getInstalledApps(): Promise { const result = await sdk.rest.get<'/apps/installed'>('/apps/installed'); @@ -87,53 +81,15 @@ class AppClientOrchestrator { return apps; } - public async getAppsLanguages(): Promise { - const { apps } = await sdk.rest.get('/apps/languages'); - return apps; - } - public async getApp(appId: string): Promise { const { app } = await sdk.rest.get(`/apps/${appId}` as any); return app; } - public async getAppFromMarketplace(appId: string, version: string): Promise<{ app: App; success: boolean }> { - const result = await sdk.rest.get( - `/apps/${appId}` as any, - { - marketplace: 'true', - version, - } as any, - ); - return result; - } - - public async getLatestAppFromMarketplace(appId: string, version: string): Promise { - const { app } = await sdk.rest.get( - `/apps/${appId}` as any, - { - marketplace: 'true', - update: 'true', - appVersion: version, - } as any, - ); - return app; - } - public async setAppSettings(appId: string, settings: ISetting[]): Promise { await sdk.rest.post(`/apps/${appId}/settings`, { settings }); } - public async getAppApis(appId: string): Promise { - const { apis } = await sdk.rest.get(`/apps/${appId}/apis`); - return apis; - } - - public async getAppLanguages(appId: string) { - const { languages } = await sdk.rest.get(`/apps/${appId}/languages`); - return languages; - } - public async installApp(appId: string, version: string, permissionsGranted?: IPermission[]): Promise { const { app } = await sdk.rest.post<'/apps/'>('/apps/', { appId, @@ -197,32 +153,6 @@ class AppClientOrchestrator { throw new Error('Failed to build external url'); } - public async appRequests( - appId: string, - filter?: AppRequestFilter, - sort?: string, - limit?: number, - offset?: number, - ): Promise { - try { - const response = await sdk.rest.get(`/apps/app-request?appId=${appId}&q=${filter}&sort=${sort}&limit=${limit}&offset=${offset}`); - - return response; - } catch (e: unknown) { - throw new Error('Could not get the list of app requests'); - } - } - - public async getAppRequestsStats(): Promise { - try { - const response = await sdk.rest.get('/apps/app-request/stats'); - - return response; - } catch (e: unknown) { - throw new Error('Could not get the app requests stats'); - } - } - public async getCategories(): Promise> { const result = await sdk.rest.get('/apps/categories'); @@ -232,10 +162,6 @@ class AppClientOrchestrator { } throw new Error('Failed to get categories'); } - - public getUIHost(): RealAppsEngineUIHost { - return this._appClientUIHost; - } } export const AppClientOrchestratorInstance = new AppClientOrchestrator(); diff --git a/apps/meteor/ee/client/hooks/roomActions/useCannedResponsesRoomAction.ts b/apps/meteor/ee/client/hooks/roomActions/useCannedResponsesRoomAction.ts index 56d789c58439..432a99169739 100644 --- a/apps/meteor/ee/client/hooks/roomActions/useCannedResponsesRoomAction.ts +++ b/apps/meteor/ee/client/hooks/roomActions/useCannedResponsesRoomAction.ts @@ -4,7 +4,7 @@ import { lazy, useMemo } from 'react'; import type { RoomToolboxActionConfig } from '../../../../client/views/room/contexts/RoomToolboxContext'; import { useHasLicenseModule } from '../useHasLicenseModule'; -const CannedResponse = lazy(() => import('../../omnichannel/components/contextualBar/CannedResponse')); +const CannedResponse = lazy(() => import('../../omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponseList')); export const useCannedResponsesRoomAction = () => { const licensed = useHasLicenseModule('canned-responses') === true; diff --git a/apps/meteor/ee/client/hooks/useHasLicenseModule.ts b/apps/meteor/ee/client/hooks/useHasLicenseModule.ts index c7d76b093c3b..4e44029c60f4 100644 --- a/apps/meteor/ee/client/hooks/useHasLicenseModule.ts +++ b/apps/meteor/ee/client/hooks/useHasLicenseModule.ts @@ -1,14 +1,11 @@ import type { LicenseModule } from '@rocket.chat/license'; -import { useMethod, useUserId } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; -export const useHasLicenseModule = (licenseName: LicenseModule): 'loading' | boolean => { - const method = useMethod('license:getModules'); - const uid = useUserId(); - - const features = useQuery(['ee.features'], method, { - enabled: !!uid, - }); +import { useLicenseBase } from '../../../client/hooks/useLicense'; - return features.data?.includes(licenseName) ?? 'loading'; +export const useHasLicenseModule = (licenseName: LicenseModule): 'loading' | boolean => { + return ( + useLicenseBase({ + select: (data) => data.license.activeModules.includes(licenseName), + }).data ?? 'loading' + ); }; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx index 9d09032c3662..35fcee64cf13 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx @@ -1,161 +1,98 @@ import type { ILivechatDepartment, IOmnichannelCannedResponse, Serialized } from '@rocket.chat/core-typings'; -import { Button, ButtonGroup, FieldGroup } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useToastMessageDispatch, useRoute, usePermission, useEndpoint, useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; -import React, { memo, useState, useMemo, useEffect, useCallback } from 'react'; +import { Box, Button, ButtonGroup } from '@rocket.chat/fuselage'; +import { useUniqueId } from '@rocket.chat/fuselage-hooks'; +import { useToastMessageDispatch, useEndpoint, useTranslation, useRouter } from '@rocket.chat/ui-contexts'; +import { useQueryClient } from '@tanstack/react-query'; +import React, { memo, useCallback } from 'react'; +import { FormProvider, useForm } from 'react-hook-form'; import Page from '../../../../client/components/Page'; -import { useForm } from '../../../../client/hooks/useForm'; import CannedResponseForm from './components/cannedResponseForm'; +import { useRemoveCannedResponse } from './useRemoveCannedResponse'; -const CannedResponseEdit: FC<{ - data?: { - cannedResponse: Serialized; - }; - reload: () => void; - totalDataReload: () => void; - isNew?: boolean; - departmentData?: { - department: Serialized; - }; -}> = ({ data, reload, totalDataReload, isNew = false }) => { +type CannedResponseEditProps = { + cannedResponseData?: Serialized; + departmentData?: Serialized; +}; + +const getInitialData = (cannedResponseData: Serialized | undefined) => ({ + _id: cannedResponseData?._id || '', + shortcut: cannedResponseData?.shortcut || '', + text: cannedResponseData?.text || '', + tags: cannedResponseData?.tags || [], + scope: cannedResponseData?.scope || 'user', + departmentId: cannedResponseData?.departmentId || '', +}); + +const CannedResponseEdit = ({ cannedResponseData }: CannedResponseEditProps) => { const t = useTranslation(); + const router = useRouter(); const dispatchToastMessage = useToastMessageDispatch(); - const Route = useRoute('omnichannel-canned-responses'); - - const handleReturn = useMutableCallback(() => - Route.push({ - context: '', - }), - ); + const queryClient = useQueryClient(); const saveCannedResponse = useEndpoint('POST', '/v1/canned-responses'); - const hasManagerPermission = usePermission('view-all-canned-responses'); - const hasMonitorPermission = usePermission('save-department-canned-responses'); - - const form = useForm({ - _id: data?.cannedResponse ? data.cannedResponse._id : '', - shortcut: data ? data.cannedResponse.shortcut : '', - text: data ? data.cannedResponse.text : '', - tags: data?.cannedResponse?.tags ?? [], - scope: data ? data.cannedResponse.scope : 'user', - departmentId: data?.cannedResponse?.departmentId ? data.cannedResponse.departmentId : '', - }); - - const { values, handlers, hasUnsavedChanges } = form; - - const [errors, setErrors] = useState({}); - const [radioDescription, setRadioDescription] = useState(t('Canned_Response_Sharing_Private_Description')); - const [preview, setPreview] = useState(false); - - const listErrors = useMemo(() => { - const empty: any = {}; - - for (const [key, value] of Object.entries(values)) { - if (['shortcut', 'text'].includes(key) && !value) { - empty[key] = t('Field_required'); + const methods = useForm({ defaultValues: getInitialData(cannedResponseData) }); + + const { + handleSubmit, + reset, + formState: { isDirty }, + } = methods; + + const handleDelete = useRemoveCannedResponse(); + + const handleSave = useCallback( + async ({ departmentId, ...data }) => { + try { + await saveCannedResponse({ + _id: cannedResponseData?._id, + ...data, + ...(departmentId && { departmentId }), + }); + dispatchToastMessage({ + type: 'success', + message: t(cannedResponseData?._id ? 'Canned_Response_Updated' : 'Canned_Response_Created'), + }); + router.navigate('/omnichannel/canned-responses'); + queryClient.invalidateQueries(['getCannedResponses']); + } catch (error) { + dispatchToastMessage({ type: 'error', message: error }); } - } - - if (values.scope === 'department' && !values.departmentId) { - empty.departmentId = t('Field_required'); - } - - return empty; - }, [t, values]); - - useEffect(() => { - setErrors(listErrors); - }, [values.shortcut, values.text, values.departmentId, listErrors]); - - const radioHandlers = { - setPublic: (): void => { - handlers.handleScope('global'); - handlers.handleDepartmentId(''); - setRadioDescription(t('Canned_Response_Sharing_Public_Description')); }, - setDepartment: (): void => { - handlers.handleScope('department'); - setRadioDescription(t('Canned_Response_Sharing_Department_Description')); - }, - setPrivate: (): void => { - handlers.handleScope('user'); - handlers.handleDepartmentId(''); - setRadioDescription(t('Canned_Response_Sharing_Private_Description')); - }, - }; - - const onSave = useCallback(async (): Promise => { - try { - const { _id, shortcut, text, scope, tags, departmentId } = values as { - _id: string; - shortcut: string; - text: string; - scope: string; - tags: any; - departmentId: string; - }; - await saveCannedResponse({ - ...(_id && { _id }), - shortcut, - text, - scope, - tags, - ...(departmentId && { departmentId }), - }); - dispatchToastMessage({ - type: 'success', - message: t(_id ? 'Canned_Response_Updated' : 'Canned_Response_Created'), - }); - Route.push({ - context: '', - }); - reload(); - totalDataReload(); - } catch (error) { - dispatchToastMessage({ type: 'error', message: error }); - } - }, [values, saveCannedResponse, dispatchToastMessage, t, Route, reload, totalDataReload]); - - const onPreview = (): void => { - setPreview(!preview); - }; - - const { shortcut, text, scope, departmentId } = values; - - const checkDepartment = scope !== 'department' || (scope === 'department' && departmentId); - - const canSave = shortcut && text && checkDepartment; + [cannedResponseData?._id, queryClient, saveCannedResponse, dispatchToastMessage, t, router], + ); + const formId = useUniqueId(); return ( - + - - + {cannedResponseData?._id && ( + + )} - - - - + + + + + + + + + + + + ); }; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx index 0e9f456da6b2..dd06afbcfa8d 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithData.tsx @@ -1,28 +1,24 @@ +import type { IOmnichannelCannedResponse } from '@rocket.chat/core-typings'; import { Callout } from '@rocket.chat/fuselage'; -import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; +import { useEndpoint, useTranslation } from '@rocket.chat/ui-contexts'; +import { useQuery } from '@tanstack/react-query'; import React from 'react'; import { FormSkeleton } from '../../../../client/components/Skeleton'; -import { AsyncStatePhase } from '../../../../client/hooks/useAsyncState'; -import { useEndpointData } from '../../../../client/hooks/useEndpointData'; import CannedResponseEdit from './CannedResponseEdit'; import CannedResponseEditWithDepartmentData from './CannedResponseEditWithDepartmentData'; -const CannedResponseEditWithData: FC<{ - cannedResponseId: string; - reload: () => void; - totalDataReload: () => void; -}> = ({ cannedResponseId, reload, totalDataReload }) => { - const { value: data, phase: state, error } = useEndpointData('/v1/canned-responses/:_id', { keys: { _id: cannedResponseId } }); - +const CannedResponseEditWithData = ({ cannedResponseId }: { cannedResponseId: IOmnichannelCannedResponse['_id'] }) => { const t = useTranslation(); - if (state === AsyncStatePhase.LOADING) { + const getCannedResponseById = useEndpoint('GET', '/v1/canned-responses/:_id', { _id: cannedResponseId }); + const { data, isLoading, isError } = useQuery(['getCannedResponseById', cannedResponseId], async () => getCannedResponseById()); + + if (isLoading) { return ; } - if (error) { + if (isError) { return ( {t('Not_Available')} @@ -31,10 +27,10 @@ const CannedResponseEditWithData: FC<{ } if (data?.cannedResponse?.scope === 'department') { - return ; + return ; } - return ; + return ; }; export default CannedResponseEditWithData; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx index 0a1dd2fec8b0..30f6639c054f 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx @@ -1,7 +1,6 @@ import type { IOmnichannelCannedResponse, Serialized } from '@rocket.chat/core-typings'; import { Callout } from '@rocket.chat/fuselage'; import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; import React, { useMemo } from 'react'; import { FormSkeleton } from '../../../../client/components/Skeleton'; @@ -9,16 +8,8 @@ import { AsyncStatePhase } from '../../../../client/hooks/useAsyncState'; import { useEndpointData } from '../../../../client/hooks/useEndpointData'; import CannedResponseEdit from './CannedResponseEdit'; -const CannedResponseEditWithData: FC<{ - data: - | { - cannedResponse: Serialized; - } - | undefined; - reload: () => void; - totalDataReload: () => void; -}> = ({ data, reload, totalDataReload }) => { - const departmentId = useMemo(() => data?.cannedResponse?.departmentId, [data]) as string; +const CannedResponseEditWithDepartmentData = ({ cannedResponseData }: { cannedResponseData: Serialized }) => { + const departmentId = useMemo(() => cannedResponseData?.departmentId, [cannedResponseData]) as string; const { value: departmentData, phase: state, error } = useEndpointData('/v1/livechat/department/:_id', { keys: { _id: departmentId } }); const t = useTranslation(); @@ -35,15 +26,7 @@ const CannedResponseEditWithData: FC<{ ); } - return ( - - ); + return ; }; -export default CannedResponseEditWithData; +export default CannedResponseEditWithDepartmentData; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseNew.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseNew.tsx deleted file mode 100644 index 8154b44adcb5..000000000000 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseNew.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import type { FC } from 'react'; -import React from 'react'; - -import CannedResponseEdit from './CannedResponseEdit'; - -const CannedResponseNew: FC<{ - reload: () => void; - totalDataReload: () => void; -}> = ({ reload, totalDataReload }) => ; - -export default CannedResponseNew; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx index 50627fa0b694..90556095cfbf 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx @@ -1,43 +1,32 @@ import { Button, ButtonGroup } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useRoute, useRouteParameter, useTranslation } from '@rocket.chat/ui-contexts'; -import { useQueryClient } from '@tanstack/react-query'; +import { useRouteParameter, useRouter, useTranslation } from '@rocket.chat/ui-contexts'; import React from 'react'; import Page from '../../../../client/components/Page'; +import CannedResponseEdit from './CannedResponseEdit'; import CannedResponseEditWithData from './CannedResponseEditWithData'; -import CannedResponseNew from './CannedResponseNew'; import CannedResponsesTable from './CannedResponsesTable'; const CannedResponsesPage = () => { const t = useTranslation(); - const cannedResponseRoute = useRoute('omnichannel-canned-responses'); - const queryClient = useQueryClient(); - - const handleClick = useMutableCallback(() => - cannedResponseRoute.push({ - context: 'new', - }), - ); + const router = useRouter(); const context = useRouteParameter('context'); const id = useRouteParameter('id'); - const reload = useMutableCallback(() => queryClient.invalidateQueries(['canned-responses'])); - if (context === 'edit' && id) { - return ; + return ; } if (context === 'new') { - return ; + return ; } return ( - + diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx index e2db45bf832e..165d7d27863c 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx @@ -1,4 +1,4 @@ -import { Box, Pagination } from '@rocket.chat/fuselage'; +import { Box, IconButton, Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useTranslation, usePermission, useToastMessageDispatch, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; import { useQuery, hashQueryKey } from '@tanstack/react-query'; @@ -19,7 +19,7 @@ import { useSort } from '../../../../client/components/GenericTable/hooks/useSor import UserAvatar from '../../../../client/components/avatar/UserAvatar'; import { useFormatDateAndTime } from '../../../../client/hooks/useFormatDateAndTime'; import CannedResponseFilter from './CannedResponseFilter'; -import RemoveCannedResponseButton from './RemoveCannedResponseButton'; +import { useRemoveCannedResponse } from './useRemoveCannedResponse'; type Scope = 'global' | 'department' | 'user'; @@ -56,7 +56,7 @@ const CannedResponsesTable = () => { const queryHasChanged = defaultQuery !== hashQueryKey([query]); const getCannedResponses = useEndpoint('GET', '/v1/canned-responses'); - const { data, isLoading, isSuccess, refetch } = useQuery(['/v1/canned-responses', query], () => getCannedResponses(query), { + const { data, isLoading, isSuccess } = useQuery(['getCannedResponses', query], () => getCannedResponses(query), { refetchOnWindowFocus: false, }); @@ -73,6 +73,8 @@ const CannedResponsesTable = () => { router.navigate(`/omnichannel/canned-responses/edit/${id}`); }); + const handleDelete = useRemoveCannedResponse(); + const defaultOptions = useMemo( () => ({ global: t('Public'), @@ -166,7 +168,19 @@ const CannedResponsesTable = () => { {getTime(_createdAt)} {tags.join(', ')} - {!(scope === 'global' && isMonitor && !isManager) && } + {!(scope === 'global' && isMonitor && !isManager) && ( + + { + e.stopPropagation(); + handleDelete(_id); + }} + /> + + )} ))} diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/RemoveCannedResponseButton.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/RemoveCannedResponseButton.tsx deleted file mode 100644 index 8647edca4748..000000000000 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/RemoveCannedResponseButton.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { IconButton } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useSetModal, useToastMessageDispatch, useRoute, useMethod, useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; -import React from 'react'; - -import GenericModal from '../../../../client/components/GenericModal'; -import { GenericTableCell } from '../../../../client/components/GenericTable'; - -type RemoveCannedResponseButtonProps = { - _id: string; - reload: () => void; -}; - -const RemoveCannedResponseButton: FC = ({ _id, reload }) => { - const t = useTranslation(); - const setModal = useSetModal(); - const dispatchToastMessage = useToastMessageDispatch(); - const cannedResponsesRoute = useRoute('omnichannel-canned-responses'); - - const removeCannedResponse = useMethod('removeCannedResponse'); - - const handleDelete = useMutableCallback((e) => { - e.stopPropagation(); - const onDeleteCannedResponse: () => Promise = async () => { - try { - await removeCannedResponse(_id); - reload(); - cannedResponsesRoute.push({}); - dispatchToastMessage({ type: 'success', message: t('Canned_Response_Removed') }); - } catch (error) { - dispatchToastMessage({ type: 'error', message: error }); - } finally { - setModal(null); - } - }; - - setModal( - setModal(null)} - onClose={(): void => setModal(null)} - confirmText={t('Delete')} - >, - ); - }); - - return ( - - - - ); -}; - -export default RemoveCannedResponseButton; diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/MarkdownTextEditor/InsertPlaceholderDropdown.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/MarkdownTextEditor/InsertPlaceholderDropdown.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/MarkdownTextEditor/InsertPlaceholderDropdown.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/MarkdownTextEditor/InsertPlaceholderDropdown.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/MarkdownTextEditor/MarkdownTextEditor.stories.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/MarkdownTextEditor/MarkdownTextEditor.stories.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/MarkdownTextEditor/MarkdownTextEditor.stories.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/MarkdownTextEditor/MarkdownTextEditor.stories.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/MarkdownTextEditor/index.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/MarkdownTextEditor/index.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/MarkdownTextEditor/index.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/MarkdownTextEditor/index.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/PreviewText.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/PreviewText.tsx similarity index 87% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/PreviewText.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/PreviewText.tsx index de570a7a9b74..fa043065b35b 100644 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/PreviewText.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/components/PreviewText.tsx @@ -2,7 +2,7 @@ import { Box } from '@rocket.chat/fuselage'; import type { FC } from 'react'; import React, { memo } from 'react'; -import MarkdownText from '../../../../../../../client/components/MarkdownText'; +import MarkdownText from '../../../../../client/components/MarkdownText'; const PreviewText: FC<{ text: string }> = ({ text }) => { const textM = text.split(/\n/).join(' \n'); diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/IconButton.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/IconButton.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/IconButton.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/IconButton.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/TextButton.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/TextButton.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/TextButton.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/TextButton.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/TextEditor.stories.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/TextEditor.stories.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/TextEditor.stories.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/TextEditor.stories.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/Textarea.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/Textarea.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/Textarea.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/Textarea.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/Toolbox.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/Toolbox.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/Toolbox.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/Toolbox.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/index.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/index.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/CannedResponse/TextEditor/index.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/components/TextEditor/index.tsx diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/components/cannedResponseForm.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/components/cannedResponseForm.tsx index 5b9fb7433f7f..270d9e9e30a2 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/components/cannedResponseForm.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/components/cannedResponseForm.tsx @@ -1,88 +1,189 @@ import { css } from '@rocket.chat/css-in-js'; -import { Box, Field, FieldLabel, FieldRow, FieldError, FieldDescription, TextInput } from '@rocket.chat/fuselage'; -import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; -import React from 'react'; +import { Box, Field, FieldLabel, FieldRow, FieldError, TextInput, FieldGroup, RadioButton, FieldHint } from '@rocket.chat/fuselage'; +import { useUniqueId } from '@rocket.chat/fuselage-hooks'; +import { usePermission, useTranslation } from '@rocket.chat/ui-contexts'; +import React, { useState } from 'react'; +import { useFormContext, Controller } from 'react-hook-form'; import AutoCompleteDepartment from '../../../../../client/components/AutoCompleteDepartment'; import Tags from '../../../../../client/components/Omnichannel/Tags'; -import MarkdownTextEditor from '../../components/CannedResponse/MarkdownTextEditor'; -import PreviewText from '../../components/CannedResponse/modals/CreateCannedResponse/PreviewText'; -import SharingOptions from '../../components/CannedResponse/modals/CreateCannedResponse/SharingOptions'; +import MarkdownTextEditor from './MarkdownTextEditor'; +import PreviewText from './PreviewText'; -const CannedResponseForm: FC<{ - isManager: boolean; - isMonitor: boolean; - values: any; - handlers: any; - errors: any; - radioHandlers: { - setPublic: () => void; - setDepartment: () => void; - setPrivate: () => void; - }; - radioDescription: string; - onPreview: () => void; - previewState: boolean; -}> = ({ values, handlers, errors, radioHandlers, radioDescription, onPreview, previewState, isManager, isMonitor }) => { - const { shortcut, text, scope, tags, departmentId } = values; - const { handleShortcut, handleText, handleTags, handleDepartmentId } = handlers; +// TODO: refactor Message field to get proper validation +// TODO: refactor Tags field to get proper validation +const CannedResponseForm = () => { const t = useTranslation(); + const hasManagerPermission = usePermission('view-all-canned-responses'); + const hasMonitorPermission = usePermission('save-department-canned-responses'); + + const { + control, + formState: { errors }, + watch, + } = useFormContext(); const clickable = css` cursor: pointer; `; + const { text, scope } = watch(); + const [preview, setPreview] = useState(false); + + const shortcutField = useUniqueId(); + const publicRadioField = useUniqueId(); + const departmentRadioField = useUniqueId(); + const privateRadioField = useUniqueId(); + const departmentField = useUniqueId(); + return ( - <> - - {t('Shortcut')} - + + {t('Shortcut')} + ( + + )} /> - {errors.shortcut} + {errors?.shortcut && ( + + {errors.shortcut.message} + + )} - + {t('Message')} - - {previewState ? t('Editor') : t('Preview')} - + {text !== '' && ( + setPreview(!preview)}> + {preview ? t('Editor') : t('Preview')} + + )} - {previewState ? : } + {preview ? ( + + ) : ( + } + /> + )} + {errors?.text && {errors.text.message}} - - + + } /> - {(isManager || isMonitor) && ( + {(hasManagerPermission || hasMonitorPermission) && ( <> - - {t('Sharing')} - {radioDescription} - - - + + + {t('Public')} + + ( + onChange('global')} + disabled={hasMonitorPermission && !hasManagerPermission} + checked={value === 'global'} + aria-describedby={`${publicRadioField}-hint`} + /> + )} + /> + + + {t('Canned_Response_Sharing_Public_Description')} + + + + {t('Department')} + + ( + onChange('department')} + checked={value === 'department'} + aria-describedby={`${departmentRadioField}-hint`} + /> + )} + /> + + + {t('Canned_Response_Sharing_Department_Description')} + + + + {t('Private')} + + ( + onChange('user')} + checked={value === 'user'} + aria-describedby={`${privateRadioField}-hint`} + /> + )} + /> + + + {t('Canned_Response_Sharing_Private_Description')} {scope === 'department' && ( - - {t('Department')} - - {errors.departmentId} + + {t('Department')} + + ( + + )} + /> + + {errors?.departmentId && ( + + {errors.departmentId.message} + + )} )} )} - +
); }; diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponse.stories.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponse.stories.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponse.stories.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponse.stories.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponse.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponse.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponse.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponse.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponseList.stories.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.stories.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponseList.stories.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.stories.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponseList.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx similarity index 97% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponseList.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx index 782511de3c4e..dd8b078c82da 100644 --- a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/CannedResponseList.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx @@ -61,6 +61,8 @@ const CannedResponseList: FC<{ debounceDelay: 200, }); + const cannedItem = cannedItems.find((canned) => canned._id === cannedId); + return ( <> @@ -112,11 +114,11 @@ const CannedResponseList: FC<{ )} - {cannedId && ( + {cannedItem && ( canned._id === (cannedId as unknown))} + cannedItem={cannedItem} onClickBack={onClickItem} onClickUse={onClickUse} reload={reload} diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/Item.stories.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/Item.stories.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/Item.stories.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/Item.stories.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/Item.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/Item.tsx similarity index 100% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/Item.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/Item.tsx diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/WrapCannedResponse.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponse.tsx similarity index 61% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/WrapCannedResponse.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponse.tsx index f59fff8c91a8..6cf89689f296 100644 --- a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/WrapCannedResponse.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponse.tsx @@ -1,48 +1,37 @@ +import type { ILivechatDepartment, IOmnichannelCannedResponse } from '@rocket.chat/core-typings'; import { useSetModal, usePermission } from '@rocket.chat/ui-contexts'; import type { FC, MouseEvent, MouseEventHandler } from 'react'; import React, { memo } from 'react'; -import CreateCannedResponse from '../../CannedResponse/modals'; +import CreateCannedResponse from '../../modals/CreateCannedResponse'; import CannedResponse from './CannedResponse'; const WrapCannedResponse: FC<{ allowUse: boolean; - cannedItem: any; + cannedItem: IOmnichannelCannedResponse & { departmentName: ILivechatDepartment['name'] }; onClickBack: MouseEventHandler; onClickUse: (e: MouseEvent, text: string) => void; reload: () => void; -}> = ({ - allowUse, - cannedItem: { _id, departmentName, departmentId, shortcut, tags, scope, text } = {}, - onClickBack, - onClickUse, - reload, -}) => { +}> = ({ allowUse, cannedItem, onClickBack, onClickUse, reload }) => { const setModal = useSetModal(); const onClickEdit = (): void => { - setModal(); + setModal( setModal(null)} reloadCannedList={reload} />); }; const hasManagerPermission = usePermission('view-all-canned-responses'); const hasMonitorPermission = usePermission('save-department-canned-responses'); - const allowEdit = hasManagerPermission || (hasMonitorPermission && scope !== 'global') || scope === 'user'; + const allowEdit = hasManagerPermission || (hasMonitorPermission && cannedItem.scope !== 'global') || cannedItem.scope === 'user'; return ( { - onClickUse(e, text); + onClickUse(e, cannedItem?.text); }} /> ); diff --git a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/index.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponseList.tsx similarity index 94% rename from apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/index.tsx rename to apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponseList.tsx index 345240e5bdae..25108d095418 100644 --- a/apps/meteor/ee/client/omnichannel/components/contextualBar/CannedResponse/index.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/WrapCannedResponseList.tsx @@ -11,7 +11,7 @@ import { useRoom } from '../../../../../../client/views/room/contexts/RoomContex import { useRoomToolbox } from '../../../../../../client/views/room/contexts/RoomToolboxContext'; import { useCannedResponseFilterOptions } from '../../../hooks/useCannedResponseFilterOptions'; import { useCannedResponseList } from '../../../hooks/useCannedResponseList'; -import CreateCannedResponse from '../../CannedResponse/modals'; +import CreateCannedResponse from '../../modals/CreateCannedResponse'; import CannedResponseList from './CannedResponseList'; export const WrapCannedResponseList = () => { @@ -62,7 +62,7 @@ export const WrapCannedResponseList = () => { }; const onClickCreate = (): void => { - setModal(); + setModal( setModal(null)} reloadCannedList={reload} />); }; return ( diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/CreateCannedResponseModal.stories.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/CreateCannedResponseModal.stories.tsx new file mode 100644 index 000000000000..dbe3575ebf7f --- /dev/null +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/CreateCannedResponseModal.stories.tsx @@ -0,0 +1,18 @@ +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import React from 'react'; + +import CreateCannedResponseModal from './CreateCannedResponseModal'; + +export default { + title: 'Enterprise/Omnichannel/CreateCannedResponseModal', + component: CreateCannedResponseModal, + parameters: { + actions: { + argTypesRegex: '^on.*', + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ; + +export const Default = Template.bind({}); diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/CreateCannedResponseModal.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/CreateCannedResponseModal.tsx new file mode 100644 index 000000000000..15b65e6b42e3 --- /dev/null +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/CreateCannedResponseModal.tsx @@ -0,0 +1,82 @@ +import type { ILivechatDepartment, IOmnichannelCannedResponse } from '@rocket.chat/core-typings'; +import { Box } from '@rocket.chat/fuselage'; +import { useEndpoint, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; +import React, { memo, useCallback } from 'react'; +import { FormProvider, useForm } from 'react-hook-form'; + +import GenericModal from '../../../../../../client/components/GenericModal'; +import CannedResponseForm from '../../components/cannedResponseForm'; + +const getInitialData = ( + cannedResponseData: (IOmnichannelCannedResponse & { departmentName: ILivechatDepartment['name'] }) | undefined, +) => ({ + _id: cannedResponseData?._id || '', + shortcut: cannedResponseData?.shortcut || '', + text: cannedResponseData?.text || '', + tags: + cannedResponseData?.tags && Array.isArray(cannedResponseData.tags) + ? cannedResponseData.tags.map((tag: string) => ({ label: tag, value: tag })) + : [], + scope: cannedResponseData?.scope || 'user', + departmentId: cannedResponseData?.departmentId || '', +}); + +const CreateCannedResponseModal = ({ + cannedResponseData, + onClose, + reloadCannedList, +}: { + cannedResponseData?: IOmnichannelCannedResponse & { departmentName: ILivechatDepartment['name'] }; + onClose: () => void; + reloadCannedList: () => void; +}) => { + const t = useTranslation(); + const dispatchToastMessage = useToastMessageDispatch(); + + const methods = useForm({ defaultValues: getInitialData(cannedResponseData) }); + const { + handleSubmit, + formState: { isDirty }, + } = methods; + + const saveCannedResponse = useEndpoint('POST', '/v1/canned-responses'); + + const handleCreate = useCallback( + async ({ departmentId, ...data }) => { + try { + await saveCannedResponse({ + _id: cannedResponseData?._id, + ...data, + ...(departmentId && { departmentId }), + }); + dispatchToastMessage({ + type: 'success', + message: t(cannedResponseData?._id ? 'Canned_Response_Updated' : 'Canned_Response_Created'), + }); + onClose(); + reloadCannedList?.(); + } catch (error) { + dispatchToastMessage({ type: 'error', message: error }); + } + }, + [cannedResponseData?._id, saveCannedResponse, onClose, dispatchToastMessage, t, reloadCannedList], + ); + + return ( + } + > + + + + + ); +}; + +export default memo(CreateCannedResponseModal); diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/index.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/index.tsx new file mode 100644 index 000000000000..7ff4371c0bd4 --- /dev/null +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/modals/CreateCannedResponse/index.tsx @@ -0,0 +1 @@ +export { default } from './CreateCannedResponseModal'; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/useRemoveCannedResponse.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/useRemoveCannedResponse.tsx new file mode 100644 index 000000000000..2d0f5f36ab28 --- /dev/null +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/useRemoveCannedResponse.tsx @@ -0,0 +1,43 @@ +import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useSetModal, useToastMessageDispatch, useRouter, useMethod, useTranslation } from '@rocket.chat/ui-contexts'; +import { useQueryClient } from '@tanstack/react-query'; +import React from 'react'; + +import GenericModal from '../../../../client/components/GenericModal'; + +export const useRemoveCannedResponse = () => { + const t = useTranslation(); + const setModal = useSetModal(); + const router = useRouter(); + const queryClient = useQueryClient(); + + const dispatchToastMessage = useToastMessageDispatch(); + const removeCannedResponse = useMethod('removeCannedResponse'); + + const handleDelete = useMutableCallback((id) => { + const onDeleteCannedResponse: () => Promise = async () => { + try { + await removeCannedResponse(id); + queryClient.invalidateQueries(['getCannedResponses']); + router.navigate('/omnichannel/canned-responses'); + dispatchToastMessage({ type: 'success', message: t('Canned_Response_Removed') }); + } catch (error) { + dispatchToastMessage({ type: 'error', message: error }); + } finally { + setModal(null); + } + }; + + setModal( + setModal(null)} + onClose={() => setModal(null)} + confirmText={t('Delete')} + />, + ); + }); + + return handleDelete; +}; diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.stories.tsx b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.stories.tsx deleted file mode 100644 index 4bc899cdf691..000000000000 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.stories.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { action } from '@storybook/addon-actions'; -import type { ComponentMeta, ComponentStory } from '@storybook/react'; -import React from 'react'; - -import CreateCannedResponseModal from './CreateCannedResponseModal'; - -export default { - title: 'Enterprise/Omnichannel/CreateCannedResponseModal', - component: CreateCannedResponseModal, - parameters: { - actions: { - argTypesRegex: '^on.*', - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ; - -export const Default = Template.bind({}); -Default.args = { - isManager: true, - values: { - shortcut: 'test', - tags: ['test'], - scope: 'department', - }, - handlers: { - handleShortcut: action('handleShortcut'), - handleTags: action('handleTags'), - handleDepartment: action('handleDepartment'), - }, - errors: {}, - hasUnsavedChanges: true, - radioHandlers: { - setPublic: action('setPublic'), - setDepartment: action('setDepartment'), - setPrivate: action('setPrivate'), - }, - radioDescription: 'Anyone in the selected department can access this canned response', -}; diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx deleted file mode 100644 index 1efba3a83b99..000000000000 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { Button, Modal } from '@rocket.chat/fuselage'; -import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC, ReactNode } from 'react'; -import React, { memo } from 'react'; - -import CannedResponseForm from '../../../../cannedResponses/components/cannedResponseForm'; - -const CreateCannedResponseModal: FC<{ - isManager: boolean; - isMonitor: boolean; - values: any; - handlers: any; - errors: any; - hasUnsavedChanges: boolean; - radioHandlers: any; - radioDescription: string; - onClose: (modal: ReactNode) => void; - onSave: () => void; - onPreview: () => void; - previewState: boolean; -}> = ({ - isManager, - isMonitor, - values, - handlers, - errors, - hasUnsavedChanges, - radioHandlers, - radioDescription, - onClose, - onSave, - onPreview, - previewState, -}) => { - const t = useTranslation(); - - const { _id, shortcut, text, scope, departmentId } = values; - - const checkDepartment = scope !== 'department' || (scope === 'department' && departmentId); - - const canSave = shortcut && text && checkDepartment; - - return ( - - - {_id ? t('Edit_Canned_Response') : t('Create_canned_response')} - { - onClose(null); - }} - /> - - - - - - - - - - - - ); -}; - -export default memo(CreateCannedResponseModal); diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/SharingOptions.tsx b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/SharingOptions.tsx deleted file mode 100644 index 6e7bc5ab0c4b..000000000000 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/SharingOptions.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Box, RadioButton } from '@rocket.chat/fuselage'; -import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; -import React, { memo } from 'react'; - -const SharingOptions: FC<{ - isMonitor: boolean; - isManager: boolean; - scope: string; - radioHandlers: any; -}> = ({ isMonitor, isManager, scope, radioHandlers: { setPublic, setPrivate, setDepartment } }) => { - const t = useTranslation(); - - return ( - <> - - - {t('Public')} - - - - {t('Department')} - - - - {t('Private')} - - - ); -}; - -export default memo(SharingOptions); diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx deleted file mode 100644 index 9285bc5ae942..000000000000 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { useSetModal, useToastMessageDispatch, usePermission, useEndpoint, useTranslation } from '@rocket.chat/ui-contexts'; -import type { FC } from 'react'; -import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; - -import { useForm } from '../../../../../../../client/hooks/useForm'; -import CreateCannedResponseModal from './CreateCannedResponseModal'; - -const WrapCreateCannedResponseModal: FC<{ data?: any; reloadCannedList?: any }> = ({ data, reloadCannedList }) => { - const t = useTranslation(); - const closeModal = useSetModal(); - const dispatchToastMessage = useToastMessageDispatch(); - - const saveCannedResponse = useEndpoint('POST', '/v1/canned-responses'); - - const hasManagerPermission = usePermission('view-all-canned-responses'); - const hasMonitorPermission = usePermission('save-department-canned-responses'); - - const form = useForm({ - _id: data ? data._id : '', - shortcut: data ? data.shortcut : '', - text: data ? data.text : '', - tags: data?.tags && Array.isArray(data.tags) ? data.tags.map((tag: string) => ({ label: tag, value: tag })) : [], - scope: data ? data.scope : 'user', - departmentId: data?.departmentId ? data.departmentId : '', - }); - - const { values, handlers, hasUnsavedChanges } = form; - - const [errors, setErrors] = useState({}); - const [radioDescription, setRadioDescription] = useState(t('Canned_Response_Sharing_Private_Description')); - const [preview, setPreview] = useState(false); - - const listErrors = useMemo(() => { - const empty: any = {}; - - for (const [key, value] of Object.entries(values)) { - if (['shortcut', 'text'].includes(key) && !value) { - empty[key] = t('Field_required'); - } - } - - if (values.scope === 'department' && !values.departmentId) { - empty.departmentId = t('Field_required'); - } - - return empty; - }, [t, values]); - - useEffect(() => { - setErrors(listErrors); - }, [values.shortcut, values.text, values.departmentId, listErrors]); - - const radioHandlers = { - setPublic: (): void => { - handlers.handleScope('global'); - handlers.handleDepartmentId(''); - setRadioDescription(t('Canned_Response_Sharing_Public_Description')); - }, - setDepartment: (): void => { - handlers.handleScope('department'); - setRadioDescription(t('Canned_Response_Sharing_Department_Description')); - }, - setPrivate: (): void => { - handlers.handleScope('user'); - handlers.handleDepartmentId(''); - setRadioDescription(t('Canned_Response_Sharing_Private_Description')); - }, - }; - - const onSave = useCallback(async (): Promise => { - try { - const { _id, shortcut, text, scope, tags, departmentId } = values as { - _id: string; - shortcut: string; - text: string; - scope: string; - tags: any; - departmentId: string; - }; - await saveCannedResponse({ - ...(_id && { _id }), - shortcut, - text, - scope, - tags, - ...(departmentId && { departmentId }), - }); - dispatchToastMessage({ - type: 'success', - message: t(_id ? 'Canned_Response_Updated' : 'Canned_Response_Created'), - }); - closeModal(null); - reloadCannedList?.(); - } catch (error: unknown) { - dispatchToastMessage({ type: 'error', message: error }); - } - }, [values, saveCannedResponse, dispatchToastMessage, t, closeModal, reloadCannedList]); - - const onPreview = (): void => { - setPreview(!preview); - }; - - return ( - - ); -}; - -export default memo(WrapCreateCannedResponseModal); diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/index.ts b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/index.ts deleted file mode 100644 index 64809214fcde..000000000000 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './CreateCannedResponse'; diff --git a/apps/meteor/ee/lib/misc/Utilities.js b/apps/meteor/ee/lib/misc/Utilities.ts similarity index 70% rename from apps/meteor/ee/lib/misc/Utilities.js rename to apps/meteor/ee/lib/misc/Utilities.ts index 3d2d9a96270d..5ce7184aa601 100644 --- a/apps/meteor/ee/lib/misc/Utilities.js +++ b/apps/meteor/ee/lib/misc/Utilities.ts @@ -1,9 +1,31 @@ export class Utilities { - static getI18nKeyForApp(key, appId) { - return key && `apps-${appId}-${key}`; + static getI18nKeyForApp(key: TKey, appId: TAppId) { + return `app-${appId}.${key}` as const; } - static curl({ method, params, auth, headers = {}, url, query, content }, opts = {}) { + static curl( + { + method, + params, + auth, + headers = {}, + url, + query, + content, + }: { + method: string; + params?: Record; + auth?: string; + headers?: Record; + url: string; + query?: Record; + content?: unknown; + }, + opts: { + verbose?: boolean; + headers?: boolean; + } = {}, + ) { const newLine = '\\\n '; const cmd = ['curl']; @@ -45,7 +67,7 @@ export class Utilities { } // headers - const headerKeys = []; + const headerKeys: string[] = []; Object.entries(headers).forEach(([key, val]) => { key = key.toLowerCase(); headerKeys.push(key); diff --git a/apps/meteor/ee/server/lib/deviceManagement/session.ts b/apps/meteor/ee/server/lib/deviceManagement/session.ts index 33ed220f4183..7d68f89942cd 100644 --- a/apps/meteor/ee/server/lib/deviceManagement/session.ts +++ b/apps/meteor/ee/server/lib/deviceManagement/session.ts @@ -2,6 +2,7 @@ import type { ISocketConnection } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; import { Accounts } from 'meteor/accounts-base'; import { Meteor } from 'meteor/meteor'; +import moment from 'moment'; import { UAParser } from 'ua-parser-js'; import * as Mailer from '../../../../app/mailer/server/api'; @@ -58,6 +59,8 @@ export const listenSessionLogin = () => { return; } + const dateFormat = settings.get('Message_TimeAndDateFormat'); + const { name, username, @@ -75,6 +78,7 @@ export const listenSessionLogin = () => { }`, ipInfo: connection.clientAddress, userAgent: '', + date: moment().format(String(dateFormat)), }; switch (device.type) { diff --git a/apps/meteor/ee/server/lib/deviceManagement/startup.ts b/apps/meteor/ee/server/lib/deviceManagement/startup.ts index 963f479f5675..ee79d34da651 100644 --- a/apps/meteor/ee/server/lib/deviceManagement/startup.ts +++ b/apps/meteor/ee/server/lib/deviceManagement/startup.ts @@ -18,7 +18,7 @@ export const createEmailTemplates = async (): Promise => { }); await this.add( 'Device_Management_Email_Body', - '

{Login_Detected}

[name] ([username]) {Logged_In_Via}

{Device_Management_Client}: [browserInfo]
{Device_Management_OS}: [osInfo]
{Device_Management_Device}: [deviceInfo]
{Device_Management_IP}:[ipInfo]

[userAgent]

{Access_Your_Account}

{Or_Copy_And_Paste_This_URL_Into_A_Tab_Of_Your_Browser}
[SITE_URL]

{Thank_You_For_Choosing_RocketChat}

', + '

{Login_Detected}

[name] ([username]) {Logged_In_Via}

{Device_Management_Client}: [browserInfo]
{Device_Management_OS}: [osInfo]
{Device_Management_Device}: [deviceInfo]
{Device_Management_IP}:[ipInfo]
{Date}: [date]

[userAgent]

{Access_Your_Account}

{Or_Copy_And_Paste_This_URL_Into_A_Tab_Of_Your_Browser}
[SITE_URL]

{Thank_You_For_Choosing_RocketChat}

', { type: 'code', code: 'text/html', diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md index 4aebc6d6445c..7836b8eb1868 100644 --- a/apps/meteor/ee/server/services/CHANGELOG.md +++ b/apps/meteor/ee/server/services/CHANGELOG.md @@ -1,5 +1,55 @@ # rocketchat-services +## 1.1.15-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 1.1.15-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 1.1.15-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 1.1.15-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 1.1.15-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 1.1.15-rc.2 ### Patch Changes @@ -39,6 +89,36 @@ - @rocket.chat/rest-typings@6.5.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 1.1.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 1.1.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 1.1.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 1.1.14 ### Patch Changes diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 5f0c33919d50..d6d6c527fbfc 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -1,7 +1,7 @@ { "name": "rocketchat-services", "private": true, - "version": "1.1.15-rc.2", + "version": "1.1.18-rc.0", "description": "Rocket.Chat Authorization service", "main": "index.js", "scripts": { @@ -40,7 +40,7 @@ "fibers": "^5.0.3", "jaeger-client": "^3.19.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.6.1", "pino": "^8.15.0", @@ -51,13 +51,13 @@ }, "devDependencies": { "@rocket.chat/icons": "^0.32.0", - "@types/cookie": "^0.5.1", - "@types/cookie-parser": "^1.4.3", - "@types/ejson": "^2.2.0", - "@types/express": "^4.17.17", - "@types/fibers": "^3.1.1", - "@types/node": "^14.18.51", - "@types/ws": "^8.5.5", + "@types/cookie": "^0.5.3", + "@types/cookie-parser": "^1.4.5", + "@types/ejson": "^2.2.1", + "@types/express": "^4.17.20", + "@types/fibers": "^3.1.3", + "@types/node": "^14.18.63", + "@types/ws": "^8.5.8", "npm-run-all": "^4.1.5", "pino-pretty": "^7.6.1", "pm2": "^5.2.0", diff --git a/apps/meteor/ee/server/startup/engagementDashboard.ts b/apps/meteor/ee/server/startup/engagementDashboard.ts index ca5dda577bb0..f7a18f1f347b 100644 --- a/apps/meteor/ee/server/startup/engagementDashboard.ts +++ b/apps/meteor/ee/server/startup/engagementDashboard.ts @@ -1,17 +1,14 @@ import { License } from '@rocket.chat/license'; -import { Meteor } from 'meteor/meteor'; License.onToggledFeature('engagement-dashboard', { - up: () => - Meteor.startup(async () => { - const { prepareAnalytics, attachCallbacks } = await import('../lib/engagementDashboard/startup'); - await prepareAnalytics(); - attachCallbacks(); - await import('../api/engagementDashboard'); - }), - down: () => - Meteor.startup(async () => { - const { detachCallbacks } = await import('../lib/engagementDashboard/startup'); - detachCallbacks(); - }), + up: async () => { + const { prepareAnalytics, attachCallbacks } = await import('../lib/engagementDashboard/startup'); + await prepareAnalytics(); + attachCallbacks(); + await import('../api/engagementDashboard'); + }, + down: async () => { + const { detachCallbacks } = await import('../lib/engagementDashboard/startup'); + detachCallbacks(); + }, }); diff --git a/apps/meteor/lib/callbacks.ts b/apps/meteor/lib/callbacks.ts index 4d59f52e9cd6..77f8c4ae910d 100644 --- a/apps/meteor/lib/callbacks.ts +++ b/apps/meteor/lib/callbacks.ts @@ -50,7 +50,6 @@ interface EventLikeCallbackSignatures { 'livechat.removeAgentDepartment': (params: { departmentId: ILivechatDepartmentRecord['_id']; agentsId: ILivechatAgent['_id'][] }) => void; 'livechat.saveAgentDepartment': (params: { departmentId: ILivechatDepartmentRecord['_id']; agentsId: ILivechatAgent['_id'][] }) => void; 'livechat.closeRoom': (params: { room: IOmnichannelRoom; options: CloseRoomParams['options'] }) => void; - 'livechat.saveRoom': (room: IRoom) => void; 'livechat:afterReturnRoomAsInquiry': (params: { room: IRoom }) => void; 'livechat.setUserStatusLivechat': (params: { userId: IUser['_id']; status: OmnichannelAgentStatus }) => void; 'livechat.agentStatusChanged': (params: { userId: IUser['_id']; status: UserStatus }) => void; diff --git a/apps/meteor/lib/utils/exhaustiveCheck.ts b/apps/meteor/lib/utils/exhaustiveCheck.ts new file mode 100644 index 000000000000..bf09ea3f6bad --- /dev/null +++ b/apps/meteor/lib/utils/exhaustiveCheck.ts @@ -0,0 +1,3 @@ +export const exhaustiveCheck = (_: never): never => { + throw new Error('Exhaustive check failed'); +}; diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 0d25ab558dbd..b05ca652c839 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -37,8 +37,9 @@ "test:e2e:federation": "playwright test --config=playwright-federation.config.ts", "test:e2e:nyc": "nyc report --reporter=text-summary --reporter=lcov", "testapi": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.api.js", - "testunit": "npm run .testunit:definition && npm run .testunit:client && npm run .testunit:server", + "testunit": "npm run .testunit:definition && npm run .testunit:client && npm run .testunit:server:cov", ".testunit:server": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.js", + ".testunit:server:cov": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' nyc -r text -r lcov mocha --config ./.mocharc.js", ".testunit:client": "jest --silent && TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.client.js --exit", ".testunit:definition": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.definition.js", "testunit-watch": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --watch --config ./.mocharc.js", @@ -64,13 +65,13 @@ }, "devDependencies": { "@axe-core/playwright": "^4.7.3", - "@babel/core": "~7.22.9", - "@babel/eslint-parser": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/eslint-parser": "~7.22.15", "@babel/plugin-proposal-nullish-coalescing-operator": "~7.18.6", "@babel/plugin-proposal-optional-chaining": "~7.21.0", - "@babel/preset-env": "~7.22.9", - "@babel/preset-react": "~7.22.5", - "@babel/register": "~7.22.5", + "@babel/preset-env": "~7.22.20", + "@babel/preset-react": "~7.22.15", + "@babel/register": "~7.22.15", "@faker-js/faker": "~8.0.2", "@playwright/test": "^1.37.1", "@rocket.chat/eslint-config": "workspace:^", @@ -84,85 +85,85 @@ "@storybook/addons": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "0.0.13", - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", "@tanstack/react-query-devtools": "^4.19.1", "@testing-library/react": "~12.1.5", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "~13.5.0", - "@types/adm-zip": "^0.5.0", - "@types/archiver": "^5.3.2", - "@types/bad-words": "^3.0.1", - "@types/bcrypt": "^5.0.0", - "@types/body-parser": "^1.19.2", - "@types/busboy": "^1.5.0", - "@types/chai": "^4.3.5", - "@types/chai-as-promised": "^7.1.5", - "@types/chai-datetime": "0.0.37", - "@types/chai-dom": "0.0.13", - "@types/chai-spies": "~1.0.3", + "@types/adm-zip": "^0.5.3", + "@types/archiver": "^5.3.4", + "@types/bad-words": "^3.0.2", + "@types/bcrypt": "^5.0.1", + "@types/body-parser": "^1.19.4", + "@types/busboy": "^1.5.2", + "@types/chai": "^4.3.9", + "@types/chai-as-promised": "^7.1.7", + "@types/chai-datetime": "0.0.38", + "@types/chai-dom": "1.11.2", + "@types/chai-spies": "~1.0.5", "@types/clipboard": "^2.0.7", - "@types/codemirror": "^5.60.8", - "@types/cookie-parser": "^1.4.3", - "@types/cors": "^2.8.13", - "@types/cssom": "^0.4.1", + "@types/codemirror": "^5.60.12", + "@types/cookie-parser": "^1.4.5", + "@types/cors": "^2.8.15", + "@types/cssom": "^0.4.2", "@types/dompurify": "^2.3.3", - "@types/ejson": "^2.2.0", - "@types/express": "^4.17.17", + "@types/ejson": "^2.2.1", + "@types/express": "^4.17.20", "@types/express-rate-limit": "^5.1.3", - "@types/fibers": "^3.1.1", - "@types/google-libphonenumber": "^7.4.23", - "@types/gravatar": "^1.8.3", + "@types/fibers": "^3.1.3", + "@types/google-libphonenumber": "^7.4.29", + "@types/gravatar": "^1.8.5", "@types/he": "^1.1.2", - "@types/i18next-sprintf-postprocessor": "^0.2.0", - "@types/imap": "^0.8.37", + "@types/i18next-sprintf-postprocessor": "^0.2.2", + "@types/imap": "^0.8.39", "@types/jsdom": "^16.2.15", - "@types/jsdom-global": "^3.0.4", - "@types/jsrsasign": "^10.5.8", - "@types/later": "^1.2.7", + "@types/jsdom-global": "^3.0.6", + "@types/jsrsasign": "^10.5.11", + "@types/later": "^1.2.8", "@types/ldapjs": "^2.2.5", - "@types/less": "~3.0.3", - "@types/lodash.get": "^4.4.7", - "@types/mailparser": "^3.4.0", + "@types/less": "~3.0.5", + "@types/lodash.get": "^4.4.8", + "@types/mailparser": "^3.4.3", "@types/marked": "^4.0.8", - "@types/meteor-collection-hooks": "^0.8.6", + "@types/meteor-collection-hooks": "^0.8.8", "@types/mkdirp": "^1.0.2", "@types/mocha": "github:whitecolor/mocha-types", "@types/moment-timezone": "^0.5.30", - "@types/node": "^14.18.51", - "@types/node-gcm": "^1.0.1", - "@types/node-rsa": "^1.1.1", - "@types/nodemailer": "^6.4.8", - "@types/oauth2-server": "^3.0.13", - "@types/parseurl": "^1.3.1", - "@types/photoswipe": "^4.1.2", - "@types/prometheus-gc-stats": "^0.6.2", - "@types/proxyquire": "^1.3.28", - "@types/psl": "^1.1.0", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", - "@types/rewire": "^2.5.28", - "@types/sanitize-html": "^2.9.0", + "@types/node": "^14.18.63", + "@types/node-gcm": "^1.0.3", + "@types/node-rsa": "^1.1.3", + "@types/nodemailer": "^6.4.13", + "@types/oauth2-server": "^3.0.15", + "@types/parseurl": "^1.3.2", + "@types/photoswipe": "^4.1.5", + "@types/prometheus-gc-stats": "^0.6.3", + "@types/proxyquire": "^1.3.30", + "@types/psl": "^1.1.2", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", + "@types/rewire": "^2.5.29", + "@types/sanitize-html": "^2.9.3", "@types/semver": "^7.3.10", "@types/sharp": "^0.30.5", - "@types/sinon": "^10.0.15", - "@types/strict-uri-encode": "^2.0.0", + "@types/sinon": "^10.0.20", + "@types/strict-uri-encode": "^2.0.1", "@types/string-strip-html": "^5.0.1", - "@types/supertest": "^2.0.12", - "@types/textarea-caret": "^3.0.1", - "@types/ua-parser-js": "^0.7.36", - "@types/use-subscription": "^1.0.0", - "@types/use-sync-external-store": "^0.0.3", + "@types/supertest": "^2.0.15", + "@types/textarea-caret": "^3.0.2", + "@types/ua-parser-js": "^0.7.38", + "@types/use-subscription": "^1.0.1", + "@types/use-sync-external-store": "^0.0.5", "@types/uuid": "^8.3.4", - "@types/xml-crypto": "~1.4.2", - "@types/xml-encryption": "~1.2.1", + "@types/xml-crypto": "~1.4.4", + "@types/xml-encryption": "~1.2.3", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "autoprefixer": "^9.8.8", "babel-loader": "^8.3.0", "babel-plugin-array-includes": "^2.0.3", "babel-plugin-istanbul": "^6.1.1", - "chai": "^4.3.7", + "chai": "^4.3.10", "chai-as-promised": "^7.1.1", "chai-datetime": "^1.8.0", "chai-dom": "^1.11.0", @@ -174,22 +175,22 @@ "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-import": "~2.26.0", "eslint-plugin-no-floating-promise": "~1.0.2", - "eslint-plugin-playwright": "~0.15.0", + "eslint-plugin-playwright": "~0.15.3", "eslint-plugin-prettier": "~4.2.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-testing-library": "~5.11.0", + "eslint-plugin-testing-library": "~5.11.1", "eslint-plugin-you-dont-need-lodash-underscore": "~6.12.0", "fast-glob": "^3.2.12", - "i18next": "~23.4.5", - "jest": "~29.6.1", + "i18next": "~23.4.9", + "jest": "~29.6.4", "jsdom-global": "^3.0.2", "mocha": "^9.2.2", "nyc": "^15.1.0", "outdent": "~0.8.0", "pino-pretty": "^7.6.1", - "playwright-qase-reporter": "^1.2.0-alpha.3", - "postcss": "~8.4.24", + "playwright-qase-reporter": "^1.2.1", + "postcss": "~8.4.31", "postcss-custom-properties": "^11.0.0", "postcss-easy-import": "^3.0.0", "postcss-load-config": "^3.1.4", @@ -210,7 +211,7 @@ "typescript": "~5.2.2" }, "dependencies": { - "@babel/runtime": "~7.22.6", + "@babel/runtime": "~7.22.15", "@bugsnag/js": "~7.20.2", "@bugsnag/plugin-react": "~7.19.0", "@google-cloud/storage": "^6.11.0", @@ -221,7 +222,7 @@ "@nivo/line": "0.80.0", "@nivo/pie": "0.80.0", "@react-aria/color": "^3.0.0-beta.15", - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/account-utils": "workspace:^", "@rocket.chat/agenda": "workspace:^", "@rocket.chat/api-client": "workspace:^", @@ -280,14 +281,14 @@ "@slack/bolt": "^3.14.0", "@slack/rtm-api": "^6.0.0", "@tanstack/react-query": "^4.16.1", - "@types/cookie": "^0.5.1", + "@types/cookie": "^0.5.3", "@types/katex": "^0.14.0", - "@types/lodash": "^4.14.195", - "@types/lodash.debounce": "^4.0.7", - "@types/object-path": "^0.11.1", - "@types/proxy-from-env": "^1.0.1", - "@types/speakeasy": "^2.0.7", - "@xmldom/xmldom": "^0.8.8", + "@types/lodash": "^4.14.200", + "@types/lodash.debounce": "^4.0.8", + "@types/object-path": "^0.11.3", + "@types/proxy-from-env": "^1.0.3", + "@types/speakeasy": "^2.0.9", + "@xmldom/xmldom": "^0.8.10", "adm-zip": "0.5.10", "ajv": "^8.11.0", "ajv-formats": "~2.1.1", @@ -307,7 +308,7 @@ "change-case": "^4.1.2", "chart.js": "^3.8.0", "clipboard": "^2.0.11", - "codemirror": "^5.65.13", + "codemirror": "^5.65.15", "colorette": "^2.0.20", "colors": "^1.4.0", "connect": "^3.7.0", @@ -335,8 +336,8 @@ "file-type": "^16.5.4", "filenamify": "^4.3.0", "filesize": "9.0.11", - "generate-password": "^1.7.0", - "google-libphonenumber": "^3.2.32", + "generate-password": "^1.7.1", + "google-libphonenumber": "^3.2.33", "googleapis": "^104.0.0", "gravatar": "^1.8.2", "he": "^1.2.0", @@ -357,7 +358,7 @@ "jsdom": "^16.7.0", "jsrsasign": "^10.5.24", "juice": "^8.0.0", - "katex": "^0.16.7", + "katex": "~0.16.9", "ldap-escape": "^2.0.6", "ldapjs": "^2.3.3", "limax": "^3.0.0", @@ -372,7 +373,7 @@ "mime-db": "^1.52.0", "mime-type": "^4.0.0", "mkdirp": "^1.0.4", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "moment": "^2.29.4", "moment-timezone": "^0.5.43", "mongo-message-queue": "^1.0.0", @@ -393,24 +394,24 @@ "pino": "^8.15.0", "postis": "^2.2.0", "prom-client": "^14.0.1", - "prometheus-gc-stats": "^0.6.4", + "prometheus-gc-stats": "^0.6.5", "proxy-from-env": "^1.1.0", "psl": "^1.8.0", "query-string": "^7.1.3", "queue-fifo": "^0.2.6", - "rc-scrollbars": "^1.1.5", + "rc-scrollbars": "^1.1.6", "react": "~17.0.2", "react-aria": "~3.23.1", "react-dom": "~17.0.2", "react-error-boundary": "^3.1.4", "react-hook-form": "~7.45.4", - "react-i18next": "~13.2.1", + "react-i18next": "~13.2.2", "react-keyed-flatten-children": "^1.3.0", "react-virtuoso": "^1.11.1", "redis": "^4.0.6", "sanitize-html": "^2.7.2", "semver": "^7.3.7", - "sharp": "^0.30.7", + "sharp": "^0.32.6", "sip.js": "^0.20.1", "sodium-native": "^3.3.0", "sodium-plus": "^0.9.0", @@ -425,7 +426,7 @@ "turndown": "^7.1.2", "twilio": "^3.76.1", "twit": "^2.2.11", - "ua-parser-js": "^1.0.35", + "ua-parser-js": "^1.0.37", "underscore": "^1.13.6", "universal-perf-hooks": "^1.0.1", "url-polyfill": "^1.1.12", @@ -433,7 +434,7 @@ "use-sync-external-store": "^1.2.0", "uuid": "^8.3.2", "vm2": "^3.9.19", - "webdav": "^4.11.2", + "webdav": "^4.11.3", "xml-crypto": "~3.1.0", "xml-encryption": "~3.0.2", "xml2js": "~0.5.0", @@ -452,26 +453,6 @@ "volta": { "extends": "../../package.json" }, - "nyc": { - "include": [ - "**/*.js", - "**/*.ts" - ], - "exclude": [ - ".houston", - ".meteor", - ".scripts", - ".snapcraft", - ".storybook", - "node_modules", - "**/.mocharc.js", - "**/.mocharc.api.js", - "**/.mocharc.client.js", - "**/.mocharc.definition.js", - "**/tests/*" - ], - "all": true - }, "installConfig": { "hoistingLimits": "workspaces" }, diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json index 42feea83fda0..90db76e13637 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json @@ -2757,5 +2757,6 @@ "registration.component.form.invalidConfirmPass": "Die wagwoord bevestiging pas nie by die wagwoord nie", "registration.component.form.confirmPassword": "Bevestig jou wagwoord", "registration.component.form.sendConfirmationEmail": "Stuur bevestiging e-pos", + "Enterprise": "onderneming", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json index c6d61a871a1c..6c7813ba0a8a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json @@ -875,8 +875,6 @@ "Cloud_register_offline_finish_helper": "بعد الانتهاء من عملية التسجيل في وحدة التحكم السحابية، يجب عرض بعض النصوص عليك. يُرجى لصقها هنا لإنهاء التسجيل.", "Cloud_register_offline_helper": "يمكن تسجيل مساحات العمل يدويًا إذا كانت معزولة بفجوة هواء أو تم تقييد الوصول إلى الشبكة. انسخ النص أدناه وانتقل إلى وحدة التحكم السحابية لإكمال العملية.", "Cloud_register_success": "تم تسجيل مساحة العمل الخاصة بك بنجاح!", - "Cloud_registration_pending_html": "لن تعمل الإشعارات المنبثقة حتى يتم الانتهاء من التسجيل. تعرف على المزيد ", - "Cloud_registration_pending_title": "التسجيل السحابي لا يزال معلقًا", "Cloud_registration_required": "التسجيل مطلوب", "Cloud_registration_required_description": "يبدو أنك لم تختر تسجيل مساحة العمل الخاصة بك أثناء الإعداد.", "Cloud_registration_required_link_text": "انقر هنا لتسجيل مساحة العمل الخاصة بك.", @@ -1493,7 +1491,7 @@ "E2E_key_reset_email": "إشعار إعادة تعيين مفتاح التشفير بين الطرفيات", "E2E_message_encrypted_placeholder": "هذه الرسالة مشفرة من طرف إلى طرف. لعرضه ، يجب عليك إدخال مفتاح التشفير في إعدادات حسابك.", "E2E_password_request_text": "للوصول إلى مجموعاتك الخاصة المشفرة والرسائل المباشرة، أدخل كلمة مرور التشفير.
سيلزمك إدخال كلمة المرور هذه لتشفير/فك تشفير رسائلك على كل عميل تستخدمه، نظرًا إلى أن المفتاح غير مخزن على الخادم.", - "E2E_password_reveal_text": "يمكنك الآن إنشاء مجموعات خاصة مشفرة ورسائل مباشرة. يمكنك أيضًا تغيير المجموعات الخاصة الموجودة أو الرسائل المباشرة إلى مشفرة.

هذا تشفير بين الطرفيات حتى لا يتم حفظ مفتاح تشفير/فك تشفير رسائلك على الخادم. لهذا السبب سيلزمك تخزين كلمة المرور هذه في مكان آمن. سيُطلب منك إدخالها على الأجهزة الأخرى التي ترغب في استخدام التشفير بين الطرفيات عليها. تعرف على المزيد هنا!

كلمة المرور الخاصة بك هي: ‎%s‎

هذه كلمة مرور تم إنشاؤها تلقائيًا، يمكنك إعداد كلمة مرور جديدة لمفتاح التشفير الخاص بك في أي وقت من أي متصفح قمت بإدخال كلمة المرور الحالية فيه.
يتم تخزين كلمة المرور هذه على هذا المستعرض فقط حتى تقوم بتخزين كلمة المرور ورفض هذه الرسالة.", + "E2E_password_reveal_text": "يمكنك الآن إنشاء مجموعات خاصة مشفرة ورسائل مباشرة. يمكنك أيضًا تغيير المجموعات الخاصة الموجودة أو الرسائل المباشرة إلى مشفرة.

هذا تشفير بين الطرفيات حتى لا يتم حفظ مفتاح تشفير/فك تشفير رسائلك على الخادم. لهذا السبب سيلزمك تخزين كلمة المرور هذه في مكان آمن. سيُطلب منك إدخالها على الأجهزة الأخرى التي ترغب في استخدام التشفير بين الطرفيات عليها. تعرف على المزيد هنا!

كلمة المرور الخاصة بك هي: ‎{{randomPassword}}‎

هذه كلمة مرور تم إنشاؤها تلقائيًا، يمكنك إعداد كلمة مرور جديدة لمفتاح التشفير الخاص بك في أي وقت من أي متصفح قمت بإدخال كلمة المرور الحالية فيه.
يتم تخزين كلمة المرور هذه على هذا المستعرض فقط حتى تقوم بتخزين كلمة المرور ورفض هذه الرسالة.", "E2E_Reset_Email_Content": "لقد تم تسجيل خروجك تلقائيًا. عند تسجيل الدخول مرة أخرى، سيقوم Rocket.Chat بإنشاء مفتاح جديد ويستعيد وصولك إلى أي غرفة مشفرة بها عضو واحد أو أكثر على الإنترنت. نظرًا إلى طبيعة التشفير بين الطرفيات، لن يتمكن Rocket.Chat من استعادة الوصول إلى أي غرفة مشفرة ليس بها أي عضو على الإنترنت.", "E2E_Reset_Key_Explanation": "ستترتب على هذا الخيار إزالة المفتاح الحالي للتشفير بين الطرفيات الخاص بك وتسجيل خروجك.
عند تسجيل الدخول مرة أخرى، سينشئ لك Rocket.Chat مفتاحًا جديدًا وتستعيد وصولك إلى أي غرفة مشفرة بها عضو واحد أو أكثر على الإنترنت.
نظرًا إلى طبيعة التشفير بين الطرفيات، فإن Rocket.Chat لن يتمكن من استعادة الوصول إلى أي غرفة مشفرة ليس بها عضو على الإنترنت.", "E2E_Reset_Other_Key_Warning": "سيترتب على إعادة تعيين المفتاح الحالي للتشفير بين الطرفيات تسجيل خروج المستخدم. عندما يقوم المستخدم بتسجيل الدخول مرة أخرى، سيقوم Rocket.Chat بإنشاء مفتاح جديد واستعادة وصول المستخدم إلى أي غرفة مشفرة بها عضو واحد أو أكثر على الإنترنت. نظرًا إلى طبيعة التشفير بين الطرفيات، فإن Rocket.Chat لن يتمكن من استعادة الوصول إلى أي غرفة مشفرة ليس بها أي عضو على الإنترنت.", @@ -2434,6 +2432,7 @@ "LDAP_DataSync_Roles": "أدوار المزامنة", "LDAP_DataSync_Channels": "مزامنة Channel", "LDAP_DataSync_Teams": "مزامنة الفِرَق", + "LDAP_Enterprise": "مؤسسة", "LDAP_DataSync_BackgroundSync": "مزامنة الخلفية", "LDAP_Server_Type": "نوع الخادم", "LDAP_Server_Type_AD": "Active Directory", @@ -3658,6 +3657,7 @@ "SAML_AuthnRequest_Template": "قالب طلب المصادقة", "SAML_AuthnRequest_Template_Description": "المتغيرات التالية متاحة: \n- **\\_\\_newId\\_\\_**: سلسلة المعرّف التي تم إنشاؤها عشوائيًا \n- **\\_\\_instant\\_\\_**: الطابع الزمني الحالي \n- **\\_\\_callbackUrl\\_\\_**: عنوان URL لرد الاتصال Rocket.Chat. \n- **\\_\\_entryPoint\\_\\_**: قيمة إعداد {{Custom Entry Point}}. \n- **\\_\\_issuer\\_\\_**: قيمة إعداد {{Custom Issuer}}. \n- **\\_\\_identifierFormatTag\\_\\_**: محتويات {{NameID Policy Template}} إذا تم تكوين {{Identifier Format}} صالح. \n- **\\_\\_identifierFormat\\_\\_**: قيمة إعداد {{Identifier Format}}. \n- **\\_\\_authnContextTag\\_\\_**: محتويات {{AuthnContext Template}} إذا تم تكوين {{Custom Authn Context}} صالح. \n- **\\_\\_authnContextComparison\\_\\_**: قيمة إعداد{{Authn Context Comparison}}. \n- **\\_\\_authnContext\\_\\_**: قيمة إعداد {{Custom Authn Context}}.", "SAML_Connection": "اتصال", + "SAML_Enterprise": "مؤسسة", "SAML_General": "عام", "SAML_Custom_Authn_Context": "سياق المصادقة المخصص", "SAML_Custom_Authn_Context_Comparison": "مقارنة سياق المصادقة", @@ -3766,6 +3766,7 @@ "Security": "الأمان", "See_full_profile": "مشاهدة الملف الشخصي الكامل", "See_on_Engagement_Dashboard": "العرض على لوحة معلومات المشاركة", + "Select": "تحديد", "Select_a_department": "تحديد قسم", "Select_a_room": "تحديد غرفة", "Select_a_user": "تحديد مستخدم", @@ -4890,6 +4891,7 @@ "RegisterWorkspace_Features_Omnichannel_Title": "قناة متعددة الاتجاهات", "RegisterWorkspace_Setup_Label": "البريد الإلكتروني لحساب السحابة", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "أوافق على <1>البنود والشروط و<3>سياسة الخصوصية", + "Enterprise": "مؤسسة", "UpgradeToGetMore_engagement-dashboard_Title": "التحليلات", "UpgradeToGetMore_auditing_Title": "تدقيق الرسائل" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json index f5eef4b24285..d3c9146f868f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json @@ -2757,5 +2757,6 @@ "registration.component.form.invalidConfirmPass": "Şifrənin təsdiqlənməsi şifrə uyğun gəlmir", "registration.component.form.confirmPassword": "Şifrənizi təsdiqləyin", "registration.component.form.sendConfirmationEmail": "Təsdiq e-poçt göndər", + "Enterprise": "Müəssisə", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json index 326bbc0ecf59..84af45c446ff 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json @@ -2775,5 +2775,6 @@ "registration.component.form.invalidConfirmPass": "Пацвярджэнне пароля не супадае пароль", "registration.component.form.confirmPassword": "Пацвердзіць пароль", "registration.component.form.sendConfirmationEmail": "Адправіць па электроннай пошце пацвярджэнне", + "Enterprise": "прадпрыемства", "UpgradeToGetMore_engagement-dashboard_Title": "аналітыка" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json index f71214f4ce44..a4bdc836a471 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json @@ -2749,5 +2749,6 @@ "registration.component.form.invalidConfirmPass": "Потвърждението на паролата не съвпада с паролата", "registration.component.form.confirmPassword": "Потвърдите паролата", "registration.component.form.sendConfirmationEmail": "Изпратете имейл за потвърждение", + "Enterprise": "начинание", "UpgradeToGetMore_engagement-dashboard_Title": "анализ" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json index ed6b9becf11c..ff757e76e6ca 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json @@ -2745,5 +2745,6 @@ "registration.component.form.invalidConfirmPass": "Potvrda lozinke se ne slaže sa lozinkom", "registration.component.form.confirmPassword": "Potvrdi svoju lozinku", "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email", + "Enterprise": "Poduzeće", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json index c91d0043ce4a..02922d622cdf 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -870,8 +870,6 @@ "Cloud_register_offline_finish_helper": "Després de completar el procés de registre en Cloud Console, hauria d'aparèixer un text. Enganxeu-lo aquí per finalitzar el registre.", "Cloud_register_offline_helper": "Els espais de treball es poden registrar manualment si restringiu l'accés a la xarxa o l'espai d'aire. Copieu el text a continuació i aneu a la nostra consola al núvol per completar el procés.", "Cloud_register_success": "El seu espai de treball s'ha registrat correctament!", - "Cloud_registration_pending_html": " Les notificacions en dispositius mòbils no funcionessin fins que el registre hagi finalitzat. Llegir més ", - "Cloud_registration_pending_title": "El registre en el núvol encara està pendent", "Cloud_registration_required": "Cal registrar-se", "Cloud_registration_required_description": "Sembla que durant la configuració no va triar registrar el seu espai de treball.", "Cloud_registration_required_link_text": "Feu clic aquí per registrar el vostre espai de treball.", @@ -1485,7 +1483,7 @@ "E2E_Encryption_Password_Explanation": "Ara podeu crear grups privats xifrats i missatges directes. També podeu canviar els grups privats o DM existents a xifrats.

Aquest és un xifratge d'extrem a extrem, de manera que la clau per codificar / descodificar els seus missatges no es desarà al servidor. Per això, heu de desar la contrasenya en un lloc segur. Se us demanarà que l'introduïu en altres dispositius on vulgueu utilitzar el xifratge e2e.", "E2E_key_reset_email": "Notificació de reinici de clau E2E", "E2E_password_request_text": "Per accedir als seus grups privats xifrats i als missatges directes, introdueixi la contrasenya de xifrat.
Necessites introduir aquesta contrasenya per xifrar / desxifrar els teus missatges en cada client que utilitzis, ja que la clau no s'emmagatzema en el servidor.", - "E2E_password_reveal_text": "Ara podeu crear grups privats xifrats i missatges directes. També podeu canviar els grups privats o DM existents a xifrats.

Aquest és un xifratge d'extrem a extrem, de manera que la clau per codificar / descodificar els seus missatges no es desarà al servidor. Per això, heu de desar aquesta contrasenya en un lloc segur. Se us demanarà que l'introduïu en altres dispositius on vulgueu utilitzar el xifratge e2e. Obtingueu més informació aquí!

La vostra contrasenya és:%s

Aquesta és una contrasenya generada automàticament, podeu configurar una nova contrasenya per a la vostra clau de xifrat en qualsevol moment des de qualsevol navegador que hagi introduït la contrasenya existent.
Aquesta contrasenya només s'emmagatzema en aquest navegador fins que la deseu i descarteu aquest missatge.", + "E2E_password_reveal_text": "Ara podeu crear grups privats xifrats i missatges directes. També podeu canviar els grups privats o DM existents a xifrats.

Aquest és un xifratge d'extrem a extrem, de manera que la clau per codificar / descodificar els seus missatges no es desarà al servidor. Per això, heu de desar aquesta contrasenya en un lloc segur. Se us demanarà que l'introduïu en altres dispositius on vulgueu utilitzar el xifratge e2e. Obtingueu més informació aquí!

La vostra contrasenya és:{{randomPassword}}

Aquesta és una contrasenya generada automàticament, podeu configurar una nova contrasenya per a la vostra clau de xifrat en qualsevol moment des de qualsevol navegador que hagi introduït la contrasenya existent.
Aquesta contrasenya només s'emmagatzema en aquest navegador fins que la deseu i descarteu aquest missatge.", "E2E_Reset_Email_Content": "S'ha desconnectat automàticament. Quan torneu a iniciar sessió, Rocket.Chat generarà una nova clau i restaurarà el vostre accés a qualsevol sala xifrada que tingui un o més membres en línia. A causa de la naturalesa del xifratge E2E, Rocket.Chat no podrà restaurar l'accés a cap sala xifrada que no tingui membres en línia.", "E2E_Reset_Key_Explanation": "Aquesta opció eliminarà la clau E2E actual i tancarà la sessió.
Quan torneu a iniciar sessió, Rocket.Chat us generarà una nova clau i restaurarà l'accés a qualsevol sala xifrada que tingui un o més membres en línia.
A causa de la naturalesa del xifratge E2E, Rocket.Chat no podrà restaurar l'accés a cap sala xifrada que no tingui membres en línia.", "E2E_Reset_Other_Key_Warning": "Restablir la clau E2E actual tancarà la sessió de l'usuari. Quan l'usuari torna a iniciar sessió, Rocket.Chat generarà una nova clau i restaurarà l'accés de l'usuari a qualsevol sala xifrada que tingui un o més membres en línia. A causa de la naturalesa de l'xifrat E2E, Rocket.Chat no podrà restaurar l'accés a cap sala xifrada que no tingui membres en línia.", @@ -2408,6 +2406,7 @@ "LDAP_DataSync_Roles": "Funcions de sincronització", "LDAP_DataSync_Channels": "Sincronització Channels", "LDAP_DataSync_Teams": "Equips de sincronització", + "LDAP_Enterprise": "Empresa", "LDAP_DataSync_BackgroundSync": "Sincronització en segon pla", "LDAP_Server_Type": "Tipus de servidor", "LDAP_Server_Type_AD": "Directori Actiu", @@ -3598,6 +3597,7 @@ "SAML_AuthnRequest_Template": "Plantilla AuthnRequest", "SAML_AuthnRequest_Template_Description": "Les següents variables estan disponibles: \n - ** \\ _ \\ _ newId \\ _ \\ _ **: Cadena d'identificació generada aleatoriamente \n- ** \\ _ \\ _ instant \\ _ \\ _ **: Data i hora actual \n- ** \\ _ \\ _ callbackUrl \\ _ \\ _ **: la URL de devolució de trucada d'Rocket.Chat. \n- ** \\ _ \\ _ entryPoint \\ _ \\ _ **: El valor de l'opció {{Custom Entry Point }} \n- ** \\ _ \\ _ issuer \\ _ \\ _ **: El valor de l'opció {{Custom Issuer }} \n- ** \\ _ \\ _ identifierFormatTag \\ _ \\ _ **: El contingut d'{{NameID Policy Template}} si un vàlid {{Identifier Format}} és configurado. \n- ** \\ _ \\ _ identifierFormat \\ _ \\ _ **: El valor de l'opció {{Identifier Format }} \n- ** \\ _ \\ _ authnContextTag \\ _ \\ _ **: El contingut de {{AuthnContext Template}} si un vàlid {{Custom Authn Context}} és configurado. \n- ** \\ _ \\ _ authnContextComparison \\ _ \\ _ * *: El valor de l'opció {{Authn Context Comparison }} \n- ** \\ _ \\ _ authnContext \\ _ \\ _ **: El valor de l'opció {{Custom Authn Context}}", "SAML_Connection": "Connexió", + "SAML_Enterprise": "Empresa", "SAML_General": "General", "SAML_Custom_Authn_Context": "Context Authn personalitzat", "SAML_Custom_Authn_Context_Comparison": "Comparació del context d’Authn", @@ -4695,6 +4695,7 @@ "onboarding.form.registerOfflineForm.title": "Registra't sense connexió", "RegisterWorkspace_Features_Marketplace_Title": "Mercat", "RegisterWorkspace_Features_Omnichannel_Title": "LiveChat", + "Enterprise": "Empresa", "UpgradeToGetMore_engagement-dashboard_Title": "Analítiques", "UpgradeToGetMore_auditing_Title": "Auditoria de missatges" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json index 6ef85e7d4962..ef36a4dbb928 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -713,8 +713,6 @@ "Cloud_register_offline_finish_helper": "Po dokončení procesu registrace v cloudové konzoli obdržíte textový řežězec. Pro dokončení registrace jej vložte sem.", "Cloud_register_offline_helper": "Pracovní prostory lze ručně zaregistrovat, pokud je k nim omezen síťový přístup. Zkopírujte níže uvedený text a dokončete proces pomocí naší cloudové konzole.", "Cloud_register_success": "Váš pracovní prostor byl úspěšně zaregistrován!", - "Cloud_registration_pending_html": "Mobilní oznámení nebudou fungovat, dokud není registrace dokončena. Další informace ", - "Cloud_registration_pending_title": "Cloudová registrace stále čeká", "Cloud_registration_required": "Povinná registrace", "Cloud_registration_required_description": "Vypadá to, že jste se nevybral/a zaregistraci svého pracovního prostoru během instalace .", "Cloud_registration_required_link_text": "Klikněte zde pro registraci svého pracovního prostoru.", @@ -1271,7 +1269,7 @@ "E2E_Encryption_Password_Change": "Změnit heslo pro šifrování", "E2E_Encryption_Password_Explanation": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro šifrování/dešifrování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte své heslo uložit na bezpečné místo. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E.", "E2E_password_request_text": "Chcete-li získat přístup k šifrovaným soukromým skupinám a přímým zprávám, zadejte své šifrovací heslo.
Toto heslo musíte zadat, abyste mohli šifrovat/dešifrovat zprávy u každého klienta, který používáte, protože klíč není uložen na serveru.", - "E2E_password_reveal_text": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro kódování / dekódování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte toto heslo uložit někde v bezpečí. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E. Více informací zde

Vaše heslo je: %s

Jedná se o automaticky generované heslo. Nové heslo pro šifrovací klíč můžete nastavit kdykoli z jakéhokoli prohlížeče, do kterého jste zadali existující heslo.
Toto heslo je uloženo pouze v tomto prohlížeči dokud heslo neuložíte a nepotvrdíte tuto zprávu.", + "E2E_password_reveal_text": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro kódování / dekódování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte toto heslo uložit někde v bezpečí. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E. Více informací zde

Vaše heslo je: {{randomPassword}}

Jedná se o automaticky generované heslo. Nové heslo pro šifrovací klíč můžete nastavit kdykoli z jakéhokoli prohlížeče, do kterého jste zadali existující heslo.
Toto heslo je uloženo pouze v tomto prohlížeči dokud heslo neuložíte a nepotvrdíte tuto zprávu.", "E2E_Reset_Key_Explanation": "Tato možnost odstraní váš aktuální E2E klíč a odhlásí vás.
Když se znovu přihlásíte, Rocket.Chat vygeneruje nový klíč a obnoví váš přístup do jakékoli šifrované místnosti, která má jednoho nebo více členů online.
Kvůli povaze šifrování E2E nebude Rocket.Chat schopen obnovit přístup do šifrované místnosti, která nemá žádného člena online.", "E2E_Reset_Other_Key_Warning": "Odstraněním E2E klíče současně odhlásíte uživatele. Poté co se znovu přihlásí Rocket.Chat vygeneruje nový klíč a obnoví přístup do šifrovaných místností kde je alespoň jeden uživatel připoje. Vzhledem k povaze koncového šifrování, Rocket.Chat nelze obnovit přístup do místnosti kde není ani jeden uživatel právě připojen", "Edit": "Editovat", @@ -3964,6 +3962,7 @@ "registration.component.form.sendConfirmationEmail": "Zaslat potvrzovací e-mail", "onboarding.component.form.action.pasteHere": "Vložte sem ...", "onboarding.form.registerOfflineForm.title": "Registrovat ručně", + "Enterprise": "Korporace", "UpgradeToGetMore_engagement-dashboard_Title": "Analytika", "UpgradeToGetMore_auditing_Title": "Audit zpráv" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json index 5e3589014899..c3b473dab7ce 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json @@ -2748,5 +2748,6 @@ "registration.component.form.invalidConfirmPass": "Nid yw'r cadarnhad cyfrinair yn cyfateb i'r cyfrinair", "registration.component.form.confirmPassword": "Cadarnhau eich cyfrinair", "registration.component.form.sendConfirmationEmail": "Anfon ebost cadarnhad", + "Enterprise": "Menter", "UpgradeToGetMore_engagement-dashboard_Title": "Dadansoddiadau" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json index 79eb2743394a..4bf7e41fb9e1 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json @@ -717,8 +717,6 @@ "Cloud_register_offline_finish_helper": "Efter afslutningen af registreringsprocessen i Cloud Console, skal du præsenteres for noget tekst. Indsæt det her for at afslutte registreringen.", "Cloud_register_offline_helper": "Arbejdsområder kan registreres manuelt, hvis der ikke er netværksadgang eller den er begrænset. Kopier teksten nedenfor og gå til vores Cloud Console for at afslutte processen.", "Cloud_register_success": "Dit workspace er blevet registreret!", - "Cloud_registration_pending_html": " Mobil-notifikationer fungerer ikke før registreringen er afsluttet. Lær mere ", - "Cloud_registration_pending_title": "Cloudregistrering afventer stadig", "Cloud_registration_required": "Registrering er påkrævet", "Cloud_registration_required_description": "Under opsætningen valgte du tilsyneladende ikke at registrere dit workspace.", "Cloud_registration_required_link_text": "Tryk her for at registrere dit workspace.", @@ -1277,7 +1275,7 @@ "E2E_Encryption_Password_Explanation": "Du kan nu oprette krypterede private grupper og direkte beskeder. Du kan også ændre eksisterende private grupper eller direkte beskeder til at være krypteret.

Dette er ende-til-ende-kryptering så nøglen til at kode/afkode dine beskeder gemmes ikke på serveren. Derfor skal du gemme dit kodeord et sikkert sted. Du bliver bedt om at indtaste det på andre enheder hvor du vil bruge ende-til-ende-kryptering på.", "E2E_key_reset_email": "E2E Key nulstilning notifikation", "E2E_password_request_text": "For at få adgang til dine krypterede private grupper og direkte beskeder, skal du indtaste dit krypteringsadgangskode.
Du skal indtaste denne adgangskode for at kryptere/dekryptere dine meddelelser på hver klient du bruger, da nøglen ikke er gemt på serveren.", - "E2E_password_reveal_text": "Du kan nu oprette krypterede private grupper og direkte beskeder. Du kan også ændre eksisterende private grupper eller direkte beskeder til at være krypteret.

Dette er end-to-end-kryptering, så nøglen til at kryptere/dekryptere dine beskeder gemmes ikke på serveren. Derfor skal du gemme denne kode et sikkert sted. Du bliver bedt om at indtaste det på andre enheder du vil bruge end-to-end-kryptering på. Lær mere her!

Dit kodeord er: %s

Dette er en automatisk genereret kode. Du kan angive en ny kode til din krypteringsnøgle når som helst fra en hvilken som helst browser, hvor du har indtastet den eksisterende kode.
Dette kodeord gemmes kun i denne browser indtil du gemmer koden og afslutter denne meddelelse.", + "E2E_password_reveal_text": "Du kan nu oprette krypterede private grupper og direkte beskeder. Du kan også ændre eksisterende private grupper eller direkte beskeder til at være krypteret.

Dette er end-to-end-kryptering, så nøglen til at kryptere/dekryptere dine beskeder gemmes ikke på serveren. Derfor skal du gemme denne kode et sikkert sted. Du bliver bedt om at indtaste det på andre enheder du vil bruge end-to-end-kryptering på. Lær mere her!

Dit kodeord er: {{randomPassword}}

Dette er en automatisk genereret kode. Du kan angive en ny kode til din krypteringsnøgle når som helst fra en hvilken som helst browser, hvor du har indtastet den eksisterende kode.
Dette kodeord gemmes kun i denne browser indtil du gemmer koden og afslutter denne meddelelse.", "E2E_Reset_Email_Content": "Du er automatisk blevet logget ud. Når du logger ind igen, genererer Rocket.Chat en ny nøgle og gendanner din adgang til ethvert krypteret rum, der har et eller flere medlemmer online. På grund af E2E-krypteringens art, er Rocket.Chat ikke i stand til at gendanne adgang til krypterede rum, der ikke har noget medlem online.", "E2E_Reset_Key_Explanation": "Denne mulighed fjerner din nuværende E2E-nøgle og logger dig ud.
Når du logger ind igen vil Rocket.Chat generere dig en ny nøgle og gendanne din adgang til ethvert krypteret rum der har et eller flere medlemmer online.
På grund af E2E-krypteringens natur, vil Rocket.Chat ikke være i stand til at gendanne adgang til nogen krypterede rum der ikke har noget medlem online.", "E2E_Reset_Other_Key_Warning": "Nulstilling af den aktuelle E2E-nøgle logge brugeren ud. Når brugeren logger på igen, vil Rocket.Chat generere en ny nøgle og gendanne brugeradgangen til alle krypterede rum, der har et eller flere medlemmer online. På grund af E2E-krypteringens, er Rocket.Chat ikke i stand til at gendanne adgang til noget krypteret rum, der ikke har noget medlem online.", @@ -3986,6 +3984,7 @@ "registration.component.form.sendConfirmationEmail": "Send bekræftelses-email", "onboarding.component.form.action.pasteHere": "Indsæt her ...", "onboarding.form.registerOfflineForm.title": "Registrer offline", + "Enterprise": "Firma", "UpgradeToGetMore_engagement-dashboard_Title": "Analyse", "UpgradeToGetMore_auditing_Title": "Meddelelsesovervågning" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json index be9adb9f18f2..18325e65a0f9 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json @@ -2757,5 +2757,6 @@ "registration.component.form.invalidConfirmPass": "Die Passwörter stimmen nicht überein.", "registration.component.form.confirmPassword": "Bestätigen Sie Ihr Passwort.", "registration.component.form.sendConfirmationEmail": "Bestätigungsmail versenden", + "Enterprise": "Unternehmen", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json index 83c76f7c1882..5947c8517e54 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json @@ -1052,7 +1052,7 @@ "E2E_Enabled": "E2E aktiviert", "E2E_Encryption_Password_Explanation": "Du kannst jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Du kannst auch vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Bitte bewahre Dein Passwort an einem sicheren Ort auf - Du musst ihn auf anderen Geräten eingeben, auf denen Du die Ende-zu-Ende-Verschlüsselung verwenden möchtest.", "E2E_password_request_text": "Gib Dein Verschlüsselungskennwort ein, um auf Deine verschlüsselten privaten Gruppen und Direktnachrichten zuzugreifen.
Du musst dieses Kennwort eingeben, da der Schlüssel nirgends gespeichert ist.", - "E2E_password_reveal_text": "Du kannst jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Du kannst auch vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher musst Du den Schlüssel an einem sicheren Ort aufbewahren - Du musst ihn auf anderen Geräten eingeben, auf denen Due die Ende-zu-Ende-Verschlüsselung verwenden möchtest.Erfahre hier mehr!

Dein Passwort lautet: %s

Es handelt sich um ein generiertes Passwort. Du kannst jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Deinem Browser nur so lange zwischengespeichert, bis Du ein neues Passwort vergeben und diese Nachricht bestätigt hast.", + "E2E_password_reveal_text": "Du kannst jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Du kannst auch vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher musst Du den Schlüssel an einem sicheren Ort aufbewahren - Du musst ihn auf anderen Geräten eingeben, auf denen Due die Ende-zu-Ende-Verschlüsselung verwenden möchtest.Erfahre hier mehr!

Dein Passwort lautet: {{randomPassword}}

Es handelt sich um ein generiertes Passwort. Du kannst jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Deinem Browser nur so lange zwischengespeichert, bis Du ein neues Passwort vergeben und diese Nachricht bestätigt hast.", "Edit": "Bearbeiten", "Edit_Custom_Field": "Benutzerdefinierte Felder bearbeiten", "Edit_Department": "Abteilung bearbeiten", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json index 4163c48d413f..533503f4edaf 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json @@ -987,8 +987,6 @@ "Cloud_register_offline_finish_helper": "Nach Abschluss des Registrierungsvorgangs in der Cloud-Konsole sollte ein Text angezeigt werden. Bitte hier einfügen, um die Registrierung abzuschließen.", "Cloud_register_offline_helper": "Arbeitsbereiche können manuell registriert werden, wenn ein Airgap besteht oder der Netzwerkzugriff eingeschränkt ist. Kopieren Sie den folgenden Text und rufen Sie unsere Cloud-Konsole auf, um den Vorgang abzuschließen.", "Cloud_register_success": "Ihr Arbeitsbereich wurde erfolgreich registriert!", - "Cloud_registration_pending_html": "Push-Benachrichtigungen funktionieren nicht, bis die Registrierung abgeschlossen ist. Mehr erfahren", - "Cloud_registration_pending_title": "Die Cloud-Registrierung steht noch aus", "Cloud_registration_required": "Registrierung erforderlich", "Cloud_registration_required_description": "Es sieht aus, als hätten Sie sich während des Setups nicht für die Registrierung Ihres Arbeitsbereichs entschieden.", "Cloud_registration_required_link_text": "Klicken Sie hier, um Ihren Arbeitsbereich zu registrieren.", @@ -1677,7 +1675,7 @@ "E2E_key_reset_email": "E2E-Schlüssel-Reset-Benachrichtigung", "E2E_message_encrypted_placeholder": "Diese Nachricht ist Ende-zu-Ende verschlüsselt. Um sie anzusehen, müssen Sie Ihren Verschlüsselungscode in Ihren Kontoeinstellungen eingeben.", "E2E_password_request_text": "Geben Sie Ihr Verschlüsselungskennwort ein, um auf Ihre verschlüsselten privaten Gruppen und Direktnachrichten zuzugreifen.
Sie müssen dieses Kennwort eingeben, da der Schlüssel nicht auf dem Server gespeichert ist.", - "E2E_password_reveal_text": "Sie können jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Sie können auch bereits vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher müssen Sie den Schlüssel an einem sicheren Ort aufbewahren - Sie müssen ihn auf anderen Geräten eingeben, auf denen Sie die Ende-zu-Ende-Verschlüsselung verwenden möchten.Erfahren Sie mehr hier!

Ihr Passwort lautet: %s

Es handelt sich um ein automatisch erzeugtes Passwort. Sie können jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Ihrem Browser nur so lange zwischengespeichert, bis Sie dies speichern und diese Nachricht bestätigen.", + "E2E_password_reveal_text": "Sie können jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Sie können auch bereits vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher müssen Sie den Schlüssel an einem sicheren Ort aufbewahren - Sie müssen ihn auf anderen Geräten eingeben, auf denen Sie die Ende-zu-Ende-Verschlüsselung verwenden möchten.Erfahren Sie mehr hier!

Ihr Passwort lautet: {{randomPassword}}

Es handelt sich um ein automatisch erzeugtes Passwort. Sie können jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Ihrem Browser nur so lange zwischengespeichert, bis Sie dies speichern und diese Nachricht bestätigen.", "E2E_Reset_Email_Content": "Sie wurden automatisch abgemeldet. Wenn Sie sich erneut anmelden, wird Rocket.Chat einen neuen Schlüssel generieren und IHren Zugang zu allen verschlüsselten Räumen wiederherstellen, in denen ein oder mehrere Mitglieder online sind. Aufgrund der Natur der E2E-Verschlüsselung ist Rocket.Chat nicht in der Lage, den Zugang zu einem verschlüsselten Raum wiederherzustellen, in dem kein Mitglied online ist.", "E2E_Reset_Key_Explanation": "Diese Option entfernt Ihren aktuelle Ende-zu-Ende-Schlüssel und meldet Sie ab.
Wenn Sie sich erneut anmelden, generiert Rocket.Chat einen neuen Schlüssel und stellt Ihren Zugriff auf einen verschlüsselten Raum wieder her, in dem mindestens ein Mitglied online ist.
Aufgrund der Art der Ende-zu-Ende Verschlüsselung, kann Rocket.Chat den Zugriff auf verschlüsselte Räume, mit kein Mitglied online, nicht wiederherstellen. ", "E2E_Reset_Other_Key_Warning": "Wenn Sie den aktuellen E2E-Schlüssel zurücksetzt, wird der Benutzer abgemeldet. Wenn sich der Benutzer erneut anmeldet, generiert Rocket.Chat einen neuen Schlüssel und stellt den Zugang des Benutzers zu allen verschlüsselten Räumen wieder her, in denen ein oder mehrere Mitglieder online sind. Aufgrund der Natur der E2E-Verschlüsselung ist Rocket.Chat nicht in der Lage, den Zugang zu einem verschlüsselten Raum wiederherzustellen, in dem kein Mitglied online ist.", @@ -2721,6 +2719,7 @@ "LDAP_DataSync_Roles": "Synchronisationsrollen", "LDAP_DataSync_Channels": "Synchronisationskanäle", "LDAP_DataSync_Teams": "Synchronisationsteams", + "LDAP_Enterprise": "Unternehmen", "LDAP_DataSync_BackgroundSync": "Hintergrundsynchronisierung", "LDAP_Server_Type": "Servertyp", "LDAP_Server_Type_AD": "Active Directory", @@ -4119,6 +4118,7 @@ "SAML_AuthnRequest_Template": "AuthnRequest-Vorlage", "SAML_AuthnRequest_Template_Description": "Die folgenden Variablen sind verfügbar: \n- **\\_\\_newId\\_\\_**: Zufällig erzeugte ID-Zeichenfolge \n- **\\_\\_instant\\_\\_**: Aktuelle Zeitmarke \n- **\\_\\_callbackUrl\\_\\_**: Die Rückruf-URL von Rocket.Chat. \n- **\\_\\_entryPoint\\_\\_**: Der Wert der Einstellung {{Custom Entry Point}} \n- **\\_\\_issuer\\_\\_**: Der Wert der Einstellung {{Custom Issuer}} \n- **\\_\\_identifierFormatTag\\_\\_**: Der Inhalt von {{NameID Policy Template}}, wenn ein gültiges {{Identifier Format}} konfiguriert ist. \n- **\\_\\_identifierFormat\\_\\_**: Der Wert der Einstellung {{Identifier Format}} \n- **\\_\\_authnContextTag\\_\\_**: Der Inhalt von {{AuthnContext Template}}, wenn ein gültiger {{Custom Authn Context}} konfiguriert ist. \n- **\\_\\_authnContextComparison\\_\\_**: Der Wert der Einstellung {{Authn Context Comparison}} \n- **\\_\\_authnContext\\_\\_**: Der Wert der Einstellung {{Custom Authn Context}}", "SAML_Connection": "Verbindung", + "SAML_Enterprise": "Unternehmen", "SAML_General": "Allgemein", "SAML_Custom_Authn_Context": "Benutzerdefinierter Authn-Kontext", "SAML_Custom_Authn_Context_Comparison": "Authn-Kontextvergleich", @@ -4242,6 +4242,7 @@ "See_full_profile": "Gesamtes Profil ansehen", "See_history": "Verlauf anzeigen", "See_on_Engagement_Dashboard": "Auf Einsatz-Dashboard anzeigen", + "Select": "Auswählen", "Select_a_department": "Abteilung wählen", "Select_a_room": "Einen Raum auswählen", "Select_a_user": "Einen Benutzer wählen", @@ -5521,6 +5522,7 @@ "RegisterWorkspace_Connection_Error": "Beim Verbinden ist ein Fehler aufgetreten", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ich bin mit den Nutzungsvereinbarung und den Datenschutzbestimmungen einverstanden", "Uninstall_grandfathered_app": "{{appName}} deinstallieren?", + "Enterprise": "Unternehmen", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "Nachrichtenüberprüfung" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json index d547bf11304d..57c07c0b8129 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json @@ -2766,5 +2766,6 @@ "registration.component.form.invalidConfirmPass": "Η επιβεβαίωση κωδικού δεν ταιριάζει με τον αρχικό κωδικό", "registration.component.form.confirmPassword": "Επιβεβαιώστε τον κωδικό σας", "registration.component.form.sendConfirmationEmail": "Αποστολή email επιβεβαίωσης", + "Enterprise": "Επιχείρηση", "UpgradeToGetMore_engagement-dashboard_Title": "Αναλυτικά στοιχεία" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 1b84e684b02d..d2eff45bb499 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1060,8 +1060,6 @@ "Cloud_register_offline_finish_helper": "After completing the registration process in the Cloud Console you should be presented with some text. Please paste it here to finish the registration.", "Cloud_register_offline_helper": "Workspaces can be manually registered if airgapped or network access is restricted. Copy the text below and go to our Cloud Console to complete the process.", "Cloud_register_success": "Your workspace has been successfully registered!", - "Cloud_registration_pending_html": "Push notifications will not work until the registration is finished. Learn more", - "Cloud_registration_pending_title": "Cloud registration is still pending", "Cloud_registration_required": "Registration Required", "Cloud_registration_required_description": "Looks like during setup you didn't chose to register your workspace.", "Cloud_registration_required_link_text": "Click here to register your workspace.", @@ -1861,7 +1859,7 @@ "Enterprise_Departments_description_free_trial": "Workspaces on Community Edition can create one department. Start a free Enterprise trial to create multiple departments today!", "email_style_description": "Avoid nested selectors", "email_style_label": "Email Style", - "Enterprise_Description": "Manually update your Enterprise license.", + "Enterprise_Description": "Manually update your Premium license.", "Email_subject": "Email Subject", "Enterprise_License": "Enterprise License", "Enterprise_License_Description": "If your workspace is registered and license is provided by Rocket.Chat cloud you don't need to manually update the license here.", @@ -2257,7 +2255,7 @@ "Field_required": "Field required", "File": "File", "File_Downloads_Started": "File Downloads Started", - "File_exceeds_allowed_size_of_bytes": "File exceeds allowed size of {{size}}.", + "File_exceeds_allowed_size_of_bytes": "File size exceeds upload limit of {{size}}.", "File_name_Placeholder": "Search files...", "File_not_allowed_direct_messages": "File sharing not allowed in direct messages.", "File_Path": "File Path", @@ -6162,7 +6160,7 @@ "Premium": "Premium", "Enterprise": "Premium", "Premium_capability": "Premium capability", - "Operating_withing_plan_limits": "Operating withing plan limits", + "Operating_withing_plan_limits": "Operating within plan limits", "Plan_limits_reached": "Plan limits reached", "Workspace_not_registered": "Workspace not registered", "Users_Connected": "Users connected", @@ -6237,4 +6235,4 @@ "Unlimited_seats": "Unlimited seats", "Unlimited_MACs": "Unlimited MACs", "Unlimited_seats_MACs": "Unlimited seats and MACs" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json index 8a9c04f729b2..68ec0dbe60f3 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json @@ -2758,5 +2758,6 @@ "registration.component.form.invalidConfirmPass": "La konfirmilo de pasvorto ne kongruas kun pasvorto", "registration.component.form.confirmPassword": "Konfirmu vian pasvorton", "registration.component.form.sendConfirmationEmail": "Sendu konfirman retpoŝton", + "Enterprise": "Entrepreno", "UpgradeToGetMore_engagement-dashboard_Title": "Analitiko" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json index 1b2af26be2f8..c73f295d77af 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json @@ -1,11 +1,28 @@ { "500": "Error interno del servidor", + "__agents__agents_and__count__conversations__period__": "{{agents}} agentes y {{count}} conversaciones, {{period}}", "__count__empty_rooms_will_be_removed_automatically": "{{count}} salas vacías se eliminarán automáticamente.", "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} salas vacías se eliminarán automáticamente.
{{rooms}}.", + "__count__message_pruned": "{{count}} mensaje borrado", + "__count__message_pruned_plural": "{{count}} mensajes borrados", + "__count__conversations__period__": "{{count}} conversaciones, {{period}}", + "__count__tags__and__count__conversations__period__": "{{count}} etiquetas y {{conversations}} conversaciones, {{period}}", + "__departments__departments_and__count__conversations__period__": "{{departments}} departamentos y {{count}} conversaciones, {{period}}", + "__usersCount__member_joined": "{{usersCount}} miembro se ha unido", + "__usersCount__member_joined_plural": "{{usersCount}} miembros se han unido", + "__usersCount__people_will_be_invited": "{{usersCount}} miembros sern invitados", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} ya no es {{role}} (por {{user_by}})", "__username__was_set__role__by__user_by_": "{{username}} se ha establecido como {{role}} por {{user_by}}", + "__count__without__department__": "{{count}} sin departamentos", + "__count__without__tags__": "{{count}} sin etiquetas", + "__count__without__assignee__": "{{count}} sin un agente asignado", + "removed__username__as__role_": "se removió {{username}} como {{role}}", + "set__username__as__role_": " se estableció a {{username}} como {{role}}", "This_room_encryption_has_been_enabled_by__username_": "El cifrado de esta sala ha sido habilitado por {{username}}", "This_room_encryption_has_been_disabled_by__username_": "El cifrado de esta sala ha sido deshabilitado por {{username}}", + "Enabled_E2E_Encryption_for_this_room": "El cifrado de punto a punto fue habilitado para esta sala", + "disabled": "Deshabilitado", + "Disabled_E2E_Encryption_for_this_room": "El cifrado de punto a punto fue deshabilitado para esta sala", "@username": "@usuario", "@username_message": "@usuario ", "#channel": "#canal", @@ -865,8 +882,6 @@ "Cloud_register_offline_finish_helper": "Después de completar el proceso de registro en Cloud Console, debería aparecer un texto. Pégalo aquí para finalizar el registro.", "Cloud_register_offline_helper": "Los espacios de trabajo se pueden registrar manualmente si el espacio está aislado o el acceso de red está restringido. Copia el texto que aparece a continuación y ve a Cloud Console para completar el proceso.", "Cloud_register_success": "Tu espacio de trabajo se ha registrado correctamente", - "Cloud_registration_pending_html": "Las notificaciones push no funcionarán hasta que el registro haya finalizado. Más información", - "Cloud_registration_pending_title": "El registro en la nube aún está pendiente", "Cloud_registration_required": "Registro obligatorio", "Cloud_registration_required_description": "Parece que durante la configuración decidiste no registrar tu espacio de trabajo.", "Cloud_registration_required_link_text": "Haz clic aquí para registrar tu espacio de trabajo.", @@ -2411,6 +2426,7 @@ "LDAP_DataSync_Roles": "Sincronizar roles", "LDAP_DataSync_Channels": "Sincronizar Channels", "LDAP_DataSync_Teams": "Sincronizar equipos", + "LDAP_Enterprise": "Empresa", "LDAP_DataSync_BackgroundSync": "Sincronización en segundo plano", "LDAP_Server_Type": "Tipo de servidor", "LDAP_Server_Type_AD": "Active Directory", @@ -3628,6 +3644,7 @@ "SAML_AuthnRequest_Template": "Plantilla AuthnRequest", "SAML_AuthnRequest_Template_Description": "Las siguientes variables están disponibles: \n- **\\_\\_newId\\_\\_**: Cadena de identificación generada aleatoriamente \n- **\\_\\_instant\\_\\_**: Fecha y hora actual \n- **\\_\\_callbackUrl\\_\\_**: URL de devolución de llamada de Rocket.Chat \n- **\\_\\_entryPoint\\_\\_**: Valor del ajuste {{Custom Entry Point}} \n- **\\_\\_issuer\\_\\_**: Valor del ajuste {{Custom Issuer}} \n- **\\_\\_identifierFormatTag\\_\\_**: Contenido de {{NameID Policy Template}} si un {{Identifier Format}} válido está configurado \n- **\\_\\_identifierFormat\\_\\_**: Valor del ajuste {{Identifier Format}} \n- **\\_\\_authnContextTag\\_\\_**: Contenido de {{AuthnContext Template}} si un {{Custom Authn Context}} válido está configurado \n- **\\_\\_authnContextComparison\\_\\_**: Valor del ajuste {{Authn Context Comparison}} \n- **\\_\\_authnContext\\_\\_**: Valor del ajuste {{Custom Authn Context}}", "SAML_Connection": "Conexión", + "SAML_Enterprise": "Empresa", "SAML_General": "General", "SAML_Custom_Authn_Context": "Contexto de autenticación personalizado", "SAML_Custom_Authn_Context_Comparison": "Comparación de contexto de autenticación", @@ -3737,6 +3754,7 @@ "See_documentation": "Ver documentación", "See_full_profile": "Ver perfil completo", "See_on_Engagement_Dashboard": "Ver en Panel de interacción", + "Select": "Seleccionar", "Select_a_department": "Seleccionar un departamento", "Select_a_room": "Seleccionar una sala", "Select_a_user": "Seleccionar un usuario", @@ -4611,17 +4629,24 @@ "Voip_call_wrapup": "Se han añadido notas de cierre: {{comment}}", "VoIP_JWT_Secret": "Secreto JWT VoIP", "VoIP_JWT_Secret_description": "Te permite definir una clave secreta para compartir datos de extensión de servidor a cliente como JWT en vez de en texto sin formato. Si no lo configuras, los datos de registro de la extensión se enviarán como texto sin formato.", + "Voip_is_disabled": "VoIP desactivado", + "Voip_is_disabled_description": "Para ver la lista de extensiones es necesario activar VoIP, hágalo en la pestaña Configuración.", + "VoIP_Toggle": "Activar/desactivar VoIP", "Chat_opened_by_visitor": "Chat abierto por el visitante", "Wait_activation_warning": "Antes de poder iniciar sesión, un administrador debe activar tu cuenta manualmente.", + "Waiting_for_answer": "Esperando respuesta", "Waiting_queue": "Cola de espera", + "Enterprise_cap_description": "Los espacios de trabajo para empresas no tienen límite en el servicio de presencia.", "Waiting_queue_message": "Mensaje de cola de espera", "Waiting_queue_message_description": "Mensaje que se mostrará a los visitantes cuando entren en la cola", "Waiting_Time": "Tiempo de espera", + "Waiting_for_server_connection": "Esperando la conexión del servidor,", "Warning": "Advertencia", "Warnings": "Advertencias", "WAU_value": "WAU: {{value}}", "We_appreciate_your_feedback": "Agradecemos tus comentarios", "We_are_offline_Sorry_for_the_inconvenience": "Estamos fuera de línea. Disculpa las molestias.", + "We_Could_not_retrive_any_data": "No pudimos recuperar ningún dato", "We_have_sent_password_email": "Te hemos enviado un correo electrónico con instrucciones para restablecer la contraseña. Si no recibes un correo en breve, vuelve e inténtalo de nuevo.", "We_have_sent_registration_email": "Te hemos enviado un correo electrónico para confirmar tu registro. Si no recibes un correo en breve, vuelve e inténtalo de nuevo.", "Webdav Integration": "Integración con WebDAV", @@ -4636,8 +4661,11 @@ "webdav-account-updated": "Cuenta de WebDAV actualizada", "Webhook_Details": "Detalles de webhook", "Webhook_URL": "URL de webhook", + "Webhook_URL_not_set": "La URL del webhook no está configurada", "Webhooks": "Webhooks", + "WebRTC": "WebRTC", "WebRTC_Call": "Llamada WebRTC", + "WebRTC_Call_unavailable_for_federation": "La llamada WebRTC no está disponible para las salas federadas", "WebRTC_direct_audio_call_from_%s": "Llamada de audio directa de %s", "WebRTC_direct_video_call_from_%s": "Videollamada directa de %s", "WebRTC_Enable_Channel": "Habilitar para Channels públicos", @@ -4667,14 +4695,18 @@ "will_be_able_to": "será capaz de", "Will_be_available_here_after_saving": "Estará disponible aquí después de guardar.", "Without_priority": "Sin prioridad", + "Without_SLA": "Sin SLA", "Worldwide": "En todo el mundo", "Would_you_like_to_return_the_inquiry": "¿Quieres devolver la solicitud?", "Would_you_like_to_return_the_queue": "¿Quieres devolver esta sala a la cola? Todo el historial de conversaciones se conservará en la sala.", "Would_you_like_to_place_chat_on_hold": "¿Quieres poner este chat en espera?", + "Wrap_up_the_call": "Cierre de llamada", "Wrap_Up_Notes": "Notas de cierre", + "Workspace": "Espacio de trabajo", "Yes": "Sí", "Yes_archive_it": "Sí, archivarlo", "Yes_clear_all": "Sí, borrar todo", + "Yes_continue": "Sí, ¡continúe!", "Yes_deactivate_it": "Sí, desactivar", "Yes_delete_it": "Sí, eliminar", "Yes_hide_it": "Sí, ocultar", @@ -4686,8 +4718,15 @@ "yesterday": "ayer", "Yesterday": "Ayer", "You": "Tú", + "You_reacted_with": "Has reaccionado con {{emoji}}", + "Users_reacted_with": "{{users}} reaccionaron con {{emoji}}", + "Users_and_more_reacted_with": "{{users}} y {{counter}} más reaccionaron con {{emoji}}", + "You_and_users_Reacted_with": "Tú y {{users}} reaccionaron con {{emoji}}", + "You_users_and_more_Reacted_with": "Tú, {{users}} y {{counter}} más reaccionaron con {{emoji}}", "You_are_converting_team_to_channel": "Vas a convertir este equipo en un Channel.", "you_are_in_preview_mode_of": "Estás en modo de vista previa del canal #{{room_name}}", + "you_are_in_preview": "Estás en el modo de vista previa", + "you_are_in_preview_please_insert_the_password": "Introduzca la contraseña", "you_are_in_preview_mode_of_incoming_livechat": "Estás en el modo de vista previa de este chat", "You_are_logged_in_as": "Has iniciado sesión como", "You_are_not_authorized_to_view_this_page": "No tienes autorización para ver esta página.", @@ -4701,6 +4740,7 @@ "You_followed_this_message": "Sigues este mensaje.", "You_have_a_new_message": "Tienes un nuevo mensaje", "You_have_been_muted": "Se te ha silenciado y no puedes hablar en esta sala", + "You_have_been_removed_from__roomName_": "Usted ha sido eliminado de la sala {{roomName}}", "You_have_joined_a_new_call_with": "Te has unido a una nueva llamada con", "You_have_n_codes_remaining": "Te quedan {{number}} códigos.", "You_have_not_verified_your_email": "Aún no has verificado tu correo electrónico.", @@ -4743,23 +4783,45 @@ "Your_TOTP_has_been_reset": "Tu TOTP de segundo factor se ha restablecido.", "Your_workspace_is_ready": "Tu espacio de trabajo está listo para usar 🎉", "Zapier": "Zapier", + "registration.page.login.errors.wrongCredentials": "Usuario no encontrado o contraseña incorrecta.", + "registration.page.login.errors.invalidEmail": "Correo electrónico no válido", "registration.page.login.errors.loginBlockedForIp": "El inicio de sesión se ha bloqueado temporalmente para esta IP", "registration.page.login.errors.loginBlockedForUser": "El inicio de sesión se ha bloqueado temporalmente para este usuario", "registration.page.login.errors.licenseUserLimitReached": "Se ha alcanzado el número máximo de usuarios.", "registration.page.login.errors.AppUserNotAllowedToLogin": "Los usuarios de la aplicación no pueden iniciar sesión directamente.", "registration.page.registration.waitActivationWarning": "Antes de poder iniciar sesión, un administrador debe activar tu cuenta manualmente.", + "registration.page.login.register": "¿Nuevo aquí? <1>Crear una cuenta", + "registration.page.login.forgot": "¿Has olvidado tu contraseña?", + "registration.page.register.back": "Volver al inicio de sesión", + "registration.page.emailVerification.subTitle": "Este servidor requiere direcciones de correo electrónico verificadas. Por favor, compruebe su bandeja de entrada de correo electrónico para un enlace de verificación.", + "registration.page.emailVerification.sent": "Correo electrónico de verificación enviado, por favor revise su bandeja de entrada.", "registration.page.resetPassword.sent": "Si este correo electrónico está registrado, te enviaremos instrucciones para restablecer tu contraseña. Si no recibes un correo en breve, vuelve e inténtalo de nuevo.", + "registration.page.resetPassword.sendInstructions": "Enviar instrucciones", + "registration.page.resetPassword.errors.invalidEmail": "Correo electrónico no válido", + "registration.page.poweredBy": "Desarrollado por <1>Rocket.Chat", + "registration.page.guest.chooseHowToJoin": "Elige cómo quieres unirte.", + "registration.page.guest.loginWithRocketChat": "Iniciar sesión con Rocket.Chat", + "registration.page.guest.continueAsGuest": "Continuar como invitado", + "registration.component.welcome": "Bienvenido al espacio de trabajo de <1>Rocket.Chat ", "registration.component.login": "Iniciar sesión", + "registration.component.login.userNotFound": "Usuario no encontrado", + "registration.component.login.incorrectPassword": "Contraseña incorrecta", + "registration.component.switchLanguage": "Cambiar a <1>{{name}}", + "registration.component.resetPassword": "Reestablecer contraseña", "registration.component.form.username": "Nombre de usuario", "registration.component.form.name": "Nombre", + "registration.component.form.createAnAccount": "Crear una cuenta", + "registration.component.form.userAlreadyExist": "El nombre de usuario ya existe. Pruebe con otro.", "registration.component.form.emailAlreadyExists": "El correo electrónico ya existe", "registration.component.form.usernameAlreadyExists": "El nombre de usuario ya existe. Prueba a usar otro nombre.", "registration.component.form.invalidEmail": "El correo electrónico introducido no es válido", "registration.component.form.email": "Correo electrónico", + "registration.component.form.emailPlaceholder": "ejemplo@ejemplo.com", "registration.component.form.password": "Contraseña", "registration.component.form.divider": "o", "registration.component.form.submit": "Enviar", "registration.component.form.requiredField": "Este campo es obligatorio", + "registration.component.form.joinYourTeam": "Únete a tu equipo", "registration.component.form.reasonToJoin": "Motivo para unirse", "registration.component.form.confirmPassword": "Confirma tu contraseña", "registration.component.form.confirmation": "Confirmación", @@ -4770,8 +4832,11 @@ "onboarding.component.form.action.next": "Siguiente", "onboarding.component.form.action.skip": "Omitir este paso", "onboarding.component.form.action.register": "Registrar", + "onboarding.component.form.action.registerWorkspace": "Registrar espacio de trabajo", + "onboarding.component.form.action.registerOffline": "Registro offline", "onboarding.component.form.action.confirm": "Confirmar", "onboarding.component.form.action.pasteHere": "Pegar aquí...", + "onboarding.component.form.action.completeRegistration": "Completar registro.", "onboarding.component.form.termsAndConditions": "Acepto los <1>términos y condiciones y la <3>política de privacidad", "onboarding.component.emailCodeFallback": "¿No has recibido el correo electrónico? <1>Volver a enviar o <3>cambiar correo electrónico", "onboarding.page.form.title": "Vamos a <1>Iniciar tu espacio de trabajo", @@ -4811,6 +4876,8 @@ "onboarding.form.adminInfoForm.fields.password.placeholder": "Crear contraseña", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Recibir información sobre Rocket.Chat", "onboarding.form.awaitConfirmationForm.title": "Esperando confirmación", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Código de seguridad", + "onboarding.form.awaitConfirmationForm.content.sentEmail": "Correo electrónico enviado a <1>{{emailAddress}} con un enlace de confirmación. Compruebe que el código de seguridad que aparece a continuación coincide con el del correo electrónico.", "onboarding.form.organizationInfoForm.title": "Información de organización", "onboarding.form.organizationInfoForm.subtitle": "Ya falta poco. Esta información nos ayudará a personalizar tu espacio de trabajo", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Nombre de la organización", @@ -4824,6 +4891,8 @@ "onboarding.form.organizationInfoForm.fields.country.label": "País", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Seleccionar", "onboarding.form.registerOfflineForm.title": "Registrarse fuera de línea", + "onboarding.form.registerOfflineForm.pasteStep.description": "1. En <1>cloud.rocket.chat obtenga el texto generado y péguelo a continuación para completar su proceso de registro", + "onboarding.form.registerOfflineForm.fields.registrationToken.inputLabel": "Token de registro", "onboarding.form.registeredServerForm.title": "Registrar tu servidor", "onboarding.form.registeredServerForm.included.push": "Notificaciones push para móviles", "onboarding.form.registeredServerForm.included.externalProviders": "Integración con proveedores externos (WhatsApp, Facebook, Telegram, Twitter)", @@ -4831,17 +4900,194 @@ "onboarding.form.registeredServerForm.fields.accountEmail.inputLabel": "Cuenta de correo electrónico en la nube", "onboarding.form.registeredServerForm.fields.accountEmail.inputPlaceholder": "Introduce tu correo electrónico", "onboarding.form.registeredServerForm.keepInformed": "Recibir información sobre noticias y eventos", + "onboarding.form.registeredServerForm.registerLater": "Registrarse más tarde", + "onboarding.form.registeredServerForm.notConnectedToInternet": "El servidor no está conectado a Internet, por lo que tendrás que hacer un registro offline para este espacio de trabajo.", + "onboarding.form.registeredServerForm.registrationEngagement": "El registro permite actualizaciones automáticas de la licencia, notificaciones de vulnerabilidades críticas y acceso a los servicios de Rocket.Chat Cloud. No se comparten datos confidenciales del espacio de trabajo; las estadísticas enviadas a Rocket.Chat son visibles para usted dentro del área de administración.", + "onboarding.form.registeredServerForm.registrationKeepInformed": "Al enviar este formulario, acepta recibir más información sobre los productos, eventos y actualizaciones de Rocket.Chat, de acuerdo con nuestra <1>política de privacidad. Puede darse de baja en cualquier momento.", "onboarding.form.standaloneServerForm.title": "Confirmación de servidor independiente", "onboarding.form.standaloneServerForm.servicesUnavailable": "Algunos servicios no estarán disponibles o requerirán configuración manual", "onboarding.form.standaloneServerForm.publishOwnApp": "Para enviarte notificaciones push, debes compilar y publicar tu propia aplicación en Google Play y App Store", "onboarding.form.standaloneServerForm.manuallyIntegrate": "Necesita integrarse manualmente con servicios externos", + "subscription.callout.servicesDisruptionsMayOccur": "Pueden ocurrir interrupciones en los servicios.", + "subscription.callout.servicesDisruptionsOccurring": "Se están produciendo interrupciones en los servicios.", + "subscription.callout.capabilitiesDisabled": "Características desactivadas", + "subscription.callout.description.limitsExceeded_one": "Su espacio de trabajo ha superado el límite de <1> {{val}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsExceeded_other": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsReached_one": "Su espacio de trabajo ha alcanzado el límite <1> {{val}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsReached_other": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.allPremiumCapabilitiesDisabled": "Todas las funciones premium desactivadas", + "subscription.callout.activeUsers": "puestos", + "subscription.callout.guestUsers": "invitados", + "subscription.callout.monthlyActiveContacts": "Contactos Activos Mensuales (MAC)", + "Something_Went_Wrong": "Algo salió mal", + "Theme_light": "Claro", + "Theme_light_description": "Más accesible para personas con discapacidad visual y una buena opción para entornos bien iluminados.", + "Theme_dark": "Oscuro", + "Theme_dark_description": "Reduzca la fatiga ocular en condiciones de poca luz minimizando la cantidad de luz emitida por la pantalla.", + "Workspaces_on_Community_edition_install_app": "Los espacios de trabajo comunitarios pueden tener hasta {{limit}} {{context}} aplicaciones habilitadas. Actualiza a un plan Premium para habilitar un número ilimitado de aplicaciones.", + "Private_apps_limit_reached": "Límite de aplicaciones privadas alcanzado", + "Private_apps_limit_exceeded": "Límite de aplicaciones privadas superado", + "Disable_at_least_more_apps": "Tendrás que desactivar al menos {{numberOfExceededApps}} aplicaciones o actualizar a un plan Premium para activar esta aplicación.", + "Join_your_team": "Únete a tu equipo", + "Create_a_password": "Crear una contraseña", + "Create_an_account": "Crear una cuenta", + "Workspaces_on_community_edition_trial_on": "Los espacios de trabajo en Comunidad pueden tener hasta 5 aplicaciones de la tienda y 3 aplicaciones privadas habilitadas. Inicia una prueba premium gratuita para eliminar estos límites hoy mismo!", + "Chat_transcript": "Transcripción del chat", + "Conversational_transcript": "Transcripción conversacional", + "Conversations_by_agents": "Conversaciones por agente", + "Conversations_by_channel": "Conversaciones por canal", + "Conversations_by_department": "Conversaciones por departamento", + "Conversations_by_status": "Conversaciones por estado", + "Conversations_by_tag": "Conversaciones por etiqueta", + "Send_conversation_transcript_via_email": "Enviar la transcripción de la conversación por correo electrónico", + "Always_send_the_transcript_to_contacts_at_the_end_of_the_conversations": "Envía siempre la transcripción a los contactos al final de las conversaciones.", + "Export_conversation_transcript_as_PDF": "Exportar la transcripción de la conversación en PDF", + "Omnichannel_transcript_email": "Enviar la transcripción del chat por correo electrónico.", + "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "Envía siempre la transcripción a los contactos al final de las conversaciones.", + "Omnichannel_transcript_pdf": "Exporta la transcripción del chat en PDF.", + "Accounts_Default_User_Preferences_omnichannelTranscriptPDF_Description": "Exporte siempre la transcripción en PDF al final de las conversaciones.", + "Customer": "Cliente", "This_attachment_is_not_supported": "El formato de archivo no es soportado", + "Send_transcript": "Enviar transcripción", + "Undo_request": "Deshacer solicitud", + "No_permission": "Sin permiso", + "Community_cap_description": "Los espacios de trabajo Comunidad tienen un límite de 200 conexiones concurrentes. Si este límite es sobrepasado ya no será posible para los usuarios ver el estado de otros usuarios. Esto no afecta el enviar y recibir mensajes", + "Premium_cap_description": "Planes premium no tienen un límite en el servicio de presencia", + "Service_status": "Estado del servicio", + "More_about_Premium_plans": "Más sobre los planes premium", + "Active_connections": "Conexiones activas", + "Presence_service": "Servicio de presencia", + "New_custom_status": "Nuevo estado personalizado", + "Service_disabled": "El servicio esta deshabilitado", + "Service_disabled_description": "No puede habilitar de nuevo hasta que hayan menos de 200 conexiones activas al mismo tiempo.", + "User_status_disabled": "Estados de usuario deshabilitados temporalmente para mantener el rendimiento.", + "User_status_disabled_learn_more": "Estados de usuario deshabilitados", + "User_status_disabled_learn_more_description": "Debido al alto volumen de conexiones activas, el servicio que maneja los estados de usuario se ha deshabilitado. Los administradores pueden habilitarlo manualmente en la configuración del espacio de trabajo", + "Go_to_workspace_settings": "Vaya a la configuración del espacio de trabajo", + "User_status_temporarily_disabled": "Estados de usuario deshabilitados temporalmente.", + "Use_token": "Usar token", + "Disconnected": "Desconectado", + "Disconnect_workspace": "Desconectar espacio de trabajo", "Awaiting_confirmation": "Esperando confirmación", + "Security_code": "Código de seguridad", + "Registration_Token": "Token de registro", + "RegisterWorkspace_Button": "Registrar espacio de trabajo", + "ConnectWorkspace_Button": "Conectar espacio de trabajo", + "Workspace_registered": "Espacio de trabajo registrado", + "Workspace_not_connected": "Espacio de trabajo no conectado", + "Token_Not_Recognized": "Token no reconocido", + "RegisterWorkspace_Registered_Description": "Estos servicios estan habilitados", + "RegisterWorkspace_Registered_Subtitle": "Porque este espacio de trabajo está registrado, los siguientes servicios estan habilitados", + "RegisterWorkspace_Registered_Benefits": "El registro permite actualizaciones de licencia automáticas, notificaciones de vulnerabilidades críticas y acceso a los servicios de Rocket.Chat Cloud. No se comparte información sensible con Rocket.Chat", + "RegisterWorkspace_NotRegistered_Title": "Espacio de trabajo no registrado", + "RegisterWorkspace_NotRegistered_Subtitle": "Registre este espacio de trabajo y obtenga", + "RegisterWorkspace_NotConnected_Title": "Espacio de trabajo desconectado", + "RegisterWorkspace_NotConnected_Subtitle": "Conecte este espacio de trabajo y obtenga", + "RegisterWorkspace_NotRegistered_Description": "Beneficios de registrar el espacio de trabajo", + "RegisterWorkspace_Disconnect_Subtitle": "Desconectar su espacio de trabajo resultará en perder lo siguiente", + "RegisterWorkspace_Disconnect_Error": "Un error ocurrió durante la desconexión", "RegisterWorkspace_Features_MobileNotifications_Title": "Notificaciones push para móviles", + "RegisterWorkspace_Features_MobileNotifications_Description": "Permite a los miembros del espacio de trabajo recibir notificaciones en sus móviles", + "RegisterWorkspace_Features_MobileNotifications_Disconnect": "Miembros del espacio de trabajo no recibirán más notificaciones en sus móviles", "RegisterWorkspace_Features_Marketplace_Title": "Marketplace", "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", + "RegisterWorkspace_Features_Omnichannel_Description": "Habla a tu audiencia, donde estén, a través de los canales sociales más populares del mundo.", + "RegisterWorkspace_Features_Omnichannel_Disconnect": "Características Omnichannel ya no estarán disponibles", + "RegisterWorkspace_Features_ThirdPartyLogin_Description": "Permite a los miembros del espacio de trabajo iniciar sesión usando aplicaciones de terceros", + "RegisterWorkspace_Features_ThirdPartyLogin_Disconnect": "Opciones de inicio de sesión con terceros no estarán disponibles", + "RegisterWorkspace_Token_Title": "Registrar espacio de trabajo con token", + "RegisterWorkspace_Token_Step_Two": "Copia el token y pégalo abajo", + "RegisterWorkspace_with_email": "Registrar espacio de trabajo con correo electrónico.", + "RegisterWorkspace_Setup_Subtitle": "Para registrar este espacio de trabajo, debe estar asociado con una cuenta de Rocket.Chat Cloud.", + "RegisterWorkspace_Setup_Steps": "Paso {{step}} de {{numberOfSteps}}", "RegisterWorkspace_Setup_Label": "Cuenta de correo electrónico en la nube", + "RegisterWorkspace_Setup_Have_Account_Title": "¿Tiene una cuenta?", + "RegisterWorkspace_Setup_Have_Account_Subtitle": "Ingrese su correo electrónico de Rocket.Chat Cloud para asociar este espacio de trabajo con su cuenta.", + "RegisterWorkspace_Setup_No_Account_Title": "¿No tiene una cuenta?", + "RegisterWorkspace_Setup_No_Account_Subtitle": "Ingrese su correo electrónico para crear una nueva cuenta en Rocket.Chat Cloud y asociarla a este espacio de trabajo.", + "cloud.RegisterWorkspace_Setup_Email_Confirmation": "Correo electrónico enviado a <1>correo electrónico con un enlace de confirmación.", + "RegisterWorkspace_Setup_Email_Verification": "Por favor, verifique que el código de seguridad abajo es el mismo que el enviado en el correo electrónico", + "RegisterWorkspace_Syncing_Error": "Un error ocurrió al sincronizar su espacio de trabajo", + "RegisterWorkspace_Syncing_Complete": "Sincronizacion completa", + "RegisterWorkspace_Connection_Error": "Un error ocurrió al conectarse", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Acepto los <1>términos y condiciones y la <3>política de privacidad", - "UpgradeToGetMore_engagement-dashboard_Title": "Análisis", - "UpgradeToGetMore_auditing_Title": "Auditoría de mensajes" + "Uninstall_grandfathered_app": "¿Desinstalar {{appName}}?", + "mentions_counter": "{{count}} mención", + "mentions_counter_plural": "{{count}} menciones", + "threads_counter": "{{count}} mensaje en hilo sin leer", + "threads_counter_plural": "{{count}} mensajes en hilo sin leer", + "unread_messages_counter": "{{count}} mensaje sin leer", + "unread_messages_counter_plural": "{{count}} mensajes sin leer", + "Premium": "Premium", + "Enterprise": "Premium", + "Premium_capability": "Característica premium", + "Operating_withing_plan_limits": "Operando dentro de los límites del plan", + "Plan_limits_reached": "Límites del plan alcanzados", + "Workspace_not_registered": "Espacio de trabajo no registrado", + "Users_Connected": "Usuarios conectados", + "Solve_issues": "Soluciona problemas", + "Update_version": "Actualiza tu versión", + "Version_not_supported": "Versión <1>no soportada", + "Version_supported_until": "Versión <1>soportada hasta {{date}}", + "Outdated": "Desactualizada", + "Latest": "Última", + "New_version_available": "Nueva versión disponible", + "trial": "Periodo de prueba", + "Subscription": "Suscripción", + "Manage_subscription": "Administra tu suscripción", + "ActiveSessionsPeak": "Pico de sesiones activas", + "ActiveSessionsPeak_InfoText": "El número más alto de conexiones activas en los úlitmos 30 días", + "ActiveSessions": "Sesiones activas", + "ActiveSessions_available": "Sesiones disponibles", + "Monthly_active_contacts": "Contactos Activos Mensuales (MAC)", + "Upgrade": "Mejora", + "Seats": "Puestos", + "Marketplace_apps": "Aplicaciones de la tienda", + "Private_apps": "Aplicaciones privadas", + "Finish_your_purchase_trial": "Finaliza tu compra para evitar las <1>consecuencias de regresar a tu licencia anterior.", + "Contact_sales_trial": "Contacta a ventas para finalizar tu compra y evita las <1>consecuencias de regresar a tu licencia anterior.", + "Why_has_a_trial_been_applied_to_this_workspace": "<0>¿Por qué se aplic un periodo de prueba a este espacio de trabajo?", + "Compare_plans": "Compara los planes", + "n_days_left": "{{n}} días restantes", + "Contact_sales": "Contacta a ventas", + "Finish_purchase": "Finalizar compra", + "Self_managed_hosting": "Alojamiento autogestionado", + "Cloud_hosting": "Alojamiento en Rocket.Chat Cloud", + "free_per_month_user": "$0 por usuario/mes", + "Trial_active": "Periodo de prueba activo", + "Contact_sales_renew_date": "<0>Contacta a ventas para conocer la fecha de renovación de tu plan", + "Renews_DATE": "Renueva en {{date}}", + "UpgradeToGetMore_Headline": "Mejora para obtener más", + "UpgradeToGetMore_Subtitle": "Sobrealimenta tu espacio de trabajo con capacidades avanzadas", + "UpgradeToGetMore_scalability_Title": "Alta escalabilidad", + "UpgradeToGetMore_scalability_Body": "Mejora la eficiencia, reduce costos e incrementa el uso concurrente de usuarios al cambiar de usar un monolito a usar micro servicios o multi-instancia", + "UpgradeToGetMore_accessibility-certification_Title": "WCAG 2.1 y BITV 2.0", + "UpgradeToGetMore_accessibility-certification_Body": "Cumple con los estándares WCAG y BITV con el programa de accesibilidad de Rocket.Chat", + "UpgradeToGetMore_engagement-dashboard_Title": "Anál", + "UpgradeToGetMore_oauth-enterprise_Title": "Autenticación avanzada", + "UpgradeToGetMore_auditing_Title": "Auditoría de mensajes", + "Seats_InfoText": "Cada usuario único usa un puesto. Usuarios desactivados no usan ningún puesto. El número total de puestos es definido por el tipo de licencia activa", + "CountSeats_InfoText": "Cada usuario único usa un puesto. Usuarios desactivados no usan ningún puesto.", + "MAC_InfoText": "Contactos Activos Mensuales (MAC). El número de contactos únicos de Omnichannel con quienes se interactuó durante un mes de facturación", + "CountMAC_InfoText": "Contactos Activos Mensuales (MAC). El número de contactos únicos de Omnichannel con quienes se interactuó durante un mes calendario", + "ActiveSessions_InfoText": "Total de conexiones concurrentes. Un usuario puede estar conectado varias veces. El servicio de presencia de usuario se deshabilita cuando el total llega a 200 conexiones para prevenir problemas de rendimiento", + "Apps_InfoText": "Comunidad permite hasta 3 aplicaciones privadas y 5 aplicaciones de la tienda ser habilitadas", + "Remove_RocketChat_Watermark_InfoText": "La marca de agua es removida automticamente cuando una licencia de paga es activada", + "Remove_RocketChat_Watermark": "Remover marca de agua de Rocket.Chat", + "High_scalabaility": "Alta escalabilidad", + "Premium_and_unlimited_apps": "Apps premium ilimitadas", + "Message_audit": "Auditoría de mensajes", + "Premium_omnichannel_capabilities": "Características premium de Omnichannel", + "Video_call_manager": "Administrador de video llamadas", + "Unlimited_push_notifications": "Notificaciones push ilimitadas", + "Buy_more": "Compre más", + "Upgrade_to_Pro": "Mejore a Pro", + "Sync_license_update": "Sincronice su licencia", + "Sync_license_update_Callout_Title": "Estamos actualizando su licencia", + "Sync_license_update_Callout": "Si no nota cambios en su espacio de trabajo tras unos minutos, sincronice de nuevo", + "Includes": "Incluye", + "Unlock_premium_capabilities": "Desbloquea características premium", + "Unlimited_seats": "Puestos ilimitados", + "Unlimited_MACs": "Contactos Activos por Mes (MAC) ilimitados", + "Unlimited_seats_MACs": "Puestos y Contactos Activos por Mes (MAC) ilimitados" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json index 40a9e3680128..724f3d3e7948 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json @@ -3103,5 +3103,6 @@ "registration.component.form.sendConfirmationEmail": "ارسال ایمیل تایید", "onboarding.form.registerOfflineForm.title": "ثبت دستی", "RegisterWorkspace_Features_Omnichannel_Title": "کانال همه‌کاره", + "Enterprise": "شرکت، پروژه", "UpgradeToGetMore_engagement-dashboard_Title": "تجزیه و تحلیل ترافیک" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json index 4ea8994cfe66..16f60c6b723f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json @@ -1006,8 +1006,6 @@ "Cloud_register_offline_finish_helper": "Kun olet rekisteröitynyt pilvikonsolissa, näet tekstiä. Viimeistele rekisteröinti liittämällä teksti tähän.", "Cloud_register_offline_helper": "Työtiloja voidaan rekisteröidä manuaalisesti, jos verkko on suojattu ilmaraolla tai verkon käyttöä on rajoitettu. Kopioi alla oleva teksti ja viimeistele prosessi pilvikonsolissamme.", "Cloud_register_success": "Työtilasi on rekisteröity!", - "Cloud_registration_pending_html": "Push-ilmoitukset eivät toimi, ennen kuin rekisteröinti on valmis. Lisätietoja", - "Cloud_registration_pending_title": "Pilvirekisteröinti on vielä kesken", "Cloud_registration_required": "Rekisteröinti on pakollinen", "Cloud_registration_required_description": "Näyttää siltä, ettet rekisteröinyt työtilaa määrityksen aikana.", "Cloud_registration_required_link_text": "Rekisteröi työtila napsauttamalla tätä.", @@ -1692,7 +1690,7 @@ "E2E_key_reset_email": "E2E-avaimen nollausilmoitus", "E2E_message_encrypted_placeholder": "Tämä viesti on täysin salattu. Jos haluat tarkastella sitä, sinun on annettava salausavain tilisi asetuksissa.", "E2E_password_request_text": "Jos haluat käyttää salattuja yksityisiä ryhmiäsi ja suoria viestejäsi, anna salauksen salasana.
Sinun on annettava tämä salasana, jos haluat koodata tai purkaa viestejäsi jokaisella käyttämälläsi sovelluksella, koska avainta ei tallenneta palvelimeen.", - "E2E_password_reveal_text": "Nyt voit luoda salattuja yksityisiä ryhmiä ja suoria viestejä. Voit myös muuttaa olemassa olevia yksityisiä ryhmiä tai suoria viestejä salatuiksi.

Tämä on täysi salaus, joten viestien koodaus- ja purkuavainta ei tallenneta palvelimeen. Säilytä siksi salasanaa turvallisessa paikassa. Sinun on annettava se muissa laitteissa, joissa haluat käyttää e2e-salausta. Lue lisää täältä!

Salasanasi on: %s

Tämä on automaattisesti luotu salasana, voit asettaa uuden salasanan salausavaimellesi milloin tahansa missä tahansa selaimessa, johon olet antanut nykyisen salasanan.
Tämä salasana tallennetaan vain tähän selaimeen, kunnes tallennat salasanan ja kuittaat tämän ilmoituksen.", + "E2E_password_reveal_text": "Nyt voit luoda salattuja yksityisiä ryhmiä ja suoria viestejä. Voit myös muuttaa olemassa olevia yksityisiä ryhmiä tai suoria viestejä salatuiksi.

Tämä on täysi salaus, joten viestien koodaus- ja purkuavainta ei tallenneta palvelimeen. Säilytä siksi salasanaa turvallisessa paikassa. Sinun on annettava se muissa laitteissa, joissa haluat käyttää e2e-salausta. Lue lisää täältä!

Salasanasi on: {{randomPassword}}

Tämä on automaattisesti luotu salasana, voit asettaa uuden salasanan salausavaimellesi milloin tahansa missä tahansa selaimessa, johon olet antanut nykyisen salasanan.
Tämä salasana tallennetaan vain tähän selaimeen, kunnes tallennat salasanan ja kuittaat tämän ilmoituksen.", "E2E_Reset_Email_Content": "Sinut on kirjattu ulos automaattisesti. Kun kirjaudut uudelleen sisään, Rocket.Chat luo uuden avaimen ja palauttaa pääsysi kaikkiin salattuihin huoneisiin, joissa on aktiivisia käyttäjiä. E2E-salauksen luonteen vuoksi Rocket.Chat ei pysty palauttamaan pääsyä salattuihin huoneisiin, joissa ei ole aktiivisia jäseniä.", "E2E_Reset_Key_Explanation": "Tämä asetus poistaa nykyisen E2E-avaimesi ja kirjaa sinut ulos.
Kun kirjaudut uudelleen sisään, Rocket.Chat luo sinulle uuden avaimen ja palauttaa pääsysi kaikkiin salattuihin huoneisiin, joissa on aktiivisia jäseniä.
E2E-salauksen luonteen vuoksi Rocket.Chat ei pysty palauttamaan pääsyä salattuihin huoneisiin, joissa ei ole aktiivisia jäseniä.", "E2E_Reset_Other_Key_Warning": "Nykyisen E2E-avaimen nollaus kirjaa käyttäjän ulos. Kun käyttäjä kirjautuu uudelleen sisään, Rocket.Chat luo uuden avaimen ja palauttaa käyttäjän pääsyn kaikkiin salattuihin huoneisiin, joissa on aktiivisia jäseniä. E2E-salauksen luonteen vuoksi Rocket.Chat ei pysty palauttamaan pääsyä salattuihin huoneisiin, joissa ei ole aktiivisia jäseniä.", @@ -2762,6 +2760,7 @@ "LDAP_DataSync_Roles": "Synkronoi roolit", "LDAP_DataSync_Channels": "Synkronoi kanavat Channel", "LDAP_DataSync_Teams": "Synkronoi tiimit", + "LDAP_Enterprise": "Yritys", "LDAP_DataSync_BackgroundSync": "Taustasynkronointi", "LDAP_Server_Type": "Palvelimen tyyppi", "LDAP_Server_Type_AD": "Active Directory", @@ -4193,6 +4192,7 @@ "SAML_AuthnRequest_Template": "AuthnRequest-malli", "SAML_AuthnRequest_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_newId\\__\\_**: Satunnaisesti luotu id-merkkijono \n- **\\__\\_instant\\_\\_\\_**: Nykyinen aikaleima \n- **\\_\\_callbackUrl\\_\\_**: Rocket.Chatin takaisinkutsun URL-osoite. \n- **\\_\\_entryPoint\\_\\_**: {{Custom Entry Point}} -asetuksen arvo. \n- **\\____________**: {{Custom Issuer}} -asetuksen arvo. \n- **\\_\\_identifierFormatTag\\_\\_**: __NameID-käytäntömallin__ sisältö, jos voimassa oleva {{Identifier Format}} on määritetty. \n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} -asetuksen arvo. \n- **\\_\\_authnContextTag\\_\\_**: __AuthnContext-mallin__ sisältö, jos voimassa oleva {{Custom Authn Context}} on määritetty. \n- **\\_\\_authnContextComparison\\_\\_**: {{Authn Context Comparison}} -asetuksen arvo. \n- **\\_\\_authnContext\\_\\_**: {{Custom Authn Context}} -asetuksen arvo.", "SAML_Connection": "Yhteys", + "SAML_Enterprise": "Yritys", "SAML_General": "Yleinen", "SAML_Custom_Authn_Context": "Mukautettu Authn-konteksti", "SAML_Custom_Authn_Context_Comparison": "Authn kontekstin vertailu", @@ -5747,5 +5747,6 @@ "Uninstall_grandfathered_app": "Poistetaanko {{appName}}?", "App_will_lose_grandfathered_status": "**Tämä {{context}}sovellus menettää aikaisemmin käytetössä olleen sovelluksen tilansa.** \n \nYhteisöversion työtiloissa voi olla käytössä enintään {{limit}} {{context}} sovellusta. aikaisemmin Aikaisemmin käytössä olleet sovellukset lasketaan mukaan rajoitukseen, mutta rajoitusta ei sovelleta niihin.", "Theme_Appearence": "Teeman ulkoasu", + "Enterprise": "Yritys", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json index fff018a84dae..6fcc5bfa8586 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -878,8 +878,6 @@ "Cloud_register_offline_finish_helper": "Une fois le processus d'enregistrement terminé dans la console cloud, un texte doit s'afficher. Collez-le ici pour terminer l'enregistrement.", "Cloud_register_offline_helper": "Les espaces de travail peuvent être enregistrés manuellement s'ils sont isolés (airgap) ou si l'accès au réseau est restreint. Copiez le texte ci-dessous et accédez à notre console cloud pour terminer le processus.", "Cloud_register_success": "Votre espace de travail a été enregistré avec succès !", - "Cloud_registration_pending_html": "Les notifications push ne fonctionnent pas tant que l'enregistrement n'est pas terminé. En savoir plus", - "Cloud_registration_pending_title": "L'enregistrement dans le cloud est toujours en cours", "Cloud_registration_required": "Inscription requise", "Cloud_registration_required_description": "Il semble que, lors de l'installation, vous n'ayez pas choisi d'enregistrer votre espace de travail.", "Cloud_registration_required_link_text": "Cliquez ici pour enregistrer votre espace de travail.", @@ -1498,7 +1496,7 @@ "E2E_Encryption_Password_Explanation": "Vous pouvez désormais créer des groupes privés et des messages directs chiffrés. Vous pouvez également modifier les groupes privés ou les messages directs existants pour les chiffrer.

Il s'agit d'un chiffrement de bout en bout de sorte que la clé pour encoder/décoder vos messages ne sera pas enregistrée sur le serveur. Pour cette raison, vous devez stocker votre mot de passe dans un endroit sûr. Vous devrez le saisir sur les autres appareils sur lesquels vous souhaitez utiliser le chiffrement E2E.", "E2E_key_reset_email": "Notification de réinitialisation de clé E2E", "E2E_password_request_text": "Pour accéder à vos groupes privés et à vos messages directs chiffrés, entrez votre mot de passe de chiffrement.
Vous devez entrer ce mot de passe pour encoder/décoder vos messages sur chaque client que vous utilisez, car la clé n'est pas stockée sur le serveur.", - "E2E_password_reveal_text": "Vous pouvez désormais créer des groupes privés et des messages directs chiffrés. Vous pouvez également modifier les groupes privés ou les messages directs existants pour les chiffrer.

Il s'agit d'un chiffrement de bout en bout de sorte que la clé pour encoder/décoder vos messages ne sera pas enregistrée sur le serveur. Pour cette raison, vous devez stocker votre mot de passe dans un endroit sûr. Vous devrez le saisir sur les autres appareils sur lesquels vous souhaitez utiliser le chiffrement E2E. En savoir plus ici !

Votre mot de passe est : %s

Ceci est un mot de passe généré automatiquement, vous pouvez configurer un nouveau de mot de passe pour votre clé de chiffrement à tout moment depuis n'importe quel navigateur où vous avez entré le mot de passe existant.
Ce mot de passe n'est stocké que dans ce navigateur jusqu'à ce que vous l'enregistriez et que vous fermiez ce message.", + "E2E_password_reveal_text": "Vous pouvez désormais créer des groupes privés et des messages directs chiffrés. Vous pouvez également modifier les groupes privés ou les messages directs existants pour les chiffrer.

Il s'agit d'un chiffrement de bout en bout de sorte que la clé pour encoder/décoder vos messages ne sera pas enregistrée sur le serveur. Pour cette raison, vous devez stocker votre mot de passe dans un endroit sûr. Vous devrez le saisir sur les autres appareils sur lesquels vous souhaitez utiliser le chiffrement E2E. En savoir plus ici !

Votre mot de passe est : {{randomPassword}}

Ceci est un mot de passe généré automatiquement, vous pouvez configurer un nouveau de mot de passe pour votre clé de chiffrement à tout moment depuis n'importe quel navigateur où vous avez entré le mot de passe existant.
Ce mot de passe n'est stocké que dans ce navigateur jusqu'à ce que vous l'enregistriez et que vous fermiez ce message.", "E2E_Reset_Email_Content": "Vous avez été automatiquement déconnecté. Lorsque vous vous reconnecterez, Rocket.Chat générera une nouvelle clé et restaurera votre accès à tout salon chiffré ayant un ou plusieurs membres en ligne. En raison de la nature du chiffrement E2E, Rocket.Chat ne pourra pas restaurer l'accès à un salon chiffré qui n'a aucun membre en ligne.", "E2E_Reset_Key_Explanation": "Cette option supprimera votre clé E2E actuelle et vous déconnectera.
Lorsque vous vous reconnecterez, Rocket.Chat générera une nouvelle clé et restaurera votre accès à tout salon chiffré ayant un ou plusieurs membres en ligne.
En raison de la nature du chiffrement E2E, Rocket.Chat ne pourra pas restaurer l'accès à un salon chiffré qui n'a aucun membre en ligne.", "E2E_Reset_Other_Key_Warning": "La réinitialisation de la clé E2E actuelle déconnectera l'utilisateur. Lorsque l'utilisateur se reconnectera, Rocket.Chat générera une nouvelle clé et restaurera l'accès de l'utilisateur à tout salon chiffré ayant un ou plusieurs membres en ligne. En raison de la nature du chiffrement E2E, Rocket.Chat ne pourra pas restaurer l'accès à un salon chiffré qui n'a aucun membre en ligne.", @@ -2428,6 +2426,7 @@ "LDAP_DataSync_Roles": "Synchroniser les rôles", "LDAP_DataSync_Channels": "Synchroniser les canaux", "LDAP_DataSync_Teams": "Synchroniser les équipes", + "LDAP_Enterprise": "Entreprise", "LDAP_DataSync_BackgroundSync": "Synchronisation en arrière-plan", "LDAP_Server_Type": "Type de serveur", "LDAP_Server_Type_AD": "Active Directory", @@ -3652,6 +3651,7 @@ "SAML_AuthnRequest_Template": "Modèle AuthnRequest", "SAML_AuthnRequest_Template_Description": "Les variables suivantes sont disponibles : \n- **\\_\\_newId\\_\\_** : Chaîne d'ID générée aléatoirement \n- **\\_\\_instant\\_\\_** : Horodatage actuel \n- **\\_\\_callbackUrl\\_\\_** : URL de rappel Rocket.Chat. \n- **\\_\\_entryPoint\\_\\_** : Valeur du paramètre {{Custom Entry Point}}. \n- **\\_\\_issuer\\_\\_** : Valeur du paramètre {{Custom Issuer}}. \n- **\\_\\_identifierFormatTag\\_\\_** : Contenu de {{NameID Policy Template}} si un {{Identifier Format}} valide est configuré. \n- **\\_\\_identifierFormat\\_\\_** : Valeur du paramètre {{Identifier Format}}. \n- **\\_\\_authnContextTag\\_\\_** : Contenu de {{AuthnContext Template}} si un {{Custom Authn Context}} valide est configuré. \n- **\\_\\_authnContextComparison\\_\\_** : Valeur du paramètre {{Authn Context Comparison}}. \n- **\\_\\_authnContext\\_\\_** : Valeur du paramètre {{Custom Authn Context}}.", "SAML_Connection": "Connexion", + "SAML_Enterprise": "Entreprise", "SAML_General": "Général", "SAML_Custom_Authn_Context": "Contexte authn personnalisé", "SAML_Custom_Authn_Context_Comparison": "Comparaison du contexte authn ", @@ -3762,6 +3762,7 @@ "See_documentation": "Voir la documentation", "See_full_profile": "Voir le profil complet", "See_on_Engagement_Dashboard": "Voir sur le tableau de bord d'engagement", + "Select": "Sélectionnez", "Select_a_department": "Sélectionner un département", "Select_a_room": "Sélectionner un salon", "Select_a_user": "Sélectionner un utilisateur", @@ -4890,6 +4891,7 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnicanal", "RegisterWorkspace_Setup_Label": "E-mail du compte cloud", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "J'accepte les <1>Conditions d'utilisation et la <3>Politique de confidentialité", + "Enterprise": "Entreprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analyses", "UpgradeToGetMore_auditing_Title": "Audit des messages" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json index 6d9969fd2588..e33f8dd815da 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json @@ -2894,5 +2894,6 @@ "registration.component.form.invalidConfirmPass": "Potvrda lozinke se ne slaže sa lozinkom", "registration.component.form.confirmPassword": "Potvrdi svoju lozinku", "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email", + "Enterprise": "Poduzeće", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json index 0429d2667998..5154b0faa416 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json @@ -29,6 +29,8 @@ "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "Biztonságos és rendkívül személyes, önmenedzselt megoldás a konferenciahívásokhoz.", "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "A munkaterület adminisztrátorának telepítenie kell és be kell állítania egy konferenciahívás-alkalmazást.", "An_app_needs_to_be_installed_and_configured": "Egy alkalmazást kell telepíteni és beállítani.", + "Accessibility": "Hozzáférhetőség", + "Accessibility_and_Appearance": "Hozzáférhetőség és megjelenés", "Accept_Call": "Hívás fogadása", "Accept": "Elfogadás", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Bejövő összcsatornás kérések elfogadása, akkor is ha nincsenek elérhető ügyintézők", @@ -969,8 +971,6 @@ "Cloud_register_offline_finish_helper": "Miután befejezte a regisztrációs folyamatot a felhőkonzolban, megjelenik néhány szöveg. Illessze be ide a regisztráció befejezéséhez.", "Cloud_register_offline_helper": "A munkaterületek kézzel is regisztrálhatók, ha fizikailag elválasztott vagy a hálózati hozzáférés korlátozott. Másolja le az alábbi szöveget, és menjen a felhőkonzolunkhoz a folyamat befejezéséhez.", "Cloud_register_success": "A munkaterülete sikeresen regisztrálva lett!", - "Cloud_registration_pending_html": "A leküldéses értesítések nem működnek, amíg a regisztráció be nem fejeződik. Tudjon meg többet", - "Cloud_registration_pending_title": "A felhőregisztráció továbbra is függőben van", "Cloud_registration_required": "Regisztráció szükséges", "Cloud_registration_required_description": "Úgy tűnik, hogy a beállítás során nem választotta a munkaterületének regisztrációját.", "Cloud_registration_required_link_text": "Kattintson ide a munkaterülete regisztrálásához.", @@ -1644,7 +1644,7 @@ "E2E_key_reset_email": "Végpontok közötti titkosítási kulcs visszaállításának értesítése", "E2E_message_encrypted_placeholder": "Ez az üzenet végpontok között titkosított. A megtekintéséhez meg kell adnia a titkosítási kulcsot a fiók beállításaiban.", "E2E_password_request_text": "A titkosított személyes csoportok és közvetlen üzenetek eléréséhez adja meg a titkosítási jelszót.
Ezt a jelszót kell megadnia az üzenetek kódolásához vagy dekódolásához minden egyes használt ügyfélprogramban, mivel a kulcs nincs eltárolva a kiszolgálón.", - "E2E_password_reveal_text": "Mostantól létrehozhat titkosított személyes csoportokat és közvetlen üzeneteket. A meglévő személyes csoportokat vagy közvetlen üzeneteket is megváltoztathatja titkosítottra.

Ez végpontok közötti titkosítás, így az üzenetek kódolásához vagy dekódolásához szükséges kulcs nem kerül mentésre a kiszolgálón. Emiatt a jelszavát valamilyen biztonságos helyen kell tárolnia. Meg kell tudni adni a többi eszközön is, amelyen a végpontok közötti titkosítást használni szeretné. Tudjon meg többet itt!

A jelszava: %s

Ez egy automatikusan előállított jelszó, bármikor beállíthat egy új jelszót a titkosítási kulcsához bármelyik böngészőből, ahová a meglévő jelszót beírta.
Ez a jelszó csak addig tárolódik ebben a böngészőben, amíg el nem tárolja a jelszót, és el nem utasítja ezt az üzenetet.", + "E2E_password_reveal_text": "Mostantól létrehozhat titkosított személyes csoportokat és közvetlen üzeneteket. A meglévő személyes csoportokat vagy közvetlen üzeneteket is megváltoztathatja titkosítottra.

Ez végpontok közötti titkosítás, így az üzenetek kódolásához vagy dekódolásához szükséges kulcs nem kerül mentésre a kiszolgálón. Emiatt a jelszavát valamilyen biztonságos helyen kell tárolnia. Meg kell tudni adni a többi eszközön is, amelyen a végpontok közötti titkosítást használni szeretné. Tudjon meg többet itt!

A jelszava: {{randomPassword}}

Ez egy automatikusan előállított jelszó, bármikor beállíthat egy új jelszót a titkosítási kulcsához bármelyik böngészőből, ahová a meglévő jelszót beírta.
Ez a jelszó csak addig tárolódik ebben a böngészőben, amíg el nem tárolja a jelszót, és el nem utasítja ezt az üzenetet.", "E2E_Reset_Email_Content": "Ön automatikusan ki lett jelentkeztetve. Ha újra bejelentkezik, akkor a Rocket.Chat új kulcsot fog előállítani, és visszaállítja a hozzáférését az összes olyan titkosított szobához, amely egy vagy több elérhető taggal rendelkezik. A végpontok közötti titkosítás természetéből adódóan a Rocket.Chat nem tudja visszaállítani a hozzáférést olyan titkosított szobákhoz, amelyek nem rendelkeznek elérhető taggal.", "E2E_Reset_Key_Explanation": "Ez a beállítás eltávolítja a jelenlegi végpontok közötti titkosítási kulcsot, és kijelentkezteti Önt.
Ha újra bejelentkezik, akkor a Rocket.Chat új kulcsot fog előállítani Önnek, és visszaállítja a hozzáférését az összes olyan titkosított szobához, amely egy vagy több elérhető taggal rendelkezik.
A végpontok közötti titkosítás természetéből adódóan a Rocket.Chat nem tudja visszaállítani a hozzáférést olyan titkosított szobákhoz, amelyek nem rendelkeznek elérhető taggal.", "E2E_Reset_Other_Key_Warning": "A jelenlegi végpontok közötti titkosítási kulcs visszaállítása és a felhasználó kijelentkeztetése. Ha a felhasználó újra bejelentkezik, akkor a Rocket.Chat új kulcsot fog előállítani, és visszaállítja a felhasználó hozzáférését az összes olyan titkosított szobához, amely egy vagy több elérhető taggal rendelkezik. A végpontok közötti titkosítás természetéből adódóan a Rocket.Chat nem tudja visszaállítani a hozzáférést olyan titkosított szobákhoz, amelyek nem rendelkeznek elérhető taggal.", @@ -2656,6 +2656,7 @@ "LDAP_DataSync_Roles": "Szerepek szinkronizálása", "LDAP_DataSync_Channels": "Csatornák szinkronizálása", "LDAP_DataSync_Teams": "Csapatok szinkronizálása", + "LDAP_Enterprise": "Vállalati", "LDAP_DataSync_BackgroundSync": "Háttérben történő szinkronizálás", "LDAP_Server_Type": "Kiszolgáló típusa", "LDAP_Server_Type_AD": "Active Directory", @@ -4037,6 +4038,7 @@ "SAML_AuthnRequest_Template": "AuthN-kérés sablon", "SAML_AuthnRequest_Template_Description": "A következő változók érhetők el: \n- **\\_\\_newId\\_\\_**: véletlenszerűen előállított azonosító-karakterlánc. \n- **\\_\\_instant\\_\\_**: jelenlegi időbélyeg. \n- **\\_\\_callbackUrl\\_\\_**: a Rocket.Chat visszahívási URL-je. \n- **\\_\\_entryPoint\\_\\_**: az __egyéni belépési pont__ beállítás értéke. \n- **\\_\\_issuer\\_\\_**: az __egyéni kibocsátó__ beállítás értéke. \n- **\\_\\_identifierFormatTag\\_\\_**: a __NameID házirend sablon__ tartalma, ha érvényes __azonosítóformátum__ van beállítva. \n- **\\_\\_identifierFormat\\_\\_**: az __azonosítóformátum__ beállítás értéke. \n- **\\_\\_authnContextTag\\_\\_**: az {{AuthN-környezet sablon}} tartalma, ha érvényes __egyéni AuthN-környezet__ van beállítva. \n- **\\_\\_authnContextComparison\\_\\_**: az __AuthN-környezet összehasonlítása__ beállítás értéke. \n- **\\_\\_authnContext\\_\\_**: az __egyéni AuthN-környezet__ beállítás értéke.", "SAML_Connection": "Kapcsolat", + "SAML_Enterprise": "Vállalati", "SAML_General": "Általános", "SAML_Custom_Authn_Context": "Egyéni AuthN-környezet", "SAML_Custom_Authn_Context_Comparison": "AuthN-környezet összehasonlítása", @@ -5428,6 +5430,7 @@ "Join_your_team": "Csatlakozás csapathoz", "Create_an_account": "Fiók létrehozása", "RegisterWorkspace_Features_Marketplace_Title": "Piactér", + "Enterprise": "Vállalati", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika", "UpgradeToGetMore_auditing_Title": "Üzenet ellenőrzés" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json index 0a53b8066e5e..563d67a3fb7f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json @@ -2767,5 +2767,6 @@ "registration.component.form.invalidConfirmPass": "Kata sandi konfirmasi tidak cocok dengan kata sandi utama", "registration.component.form.confirmPassword": "Konfirmasikan kata sandi anda", "registration.component.form.sendConfirmationEmail": "Kirim email konfirmasi", + "Enterprise": "Perusahaan", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json index e1355c9e55fe..adda184a03b8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json @@ -2860,5 +2860,6 @@ "registration.component.form.invalidConfirmPass": "La password di conferma non corrisponde con la password", "registration.component.form.confirmPassword": "Conferma la tua password", "registration.component.form.sendConfirmationEmail": "Invia email di conferma", + "Enterprise": "impresa", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json index 84f8d1035d3a..1ac845257a0c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json @@ -865,8 +865,6 @@ "Cloud_register_offline_finish_helper": "Cloud Consoleで登録プロセスを完了すると、テキストが表示されます。ここに貼り付けて登録を完了してください。", "Cloud_register_offline_helper": "エアギャップまたはネットワークアクセスが制限されている場合、ワークスペースを手動で登録できます。以下のテキストをコピーし、Cloud Consoleに移動してプロセスを完了します。", "Cloud_register_success": "ワークスペースが正常に登録されました!", - "Cloud_registration_pending_html": "プッシュ通知は登録が完了するまで機能しません。詳細はこちら", - "Cloud_registration_pending_title": "クラウド登録はまだ保留中です", "Cloud_registration_required": "登録が必要です", "Cloud_registration_required_description": "設定中にワークスペースを登録しない選択をしたようです。", "Cloud_registration_required_link_text": "ワークスペースを登録するにはここをクリックしてください。", @@ -1480,7 +1478,7 @@ "E2E_Encryption_Password_Explanation": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはダイレクトメッセージを暗号化するように変更することもできます。

これはエンドツーエンドの暗号化であり、メッセージのエンコード/デコードのキーがサーバーに保存されなくなります。そのため、安全な別の場所にパスワードを保管する必要があります。このパスワードは、E2E暗号化を使用したい他のデバイスに入力する必要があります。", "E2E_key_reset_email": "E2Eキーリセット通知", "E2E_password_request_text": "暗号化されたプライベートグループとダイレクトメッセージにアクセスするには、暗号化パスワードを入力します。
キーがサーバーに保存されていないため、使用するすべてのクライアントでメッセージをエンコード/デコードするには、このパスワードを入力する必要があります。", - "E2E_password_reveal_text": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはDMを暗号化するように変更することもできます。

これはエンドツーエンドの暗号化であるため、メッセージのエンコード/デコードのキーがサーバーに保存されなくなります。そのため、安全な別の場所にこのパスワードを保管する必要があります。このパスワードは、E2E暗号化を使用したい他のデバイスで入力する必要があります。詳細はこちら

パスワードは %sです。

これは自動生成されたパスワードです。既存のパスワードを入力したブラウザーからであれば、いつでも暗号化キーの新しいパスワードを設定できます。
パスワードを保存し、このメッセージを閉じるまで、このパスワードはこのブラウザーにのみ保存されます。", + "E2E_password_reveal_text": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはDMを暗号化するように変更することもできます。

これはエンドツーエンドの暗号化であるため、メッセージのエンコード/デコードのキーがサーバーに保存されなくなります。そのため、安全な別の場所にこのパスワードを保管する必要があります。このパスワードは、E2E暗号化を使用したい他のデバイスで入力する必要があります。詳細はこちら

パスワードは {{randomPassword}}です。

これは自動生成されたパスワードです。既存のパスワードを入力したブラウザーからであれば、いつでも暗号化キーの新しいパスワードを設定できます。
パスワードを保存し、このメッセージを閉じるまで、このパスワードはこのブラウザーにのみ保存されます。", "E2E_Reset_Email_Content": "自動的にログアウトしました。再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのアクセスを復元します。E2E暗号化の性質上、Rocket.Chatは、メンバーがオンラインでない暗号化されたルームへのアクセスを復元できません。", "E2E_Reset_Key_Explanation": "このオプションは、現在のE2Eキーを削除してログアウトします。
再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのアクセスを復元します。
E2E暗号化の性質により、Rocket.Chatは、メンバーがオンラインになっていない暗号化されたルームへのアクセスを復元することはできません。", "E2E_Reset_Other_Key_Warning": "現在のE2Eキーをリセットすると、ユーザーがログアウトします。ユーザーが再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのユーザーアクセスを復元します。E2E暗号化の性質上、Rocket.Chatは、メンバーがオンラインでない暗号化されたルームへのアクセスを復元できません。", @@ -2405,6 +2403,7 @@ "LDAP_DataSync_Roles": "ロールの同期", "LDAP_DataSync_Channels": "Channelsの同期", "LDAP_DataSync_Teams": "チームの同期", + "LDAP_Enterprise": "エンタープライズ", "LDAP_DataSync_BackgroundSync": "バックグラウンド同期", "LDAP_Server_Type": "サーバーの種類", "LDAP_Server_Type_AD": "Active Directory", @@ -3620,6 +3619,7 @@ "SAML_AuthnRequest_Template": "AuthnRequestテンプレート", "SAML_AuthnRequest_Template_Description": "次の変数を使用できます。 \n- **\\_\\_newId\\_\\_**:ランダムに生成されたID文字列 \n- **\\_\\_instant\\_\\_**:現在のタイムスタンプ \n- **\\_\\_callbackUrl\\_\\_**:Rocket.ChatコールバックURL \n- **\\_\\_entryPoint\\_\\_**:{{Custom Entry Point}}設定の値 \n- **\\_\\_issuer\\_\\_**:{{Custom Issuer}}設定の値 \n- **\\_\\_identifierFormatTag\\_\\_**:有効な{{Identifier Format}}が構成されている場合の{{NameID Policy Template}}の内容 \n- **\\_\\_identifierFormat\\_\\_**:{{Identifier Format}}設定の値 \n- **\\_\\_authnContextTag\\_\\_**:有効な{{Custom Authn Context}}が構成されている場合の {{AuthnContext Template}} の内容 \n- **\\_\\_authnContextComparison\\_\\_**:{{Authn Context Comparison}}設定の値 \n- **\\_\\_authnContext\\_\\_**:{{Custom Authn Context}}設定の値", "SAML_Connection": "接続", + "SAML_Enterprise": "エンタープライズ", "SAML_General": "一般", "SAML_Custom_Authn_Context": "カスタム認証コンテキスト", "SAML_Custom_Authn_Context_Comparison": "認証コンテキストの比較", @@ -3729,6 +3729,7 @@ "Security": "セキュリティ", "See_full_profile": "全プロフィールを見る", "See_on_Engagement_Dashboard": "エンゲージメントダッシュボードで見る", + "Select": "選択", "Select_a_department": "部署を選択", "Select_a_room": "ルームを選択", "Select_a_user": "ユーザーを選択", @@ -4840,6 +4841,7 @@ "RegisterWorkspace_Features_Omnichannel_Title": "オムニチャネル", "RegisterWorkspace_Setup_Label": "クラウドアカウントメール", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "<1>使用と<3>プライバシーポリシーに同意します", + "Enterprise": "エンタープライズ", "UpgradeToGetMore_engagement-dashboard_Title": "分析", "UpgradeToGetMore_auditing_Title": "メッセージ監査" } \ No newline at end of file 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 ce34a793ff46..7f3d31510b6f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json @@ -1205,7 +1205,7 @@ "E2E_Encryption_Password_Change": "დაშიფვრის პაროლის შეცვლა", "E2E_Encryption_Password_Explanation": "ახლა შეგიძლიათ შექმნათ დაშიფრული პირადი ჯგუფები და პირდაპირი შეტყობინებები. თქვენ ასევე შეგიძლიათ დაშიფროთ არსებული პირადი ჯგუფები ან DM-ები .

ეს არის წერტილიდან ბოლო წერტილამდე დაშიფვრა ამიტომ თქვენი გასაღები არ იქნება შენახული სერვერზე. ამითომ გასაღები უნდა შეინახოთ თქვენ. თქვენ მოგიწევთ ამ გასაღების გამოყენება სხვა მოწყობილობებზე რომლებზეც მოისურვებთ e2e დაშიფვრის გამოყენებას", "E2E_password_request_text": "თქვენ დაშიფრულ პირად ჯგუფებზე და პირად მესიჯებზე წვდომისთვის შეიყვანეთ პაროლი.
ეს პაროლი უნდა შეიყვანოთ თქვენი შეტყობინებების დაშიფვრა/გაშიფვრისთვის ყოველი კლიენტისთვის, რადგან პაროლი სერვერზე არ ინახება", - "E2E_password_reveal_text": "ახლა შეგიძლიათ შექმნათ დაშიფრული პირადი ჯგუფები და პირდაპირი შეტყობინებები. თქვენ ასევე შეგიძლიათ დაშიფროთ არსებული პირადი ჯგუფები ან DM-ები.

ეს არის წერტილიდან ბოლო წერტილამდე დაშიფვრა ამიტომ თქვენი გასაღები არ იქნება შენახული სერვერზე. ამითომ გასაღები უნდა შეინახოთ თქვენ. თქვენ მოგიწევთ ამ გასაღების გამოყენება სხვა მოწყობილობებზე რომლებზეც მოისურვებთ e2e დაშიფვრის გამოყენებას გაიგეთ მეტი აქ!

თქვენი პაროლი არის:%s

ეს არის ავტომატურად გენერირებული პაროლი, პაროლის შეცვლა შეგიძლიათ ნებისმიერ დროს ნებისმიერი ბრაუზერიდან(არსებული პაროლის შეყვანის შემდეგ).
ეს პაროლი ინახება მხოლოდ ამ ბრაუზერში სანამ თქვენ არ შეინახავთ მას. შეინახეთ პაროლი ამ შეტყობინების გათიშვამდე", + "E2E_password_reveal_text": "ახლა შეგიძლიათ შექმნათ დაშიფრული პირადი ჯგუფები და პირდაპირი შეტყობინებები. თქვენ ასევე შეგიძლიათ დაშიფროთ არსებული პირადი ჯგუფები ან DM-ები.

ეს არის წერტილიდან ბოლო წერტილამდე დაშიფვრა ამიტომ თქვენი გასაღები არ იქნება შენახული სერვერზე. ამითომ გასაღები უნდა შეინახოთ თქვენ. თქვენ მოგიწევთ ამ გასაღების გამოყენება სხვა მოწყობილობებზე რომლებზეც მოისურვებთ e2e დაშიფვრის გამოყენებას გაიგეთ მეტი აქ!

თქვენი პაროლი არის:{{randomPassword}}

ეს არის ავტომატურად გენერირებული პაროლი, პაროლის შეცვლა შეგიძლიათ ნებისმიერ დროს ნებისმიერი ბრაუზერიდან(არსებული პაროლის შეყვანის შემდეგ).
ეს პაროლი ინახება მხოლოდ ამ ბრაუზერში სანამ თქვენ არ შეინახავთ მას. შეინახეთ პაროლი ამ შეტყობინების გათიშვამდე", "E2E_Reset_Key_Explanation": "ეს პარამეტრი წაშლის თქვენს მიმდინარე E2E გასაღებს და გამოხვალთ სისტემიდან.
ისევ შესვლისას, Rocket.Chat დააგენერირებს თქვენ ახალ გასაღებს და აღადგენს თქვენს დაშვებას ნებისმიერ დაშიფრული ოთახში, რომელშიც არის ერთი ან მეტი წევრი ონლაინ.
E2E დაშიფვრის ხასიათის გამო, Rocket.Chat არ შეუძლია აღადგინოს დაშიფრული ოთახი, რომელშიც არ არის არც-ერთი წევრი ონლაინ.", "Edit": "რედაქტირება", "Edit_Business_Hour": "სამუშაო საათების რედაქტირება", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json index b2bd9ab7d4a9..8acc4f3c84d4 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json @@ -3113,6 +3113,7 @@ "registration.component.form.confirmPassword": "បញ្ជាក់​ពាក្យ​សម្ងាត់", "registration.component.form.sendConfirmationEmail": "ផ្ញើរអ៊ីម៉ែល​បញ្ជាក់", "onboarding.form.registerOfflineForm.title": "ចុះឈ្មោះដោយដៃ", + "Enterprise": "សហគ្រាស", "UpgradeToGetMore_engagement-dashboard_Title": "វិភាគ", "UpgradeToGetMore_auditing_Title": "សវនកម្មសារ" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json index 7d3c83aed552..94c8816e57b2 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -755,8 +755,6 @@ "Cloud_register_offline_finish_helper": "Cloud Console에서 등록 프로세스를 완료하면 몇 가지 텍스트가 표시됩니다. 등록을 마치려면 여기에 붙여 넣으십시오.", "Cloud_register_offline_helper": "에어 갭 또는 네트워크 액세스가 제한되는 경우 Workspace를 수동으로 등록 할 수 있습니다. 아래 텍스트를 복사하고 Cloud Console로 이동하여 프로세스를 완료하십시오.", "Cloud_register_success": "Workspace가 성공적으로 등록되었습니다!", - "Cloud_registration_pending_html": " 등록이 완료 될 때까지 모바일 알림이 작동하지 않습니다. 자세히 알아보기 ", - "Cloud_registration_pending_title": "현재 클라우드 등록 처리가 지연 중입니다.", "Cloud_registration_required": "등록이 필요합니다.", "Cloud_registration_required_description": "설치 중에는 Workspace가 등록되지 않은 것처럼 보입니다.", "Cloud_registration_required_link_text": " Workspace를 등록하려면 여기를 클릭하십시오.", @@ -1324,7 +1322,7 @@ "E2E_Encryption_Password_Explanation": "이제 암호화된 비공개 그룹 및 1:1 대화방을 만들 수 있습니다. 기존 비공개 그룹이나 1:1 대화방을 암호화하도록 변경할 수도 있습니다.

메시지 암호화/복호화 키가 서버에 저장되지 않는 종단간 암호화입니다. 그러므로 안전한 곳에 비밀번호를 저장해야 합니다. E2E 암호화를 사용하려는 다른 장치에 이 비밀번호를 입력해야 합니다.", "E2E_key_reset_email": "E2E 키 재설정 알림", "E2E_password_request_text": "암호화된 비공개그룹 및 1:1 대화방에 액세스하려면 암호화 비밀번호를 입력하십시오.
키가 서버에 저장되어 있지 않으므로 사용하는 모든 클라이언트에서 메시지를 암호화/복호화하려면 이 비밀번호를 입력해야합니다.", - "E2E_password_reveal_text": "이제 암호화된 비공개 그룹 및 1:1 대화방을 만들 수 있습니다. 기존 비공개 그룹이나 1:1 대화방을 암호화하도록 변경할 수도 있습니다.

메시지 암호화/복호화 키가 서버에 저장되지 않는 종단간 암호화입니다. 그러므로 안전한 곳에 비밀번호를 저장해야 합니다. E2E 암호화를 사용하려는 다른 장치에 이 비밀번호를 입력해야 합니다. 더 배워보세요!

비밀번호는 %s입니다.

자동으로 만들어진 비밀번호입니다. 기존 비밀번호를 입력한 모든 브라우저에서 언제든 새 비밀번호를 설정할 수 있습니다.
이 비밀번호는 이 메시지를 닫을 때까지 오직 현재 브라우저에만 저장됩니다.", + "E2E_password_reveal_text": "이제 암호화된 비공개 그룹 및 1:1 대화방을 만들 수 있습니다. 기존 비공개 그룹이나 1:1 대화방을 암호화하도록 변경할 수도 있습니다.

메시지 암호화/복호화 키가 서버에 저장되지 않는 종단간 암호화입니다. 그러므로 안전한 곳에 비밀번호를 저장해야 합니다. E2E 암호화를 사용하려는 다른 장치에 이 비밀번호를 입력해야 합니다. 더 배워보세요!

비밀번호는 {{randomPassword}}입니다.

자동으로 만들어진 비밀번호입니다. 기존 비밀번호를 입력한 모든 브라우저에서 언제든 새 비밀번호를 설정할 수 있습니다.
이 비밀번호는 이 메시지를 닫을 때까지 오직 현재 브라우저에만 저장됩니다.", "E2E_Reset_Email_Content": "자동으로 로그 아웃되었습니다. 다시 로그인하면 Rocket.Chat은 새 키를 생성하고 온라인 회원이 한 명 이상인 암호화 된 방에 대한 액세스를 복원합니다. E2E 암호화의 특성으로 인해 Rocket.Chat은 온라인에 회원이없는 암호화 된 방에 대한 액세스를 복원 할 수 없습니다.", "E2E_Reset_Key_Explanation": "이 옵션은 현재 E2E 키를 제거하고 로그 아웃합니다.
다시 로그인하면 Rocket.Chat에서 새 키를 생성하고 온라인으로 하나 이상의 구성원이있는 암호화 된 방에 대한 액세스 권한을 복원합니다.
E2E 암호화의 특성상 Rocket.Chat은 온라인으로 회원이없는 암호화 된 방에 대한 액세스를 복원 할 수 있습니다.", "E2E_Reset_Other_Key_Warning": "현재 E2E 키를 재설정하면 사용자가 로그 아웃됩니다. 사용자가 다시 로그인하면 Rocket.Chat은 새 키를 생성하고 한 명 이상의 온라인 회원이있는 암호화 된 방에 대한 사용자 액세스를 복원합니다. E2E 암호화의 특성으로 인해 Rocket.Chat은 온라인에 회원이없는 암호화 된 방에 대한 액세스를 복원 할 수 없습니다.", @@ -4028,6 +4026,7 @@ "registration.component.form.sendConfirmationEmail": "확인 메일 보내기", "onboarding.component.form.action.pasteHere": "여기에 붙여 넣기 ...", "onboarding.form.registerOfflineForm.title": "오프라인 등록", + "Enterprise": "기업", "UpgradeToGetMore_engagement-dashboard_Title": "분석(에널리틱스)", "UpgradeToGetMore_auditing_Title": "메시지 감사" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json index 16d158296baf..856732eca0be 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json @@ -2747,5 +2747,6 @@ "registration.component.form.invalidConfirmPass": "دووبارەکراوەی تێپەڕەوشە یەکناگرێتەوە لەگەڵ تێپەڕەوشە", "registration.component.form.confirmPassword": "تێپەڕەوشەکەت پشتڕاستکەوە", "registration.component.form.sendConfirmationEmail": "ئیمەیڵی پشتڕاستکردنەوە بنێرە", + "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json index 669b16aafcb0..34f308d2ab50 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json @@ -2795,5 +2795,6 @@ "registration.component.form.invalidConfirmPass": "ການຢືນຢັນລະຫັດຜ່ານບໍ່ກົງກັບລະຫັດຜ່ານ", "registration.component.form.confirmPassword": "ຢືນຢັນລະຫັດຜ່ານຂອງທ່ານ", "registration.component.form.sendConfirmationEmail": "ສົ່ງອີເມວການຢືນຢັນ", + "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "ການວິເຄາະ" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json index eb49bf3c63de..89226d5019d8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json @@ -2812,5 +2812,6 @@ "registration.component.form.invalidConfirmPass": "Slaptažodžio patvirtinimas nesutampa su slaptažodžiu", "registration.component.form.confirmPassword": "Patvirtinkite savo slaptažodį", "registration.component.form.sendConfirmationEmail": "Siųsti patvirtinimo el. Laišką", + "Enterprise": "Įmonė", "UpgradeToGetMore_engagement-dashboard_Title": "\"Analytics\"" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json index cadd9fce67fd..ab594b7d2f69 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json @@ -2753,5 +2753,6 @@ "registration.component.form.invalidConfirmPass": "Paroles apstiprinājums neatbilst parolei", "registration.component.form.confirmPassword": "Apstipriniet savu paroli", "registration.component.form.sendConfirmationEmail": "Nosūtīt apstiprinājuma e-pastu", + "Enterprise": "Uzņēmums", "UpgradeToGetMore_engagement-dashboard_Title": "Analītika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json index ae6c84d9dc8c..ebf318f3aa07 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json @@ -2746,5 +2746,6 @@ "registration.component.form.invalidConfirmPass": "Нууц үг баталгаажуулалт нь нууц үгтэй таарахгүй байна", "registration.component.form.confirmPassword": "Нууц үгээ батлах", "registration.component.form.sendConfirmationEmail": "Баталгаажуулах имэйл илгээх", + "Enterprise": "Аж ахуйн нэгж", "UpgradeToGetMore_engagement-dashboard_Title": "Аналитик" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json index a29f217b19f9..dcc6057f2efc 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json @@ -2763,5 +2763,6 @@ "registration.component.form.invalidConfirmPass": "Pengesahan kata laluan tidak sepadan dengan kata laluan", "registration.component.form.confirmPassword": "Sahkan kata laluan anda", "registration.component.form.sendConfirmationEmail": "Hantar e-mel pengesahan", + "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analisis" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json index 4e0f9794fb97..95159b32811b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -873,8 +873,6 @@ "Cloud_register_offline_finish_helper": "Nadat u het registratieproces in de Cloud Console hebt voltooit, krijgt u wat tekst te zien. Plak het hier om de registratie te voltooien.", "Cloud_register_offline_helper": "Werkruimten kunnen handmatig worden geregistreerd als het airgapped is of wanneer de netwerktoegang beperkt is. Kopieer de onderstaande tekst en ga naar onze Cloud Console om het proces te voltooien.", "Cloud_register_success": "Uw werkruimte is succesvol geregistreerd!", - "Cloud_registration_pending_html": "Pushmeldingen werken pas als de registratie voltooid is. Meer informatie", - "Cloud_registration_pending_title": "Cloudregistratie is nog in behandeling", "Cloud_registration_required": "Registratie vereist", "Cloud_registration_required_description": "Het lijkt erop dat u tijdens de installatie er niet hebt voor gekozen om uw werkruimte te registreren.", "Cloud_registration_required_link_text": "Klik hier om je werkruimte te registreren.", @@ -1493,7 +1491,7 @@ "E2E_Encryption_Password_Explanation": "Je kunt nu gecodeerde privégroepen en directe berichten maken. Je kunt ook bestaande privégroepen of DM's ook coderen.

Dit is end-to-end codering, zodat de sleutel voor het coderen/decoderen van jouw berichten niet op de server wordt opgeslagen. Om die reden moet je jouw wachtwoord op een veilige plaats bewaren. Je moet het invoeren op andere apparaten waarop je e2e-codering wilt gebruiken.", "E2E_key_reset_email": "E2E Key Reset-melding", "E2E_password_request_text": "Om toegang te krijgen tot uw gecodeerde privégroepen en privéberichten, voert u uw coderingswachtwoord in.
U moet dit wachtwoord invoeren om uw berichten te coderen / decoderen op elke client die u gebruikt, aangezien de sleutel niet op de server is opgeslagen.", - "E2E_password_reveal_text": "Je kunt nu gecodeerde privégroepen en directe berichten maken. Je kunt bestaande privégroepen of DM's ook coderen.

Dit is end-to-end codering, zodat de sleutel voor het coderen/decoderen van jouw berichten niet op de server wordt opgeslagen. Om die reden moet je jouw wachtwoord op een veilige plaats bewaren. Je moet het invoeren op andere apparaten waarop je e2e-codering wilt gebruiken. Meer informatie hier !

Je wachtwoord is: %s

Dit is een automatisch gegenereerd wachtwoord, je kan een nieuw wachtwoord voor jouw coderingssleutel op elk gewenst moment vanuit elke browser waarin je het bestaande wachtwoord hebt ingevoerd, aanvragen.
Dit wachtwoord wordt alleen in deze browser opgeslagen totdat je het wachtwoord opslaat en dit bericht negeert.", + "E2E_password_reveal_text": "Je kunt nu gecodeerde privégroepen en directe berichten maken. Je kunt bestaande privégroepen of DM's ook coderen.

Dit is end-to-end codering, zodat de sleutel voor het coderen/decoderen van jouw berichten niet op de server wordt opgeslagen. Om die reden moet je jouw wachtwoord op een veilige plaats bewaren. Je moet het invoeren op andere apparaten waarop je e2e-codering wilt gebruiken. Meer informatie hier !

Je wachtwoord is: {{randomPassword}}

Dit is een automatisch gegenereerd wachtwoord, je kan een nieuw wachtwoord voor jouw coderingssleutel op elk gewenst moment vanuit elke browser waarin je het bestaande wachtwoord hebt ingevoerd, aanvragen.
Dit wachtwoord wordt alleen in deze browser opgeslagen totdat je het wachtwoord opslaat en dit bericht negeert.", "E2E_Reset_Email_Content": "Je bent automatisch uitgelogd. Wanneer je opnieuw inlogt, zal Rocket.Chat een nieuwe sleutel genereren en je toegang herstellen tot elke versleutelde kamer met een of meer online leden. Vanwege de aard van de E2E-codering kan Rocket.Chat de toegang tot een gecodeerde kamer waar geen lid online is, niet herstellen.", "E2E_Reset_Key_Explanation": "Met deze optie wordt uw huidige E2E-sleutel verwijderd en wordt u uitgelogd.
Wanneer je opnieuw inlogt, zal Rocket.Chat je een nieuwe sleutel genereren en je toegang herstellen tot elke versleutelde kamer met een of meer online leden.
Vanwege de aard van de E2E-codering kan Rocket.Chat de toegang tot een gecodeerde kamer waar geen lid online is, niet herstellen.", "E2E_Reset_Other_Key_Warning": "Als u de huidige E2E-sleutel reset, wordt de gebruiker uitgelogd. Wanneer de gebruiker opnieuw inlogt, genereert Rocket.Chat een nieuwe sleutel en herstelt de gebruiker de toegang tot elke gecodeerde kamer met een of meer online leden. Vanwege de aard van de E2E-codering kan Rocket.Chat de toegang tot een gecodeerde kamer waar geen online lid is, niet herstellen.", @@ -2422,6 +2420,7 @@ "LDAP_DataSync_Roles": "Rollen synchroniseren", "LDAP_DataSync_Channels": "Kanalen synchroniseren", "LDAP_DataSync_Teams": "Teams synchroniseren", + "LDAP_Enterprise": "Onderneming", "LDAP_DataSync_BackgroundSync": "Achtergrondsynchronisatie", "LDAP_Server_Type": "Server type", "LDAP_Server_Type_AD": "Active Directory", @@ -3645,6 +3644,7 @@ "SAML_AuthnRequest_Template": "AuthnRequest Template", "SAML_AuthnRequest_Template_Description": "De volgende variabelen zijn beschikbaar: \n- **\\_\\_newId\\_\\_**: Willekeurig gegenegeerde id-string \n- **\\_\\_instant\\_\\_**: Huidige tijdstempel \n- **\\_\\_callbackUrl\\_\\_**: De Rocket.Chat callback URL. \n- **\\_\\_entryPoint\\_\\_**: De waarde van de {{Custom Entry Point}} instelling. \n- **\\_\\_issuer\\_\\_**: De waarde van de {{Custom Issuer}} instelling. \n- **\\_\\_identifierFormatTag\\_\\_**: De inhoud van de {{NameID Policy Template}} indien een geldige {{Identifier Format}} geconfigureerd is. \n- **\\_\\_identifierFormat\\_\\_**: De waarde van de {{Identifier Format}} instelling. \n- **\\_\\_authnContextTag\\_\\_**: De inhoud van de {{AuthnContext Template}} indien een geldige {{Custom Authn Context}} geconfigureerd is. \n- **\\_\\_authnContextComparison\\_\\_**: De waarde van de {{Authn Context Comparison}} instelling. \n- **\\_\\_authnContext\\_\\_**: De waarde van de {{Custom Authn Context}} instelling.", "SAML_Connection": "Verbinding", + "SAML_Enterprise": "Onderneming", "SAML_General": "Algemeen", "SAML_Custom_Authn_Context": "Aangepaste Authn-context", "SAML_Custom_Authn_Context_Comparison": "Authn-contextvergelijking", @@ -3755,6 +3755,7 @@ "See_documentation": "Documentatie bekijken", "See_full_profile": "Bekijk het volledige profiel", "See_on_Engagement_Dashboard": "Zie op het Engagement Dashboard", + "Select": "Selecteer", "Select_a_department": "Selecteer een afdeling", "Select_a_room": "Kies een kamer", "Select_a_user": "Selecteer een gebruiker", @@ -4878,6 +4879,7 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mailadres van cloudaccount", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ik ga akkoord met de <1>Algemene voorwaarden en <3>Privacybeleid", + "Enterprise": "Onderneming", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "Bericht auditing" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json index 111c9efa53bd..f1d3862c76d6 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json @@ -1,28 +1,68 @@ { "500": "Intern server feil", + "__agents__agents_and__count__conversations__period__": "{{agents}} agenter og {{count}} samtaler, {{period}}", + "__count__empty_rooms_will_be_removed_automatically": "{{count}} tomme rom vil bli fjernet automatisk.", + "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomme rom vil bli fjernet automatisk:
{{rooms}}.", + "__count__conversations__period__": "{{count}} samtaler, {{period}}", + "__count__tags__and__count__conversations__period__": "{{count}}-tagger og {{conversations}}-samtaler, {{period}}", + "__departments__departments_and__count__conversations__period__": "{{departments}} avdelinger og {{count}} samtaler, {{period}}", + "__usersCount__member_joined": "+ {{usersCount}} medlem ble med", + "__usersCount__member_joined_plural": "+ {{usersCount}} medlemmer ble med", + "__usersCount__people_will_be_invited": "{{usersCount}} personer blir invitert", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} er ikke lenger {{role}} av {{user_by}}", "__username__was_set__role__by__user_by_": "{{username}} ble satt {{role}} av {{user_by}}", + "__count__without__department__": "{{count}} uten avdeling", + "__count__without__tags__": "{{count}} uten tagger", + "__count__without__assignee__": "{{count}} uten mottaker", + "removed__username__as__role_": "fjernet {{username}} som {{role}}", + "set__username__as__role_": "sett {{username}} som {{role}}", + "This_room_encryption_has_been_enabled_by__username_": "Dette rommets kryptering er aktivert av {{username}}", + "This_room_encryption_has_been_disabled_by__username_": "Dette rommets kryptering har blitt deaktivert av {{username}}", + "Third_party_login": "Tredjeparts innlogging", + "Enabled_E2E_Encryption_for_this_room": "aktivert E2E-kryptering for dette rommet", + "disabled": "deaktivert", + "Disabled_E2E_Encryption_for_this_room": "deaktivert E2E-kryptering for dette rommet", "@username": "@brukernavn", "@username_message": "@brukernavn ", "#channel": "#kanal", - "%_of_conversations": "% av samtaler", + "%_of_conversations": "%% av samtaler", "0_Errors_Only": "0 - Kun Feil", "1_Errors_and_Information": "1 - Feil og informasjon", "2_Erros_Information_and_Debug": "2 - Feil, Informasjon og Feilsøking", "12_Hour": "12-timers klokke", "24_Hour": "24-timers klokke", + "A_cloud-based_platform_for_those_needing_a_plug-and-play_app": "En skybasert plattform for de som trenger en plug-and-play-app.", + "A_new_owner_will_be_assigned_automatically_to__count__rooms": "En ny eier vil automatisk bli tildelt {{count}} rom.", + "A_new_owner_will_be_assigned_automatically_to_the__roomName__room": "En ny eier vil automatisk bli tildelt {{roomName}}-rommet.", + "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "En ny eier vil automatisk bli tildelt disse {{count}}-rommene:
{{rooms}}.", + "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "En sikker og privat selvstyrt løsning for konferansesamtaler.", + "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "En arbeidsområdeadministrator må installere og konfigurere en konferansesamtale-app.", + "An_app_needs_to_be_installed_and_configured": "En app må installeres og konfigureres.", + "Accessibility": "Tilgjengelighet", + "Accessibility_and_Appearance": "Tilgjengelighet og utseende", + "Accessibility_activation": "Her kan du aktivere en rekke funksjoner for å forbedre nettleseropplevelsen din.", + "Accept_Call": "Godta anrop", "Accept": "Aksepter", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Aksepter innkommende livechat selv om det ikke er noen online", - "Accept_with_no_online_agents": "Aksepter uten online agenter", - "Access_not_authorized": "Aksepter uautoriserte", + "Accept_new_livechats_when_agent_is_idle": "Godta nye omnikanalforespørsler når agenten er inaktiv", + "Accept_with_no_online_agents": "Aksepter uten påloggede agenter", + "Access_not_authorized": "Tilgang ikke autorisert", "Access_Token_URL": "Tilgangstoken URL", + "Access_Your_Account": "Få tilgang til kontoen din", + "access_your_basic_information": "tilgang til din basis informasjon", "access-mailer": "Tilgang til Mailer-skjermen", "access-mailer_description": "Tillatelse til å sende masse e-post til alle brukere.", + "access-marketplace": "Få tilgang til markedsplassen", + "access-marketplace_description": "Tillatelse til å bla gjennom og hente apper fra markedsplassen", "access-permissions": "Tilgang Tillatelser Skjerm", "access-permissions_description": "Endre tillatelser for ulike roller.", + "access-setting-permissions": "Endre innstillingsbaserte tillatelser", + "access-setting-permissions_description": "Tillatelse til å endre innstillingsbaserte tillatelser", "Accessing_permissions": "Få tilgang til tillatelser", "Account_SID": "Konto SID", + "Account": "konto", "Accounts": "kontoer", + "Accounts_Description": "Endre medlemskontoinnstillingene for arbeidsområdet.", "Accounts_Admin_Email_Approval_Needed_Default": "

Brukeren [name] ([email]) er registrert.

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", "Accounts_Admin_Email_Approval_Needed_Subject_Default": "En ny bruker registrert og trenger godkjenning", "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Brukeren [name] ([email]) er registrert.

Årsak: [reason]

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", @@ -31,9 +71,12 @@ "Accounts_AllowDeleteOwnAccount": "Tillat brukere å slette egen konto", "Accounts_AllowedDomainsList": "Liste over aksepterte domener", "Accounts_AllowedDomainsList_Description": "Kommaseparert liste over tillatte domener", + "Accounts_AllowInvisibleStatusOption": "Tillat usynlig status", "Accounts_AllowEmailChange": "Tillat endring av e-post", "Accounts_AllowEmailNotifications": "Tillat epostvarsling", + "Accounts_AllowFeaturePreview": "Tillat funksjonsforhåndsvisning", "Accounts_AllowPasswordChange": "Tillat passordendring", + "Accounts_AllowPasswordChangeForOAuthUsers": "Tillat passordendring for OAuth-brukere", "Accounts_AllowRealNameChange": "Tillat navneskift", "Accounts_AllowUserAvatarChange": "Tillat brukervennlige endringer", "Accounts_AllowUsernameChange": "Tillat endring av brukernavn", @@ -59,6 +102,7 @@ "Accounts_Default_User_Preferences_not_available": "Kunne ikke hente brukerinnstillinger fordi de ennå ikke er konfigurert av brukeren", "Accounts_DefaultUsernamePrefixSuggestion": "Standard brukernavn Prefix Suggestion", "Accounts_denyUnverifiedEmail": "Avvis unverifisert e-post", + "Accounts_Directory_DefaultView": "Standard katalogoppføring", "Accounts_Email_Activated": "[navn]

Kontoen din ble aktivert.

", "Accounts_Email_Activated_Subject": "Konto aktivert", "Accounts_Email_Approved": "[navn]

Kontoen din ble godkjent.

", @@ -78,21 +122,32 @@ "Accounts_iframe_url": "Iframe URL", "Accounts_LoginExpiration": "Innlogging Utløp i dager", "Accounts_ManuallyApproveNewUsers": "Godkjenn nye brukere manuelt", + "Accounts_OAuth_Apple": "Logg på med Apple", + "Accounts_OAuth_Apple_Description": "Hvis du vil at Apple-pålogging kun skal være aktivert på mobil, kan du la alle feltene stå tomme.", "Accounts_OAuth_Custom_Access_Token_Param": "Parameternavn for \"access token\"", "Accounts_OAuth_Custom_Authorize_Path": "Godkjenn sti", "Accounts_OAuth_Custom_Avatar_Field": "Avatarfelt", "Accounts_OAuth_Custom_Button_Color": "Knappfarge", "Accounts_OAuth_Custom_Button_Label_Color": "Knapptekstfarge", "Accounts_OAuth_Custom_Button_Label_Text": "Knapptekst", + "Accounts_OAuth_Custom_Channel_Admin": "Brukerdatagruppekart", + "Accounts_OAuth_Custom_Channel_Map": "OAuth gruppe Channel tildeling", + "Accounts_OAuth_Custom_Email_Field": "E-postfelt", "Accounts_OAuth_Custom_Enable": "Aktiver", + "Accounts_OAuth_Custom_Groups_Claim": "Roller/Grupper felt for kanalkartlegging", "Accounts_OAuth_Custom_id": "id", "Accounts_OAuth_Custom_Identity_Path": "Identitetsvei", "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Identitets Token Sendt Via", + "Accounts_OAuth_Custom_Key_Field": "Nøkkelfelt", "Accounts_OAuth_Custom_Login_Style": "Logg inn stil", + "Accounts_OAuth_Custom_Map_Channels": "Tilordne roller/grupper til kanaler", "Accounts_OAuth_Custom_Merge_Roles": "Slå sammen roller fra SSO", "Accounts_OAuth_Custom_Merge_Users": "Slå sammen brukere", + "Accounts_OAuth_Custom_Merge_Users_Distinct_Services": "Slå sammen brukere fra forskjellige tjenester", + "Accounts_OAuth_Custom_Merge_Users_Distinct_Services_Description": "Når det angitte nøkkelfeltet samsvarer med feltet til en eksisterende bruker, la brukere fra denne OAuth-tjenesten slås sammen med eksisterende brukere uavhengig av opprinnelsestjenesten.", "Accounts_OAuth_Custom_Name_Field": "Felt for navn", "Accounts_OAuth_Custom_Roles_Claim": "Roller / Grupper feltnavn", + "Accounts_OAuth_Custom_Roles_To_Sync": "Roller som skal synkroniseres", "Accounts_OAuth_Custom_Scope": "omfang", "Accounts_OAuth_Custom_Secret": "Hemmelig", "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "Vis knapp på innloggingsside", @@ -182,6 +237,9 @@ "Accounts_Registration_AuthenticationServices_Default_Roles": "Standardroller for godkjenningstjenester", "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Standardroller (kommaseparerte) brukere vil bli gitt når de registreres via autentiseringstjenester", "Accounts_Registration_AuthenticationServices_Enabled": "Registrering med godkjenningstjenester", + "Accounts_Registration_Users_Default_Roles": "Standard roller for brukere", + "Accounts_Registration_Users_Default_Roles_Description": "Standardroller (kommaseparert) brukere vil bli gitt ved registrering gjennom manuell registrering (inkludert via API)", + "Accounts_Registration_Users_Default_Roles_Enabled": "Aktiver standardroller for manuell registrering", "Accounts_Registration_InviteUrlType": "Type invitasjonslenke", "Accounts_Registration_InviteUrlType_Direct": "Direkte", "Accounts_Registration_InviteUrlType_Proxy": "Proxy", @@ -194,6 +252,8 @@ "Accounts_RegistrationForm_SecretURL_Description": "Du må oppgi en tilfeldig streng som vil bli lagt til din registreringsadresse. Eksempel: `https://open.rocket.chat/register/[secret_hash]`", "Accounts_RequireNameForSignUp": "Krever navn for registrering", "Accounts_RequirePasswordConfirmation": "Kreve passordbekreftelse", + "Accounts_RoomAvatarExternalProviderUrl": "Room Avatar ekstern tilbyder URL", + "Accounts_RoomAvatarExternalProviderUrl_Description": "Eksempel: `https://acme.com/api/v1/{roomId}`", "Accounts_SearchFields": "Felt som skal vurderes i søk", "Accounts_Send_Email_When_Activating": "Send e-post til brukeren når brukeren blir aktivert", "Accounts_Send_Email_When_Deactivating": "Send e-post til brukeren når brukeren blir deaktivert", @@ -202,6 +262,7 @@ "Accounts_SetDefaultAvatar": "Angi Standard Avatar", "Accounts_SetDefaultAvatar_Description": "Trenger å bestemme standard avatar basert på OAuth-konto eller Gravatar", "Accounts_ShowFormLogin": "Vis skjemabasert pålogging", + "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "Aktiver tofaktorautentisering via TOTP", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Automatisk aktiver tofaktor via e-post for nye brukere", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nye brukere vil ha tofaktorautentisering via e-post aktivert som standard. De vil kunne deaktivere det på profilsiden.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Tid i sekunder før koden sendt i e-post utløper", @@ -209,6 +270,7 @@ "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Brukere med bekreftet epostadresse og alternativet aktivert på profilsiden deres vil motta en e-post med en midlertidig kode for å autorisere visse handlinger som innlogging, lagring av profilen, etc.", "Accounts_TwoFactorAuthentication_Enabled": "Aktiver to faktorautentiseringer", "Accounts_TwoFactorAuthentication_Enabled_Description": "Brukere kan konfigurere tofaktorautentisering ved å bruke hvilken som helst TOTP-app, for eksempel Google Authenticator eller Authy", + "Accounts_TwoFactorAuthentication_Enforce_Password_Fallback": "Håndhev passordreservering", "Accounts_TwoFactorAuthentication_MaxDelta": "Maksimal Delta", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Maksimum Delta bestemmer hvor mange tokens er gyldige til enhver tid. Tokene genereres hvert 30. sekund, og gjelder for (30 * Maks. Delta) sekunder. \nEksempel: Med et maksimalt Delta-sett på 10, kan hver token brukes opptil 300 sekunder før eller etter tidsstempel. Dette er nyttig når klientens klokke ikke er riktig synkronisert med serveren.", "Accounts_TwoFactorAuthentication_RememberFor": "Husk tofaktor i (sekunder)", @@ -220,23 +282,45 @@ "Accounts_UserAddedEmail_Description": "Du kan bruke følgende plassholdere: \n - [navn], [fname], [lname] for brukerens fulle navn, fornavn eller etternavn. \n - `[email]` for brukerens e-postadresse. \n - [passord] for brukerens passord. \n - `[Site_Name]` og `[Site_URL]` for henholdsvis programnavnet og nettadressen. ", "API_EmbedDisabledFor_Description": "Kommaseparert liste over brukernavn for å deaktivere forhåndsvisning av embedded link.", "Accounts_UserAddedEmailSubject_Default": "Du har blitt lagt til i [Site_Name]", + "Accounts_Verify_Email_For_External_Accounts": "Merk e-post for eksterne kontoer som bekreftet", + "Action": "Handling", + "Action_required": "Handling kreves", + "Action_Available_After_Custom_Content_Added": "Denne handlingen blir tilgjengelig etter at det tilpassede innholdet er lagt til", + "Action_Available_After_Custom_Content_Added_And_Visible": "Denne handlingen blir tilgjengelig etter at det tilpassede innholdet er lagt til og gjort synlig for alle", "Activate": "Aktiver", "Active": "Aktiv", "Active_users": "Aktive brukere", "Activity": "Aktivitet", "Add": "Legg til", + "Add_a_Message": "Legg til en melding", "Add_agent": "Legg til agent", "Add_custom_oauth": "Legg til egendefinert oauth", "Add_Domain": "Legg til domene", + "Add_emoji": "Legg til emoji", "Add_files_from": "Legg til filer fra", "Add_manager": "Legg til leder", + "Add_monitor": "Legg til monitor", "Add_Reaction": "Legg til reaksjon", "Add_Role": "Legg til rolle", + "Add_Sender_To_ReplyTo": "Legg til avsender til svar-til", + "Add_Server": "Legg til server", + "Add_URL": "Legg til URL", "Add_user": "Legg til bruker", "Add_User": "Legg til bruker", "Add_users": "Legg til brukere", + "Add_members": "Legg til medlemmer", + "add-all-to-room": "Legg til alle brukere i et rom", + "add-all-to-room_description": "Tillatelse til å legge til alle brukere i et rom", + "add-livechat-department-agents": "Legg til omnikanalagenter til avdelinger", + "add-livechat-department-agents_description": "Tillatelse til å legge til omnikanalagenter til avdelinger", "add-oauth-service": "Legg til Oauth Service", "add-oauth-service_description": "Tillatelse til å legge til en ny Oauth-tjeneste", + "bypass-time-limit-edit-and-delete": "Omgå tidsbegrensning", + "bypass-time-limit-edit-and-delete_description": "Tillatelse til å omgå tidsgrense for redigering og sletting av meldinger", + "add-team-channel": "Legg til Team Channel", + "add-team-channel_description": "Tillatelse til å legge til en kanal i et team", + "add-team-member": "Legg til et teammedlem", + "add-team-member_description": "Tillatelse til å legge til medlemmer i et team", "add-user": "Legg til bruker", "add-user_description": "Tillatelse til å legge til nye brukere på serveren via brukerskjermbildet", "add-user-to-any-c-room": "Legg til bruker til hvilken som helst offentlig kanal", @@ -283,6 +367,8 @@ "All_logs": "Aller logger", "AutoLinker_UrlsRegExp": "AutoLinker URL Regular Expression", "All_messages": "Alle meldinger", + "All_Prices": "Alle priser", + "All_status": "Alle statuser", "All_users": "Alle brukere", "All_users_in_the_channel_can_write_new_messages": "Alle brukere i kanalen kan skrive nye meldinger", "Allow_collect_and_store_HTTP_header_informations": "Tillat å samle inn og lagre informasjon om HTTP headere.", @@ -290,12 +376,20 @@ "Allow_Invalid_SelfSigned_Certs": "Tillat ugyldige selvsignerte sertifikater", "Allow_Invalid_SelfSigned_Certs_Description": "Tillat ugyldig og selvsignert SSL-sertifikat for koblingsvalidering og forhåndsvisninger.", "Allow_Marketing_Emails": "Tillat markedsføring e-post", + "Allow_Online_Agents_Outside_Business_Hours": "Tillat nettagenter utenom åpningstidene", + "Allow_Online_Agents_Outside_Office_Hours": "Tillat nettagenter utenom kontortiden", + "Allow_Save_Media_to_Gallery": "Tillat Lagre media til Galleri", "Allow_switching_departments": "Tillat besøkende å bytte avdelinger", "Almost_done": "Nesten ferdig", "Alphabetical": "Alfabetisk", "bold": "fet", + "Also_send_thread_message_to_channel_behavior": "Send også trådmelding til kanaladferd", + "Also_send_to_channel": "Send også til kanal", "Always_open_in_new_window": "Alltid åpne i nytt vindu", + "Always_show_thread_replies_in_main_channel": "Vis alltid trådsvar i hovedkanalen", + "Analytic_reports": "Analyse rapporter", "Analytics": "Analytics", + "Analytics_Description": "Se hvordan brukere samhandler med arbeidsområdet ditt.", "Analytics_features_enabled": "Funksjoner aktivert", "Analytics_features_messages_Description": "Sporer tilpassede hendelser relatert til handlinger en bruker gjør på meldinger.", "Analytics_features_rooms_Description": "Sporer tilpassede hendelser relatert til handlinger på en kanal eller gruppe (opprett, forlatt, slett).", @@ -358,30 +452,52 @@ "api-bypass-rate-limit": "Forbigå rate-limit for REST API", "Apiai_Key": "Api.ai Key", "Apiai_Language": "Api.ai Språk", + "APIs": "APIer", "App_author_homepage": "forfatter hjemmeside", + "App_Details": "Appdetaljer", + "App_Info": "App info", "App_Information": "App Informasjon", + "Apps_context_enterprise": "Enterprise", "App_Installation": "App installasjon", + "App_not_enabled": "App ikke aktivert", + "App_not_found": "App ikke funnet", "App_status_auto_enabled": "aktivert", "App_status_constructed": "konstruert", "App_status_disabled": "Funksjonshemmet", "App_status_error_disabled": "Deaktivert: Uncaught Error", "App_status_initialized": "initialisert", "App_status_invalid_license_disabled": "Deaktivert: Ugyldig lisens", + "Apps_disabled_when_Enterprise_trial_ended": "Apper deaktivert da Enterprise-prøveperioden ble avsluttet", "App_status_invalid_settings_disabled": "Deaktivert: Konfigurasjon er nødvendig", "App_status_manually_disabled": "Deaktivert: manuelt", "App_status_manually_enabled": "aktivert", "App_status_unknown": "Unknown", + "App_Store": "App Store", "App_support_url": "støtte url", "App_Url_to_Install_From": "Installer fra URL", "App_Url_to_Install_From_File": "Installer fra fil", + "App_user_not_allowed_to_login": "Appbrukere har ikke lov til å logge inn direkte.", "Appearance": "Utseende", "Application_added": "Søknad lagt til", + "Application_delete_warning": "Du vil ikke kunne gjenopprette denne applikasjonen!", "Application_Name": "Programnavn", "Application_updated": "Søknad oppdatert", "Apply": "Søke om", "Apply_and_refresh_all_clients": "Påfør og oppdater alle klienter", "Apps": "Apps", + "Apps_context_explore": "Utforske", + "Apps_context_installed": "Installert", + "Apps_context_requested": "Forespurt", + "Apps_context_private": "Private apper", + "Apps_context_premium": "Premium", + "Apps_Count_Enabled": "{{count}} app aktivert", + "Apps_Count_Enabled_plural": "{{count}} apper aktivert", + "Private_Apps_Count_Enabled": "{{count}} privat app aktivert", + "Private_Apps_Count_Enabled_plural": "{{count}} private apper aktivert", "Apps_Engine_Version": "Versjon av Apps Engine", + "Apps_Game_Center": "Spillsenter", + "Apps_Game_Center_Back": "Tilbake til spillsenteret", + "Apps_Game_Center_Invite_Friends": "Inviter vennene dine til å bli med", "Apps_Settings": "Appens innstillinger", "Apps_WhatIsIt": "Apper: Hva er de?", "Apps_WhatIsIt_paragraph1": "Et nytt ikon i administrasjonsområdet! Hva betyr dette og hva er apper?", @@ -2859,5 +2975,6 @@ "registration.component.form.invalidConfirmPass": "Passordbekreftelsen stemmer ikke overens med passordet", "registration.component.form.confirmPassword": "Bekreft passordet ditt", "registration.component.form.sendConfirmationEmail": "Send bekreftelses-e-post", + "Enterprise": "Bedriften", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json index 9105bdf634fd..cb506379a6fe 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json @@ -952,8 +952,6 @@ "Cloud_register_offline_finish_helper": "Po zakończeniu procesu rejestracji w konsoli chmury powinien pojawić się tekst. Wklej go tutaj, aby zakończyć rejestrację.", "Cloud_register_offline_helper": "Obszary robocze można zarejestrować ręcznie, jeśli dostęp do sieci jest ograniczony. Skopiuj poniższy tekst i przejdź do konsoli chmury, aby zakończyć proces.", "Cloud_register_success": "Twój obszar roboczy został zarejestrowany!", - "Cloud_registration_pending_html": "Powiadomienia push nie będą działać do czasu zakończenia rejestracj.Dowiedz się więcej", - "Cloud_registration_pending_title": "Rejestracja w chmurze jest nadal w toku", "Cloud_registration_required": "Rejestracja wymagana", "Cloud_registration_required_description": "Wygląda na to, że podczas konfiguracji nie wybrano opcji rejestracji obszaru roboczego.", "Cloud_registration_required_link_text": "Kliknij tutaj, aby zarejestrować swój obszar roboczy.", @@ -1619,7 +1617,7 @@ "E2E_key_reset_email": "Powiadomienie o resetowaniu klucza E2E", "E2E_message_encrypted_placeholder": "Ta wiadomość jest zaszyfrowana end-to-end. Aby ją wyświetlić, musisz wprowadzić swój klucz szyfrowania w ustawieniach konta.", "E2E_password_request_text": "Aby uzyskać dostęp do zaszyfrowanych grup prywatnych i wiadomości bezpośrednich, wprowadź swoje hasło szyfrowania.
Musisz wprowadzić to hasło, aby kodować / dekodować wiadomości na każdym używanym kliencie, ponieważ klucz nie jest przechowywany na serwerze.", - "E2E_password_reveal_text": "Możesz teraz tworzyć zaszyfrowane grupy prywatne i wiadomości bezpośrednie. Możesz również zmienić istniejące prywatne grupy lub DM na zaszyfrowane.

To jest szyfrowanie od końca do końca, więc klucz do kodowania / dekodowania wiadomości nie zostanie zapisany na serwerze. Z tego powodu musisz przechowywać to hasło w bezpiecznym miejscu. Będziesz musiał wprowadzić go na innych urządzeniach, na których chcesz używać szyfrowania e2e. Dowiedz się więcej tutaj

Twoje hasło: %s

to jest automatycznie wygenerowane hasło, możesz ustawić nowe hasło do szyfrowania klucza w dowolnym momencie z dowolnej przeglądarki, do której wprowadziłeś istniejące hasło.
To hasło jest przechowywane tylko w tej przeglądarce, dopóki nie zapiszesz hasła i nie usuniesz tej wiadomości.", + "E2E_password_reveal_text": "Możesz teraz tworzyć zaszyfrowane grupy prywatne i wiadomości bezpośrednie. Możesz również zmienić istniejące prywatne grupy lub DM na zaszyfrowane.

To jest szyfrowanie od końca do końca, więc klucz do kodowania / dekodowania wiadomości nie zostanie zapisany na serwerze. Z tego powodu musisz przechowywać to hasło w bezpiecznym miejscu. Będziesz musiał wprowadzić go na innych urządzeniach, na których chcesz używać szyfrowania e2e. Dowiedz się więcej tutaj

Twoje hasło: {{randomPassword}}

to jest automatycznie wygenerowane hasło, możesz ustawić nowe hasło do szyfrowania klucza w dowolnym momencie z dowolnej przeglądarki, do której wprowadziłeś istniejące hasło.
To hasło jest przechowywane tylko w tej przeglądarce, dopóki nie zapiszesz hasła i nie usuniesz tej wiadomości.", "E2E_Reset_Email_Content": "Zostałeś automatycznie wylogowany. Kiedy zalogujesz się ponownie, Rocket.Chat wygeneruje nowy klucz i przywróci Twój dostęp do każdego zaszyfrowanego pokoju, który ma jednego lub więcej członków online. Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrócić dostępu do szyfrowanego pokoju, w którym nie ma żadnego członka online.", "E2E_Reset_Key_Explanation": "Ta opcja usunie Twój obecny klucz E2E i wyloguje Cię.
Po ponownym zalogowaniu się, Rocket.Chat wygeneruje nowy klucz i przywróci dostęp do szyfrowanego pokoju, który ma jednego lub więcej członków online.
Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrócić dostępu do szyfrowanego pokoju, który nie ma członków online.", "E2E_Reset_Other_Key_Warning": "Zresetowanie aktualnego klucza E2E spowoduje wylogowanie użytkownika. Gdy użytkownik zaloguje się ponownie, Rocket.Chat wygeneruje nowy klucz i przywróci użytkownikowi dostęp do każdego zaszyfrowanego pomieszczenia, które ma jednego lub więcej członków online. Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrócić dostępu do szyfrowanego pokoju, w którym nie ma żadnego członka online.", @@ -2618,6 +2616,7 @@ "LDAP_DataSync_Roles": "Synchronizacja ról", "LDAP_DataSync_Channels": "Synchronizacja Channel", "LDAP_DataSync_Teams": "Synchronizacja zespołów", + "LDAP_Enterprise": "Enterprise", "LDAP_DataSync_BackgroundSync": "Synchronizacja w tle", "LDAP_Server_Type": "Typ serwera", "LDAP_Server_Type_AD": "Active Directory", @@ -3972,6 +3971,7 @@ "SAML_AuthnRequest_Template": "Szablon AuthnContext ", "SAML_AuthnRequest_Template_Description": "Poniższe zmienne są dostępne: \n- **\\_\\_newId\\_\\_**: Losowo wygenerowany ciąg id \n- **\\_\\_instant\\_\\_**: Aktualny timestamp \n- **\\_\\_callbackUrl\\_\\_**: Rocket.Chat callback URL. \n- **\\_\\_entryPoint\\_\\_**: Wartość opcji {{Custom Entry Point}} . \n- **\\_\\_issuer\\_\\_**: Wartość opcji {{Custom Issuer}} . \n- **\\_\\_identifierFormatTag\\_\\_**: Zawartość {{NameID Policy Template}} jeśli poprawny {{Identifier Format}} jest skonfigurowany. \n- **\\_\\_identifierFormat\\_\\_**: Wartość opcji {{Identifier Format}} . \n- **\\_\\_authnContextTag\\_\\_**: Zawartość {{AuthnContext Template}} jeśli poprawny {{Custom Authn Context}} jest skonfigurowany. \n- **\\_\\_authnContextComparison\\_\\_**: Wartość opcji {{Authn Context Comparison}} . \n- **\\_\\_authnContext\\_\\_**: Wartość opcji {{Custom Authn Context}} .", "SAML_Connection": "Połączenie", + "SAML_Enterprise": "Enterprise", "SAML_General": "General", "SAML_Custom_Authn_Context": "Custom Authn Context", "SAML_Custom_Authn_Context_Comparison": "Authn Context Comparison", @@ -4094,6 +4094,7 @@ "See_full_profile": "Zobacz pełny profil", "See_history": "Zobacz historię", "See_on_Engagement_Dashboard": "Zobacz na Engagement Dashboard", + "Select": "Wybór", "Select_a_department": "Wybierz dział", "Select_a_room": "Wybierz pokój", "Select_a_user": "Wybierz użytkownika", @@ -5349,6 +5350,7 @@ "RegisterWorkspace_Setup_Label": "E-mail konta w chmurze", "RegisterWorkspace_Syncing_Complete": "Synchronizacja zakończona", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Zgadzam się z <1>zasadami i warunkami i <3>Polityką prywatności.", + "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analityka", "UpgradeToGetMore_auditing_Title": "Audyt wiadomości" } \ No newline at end of file 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 d202720dee71..2352e5d15bff 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -915,8 +915,6 @@ "Cloud_register_offline_finish_helper": "Após concluir o processo de registro no console da nuvem, você será apresentado a um texto. Cole-o aqui para finalizar o registro.", "Cloud_register_offline_helper": "Os espaços de trabalho podem ser registrados manualmente caso estejam esgotados ou acesso à rede seja restrito. Copie o texto abaixo e vá até nossa Cloud Console para concluir o processo.", "Cloud_register_success": "Seu espaço de trabalho foi registrado com sucesso!", - "Cloud_registration_pending_html": "Notificações móveis não funcionarão até que o registro seja finalizado. Saiba mais", - "Cloud_registration_pending_title": "Registro na nuvem ainda está pendente", "Cloud_registration_required": "Registro solicitado", "Cloud_registration_required_description": "Parece que durante a configuração você optou por não registrar seu espaço de trabalho.", "Cloud_registration_required_link_text": "Clique aqui para registrar seu espaço de trabalho.", @@ -1535,7 +1533,7 @@ "E2E_Encryption_Password_Explanation": "Agora você pode criar grupos privados criptografados e mensagens diretas. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E.", "E2E_key_reset_email": "Notificação de redefinição de chave E2E", "E2E_password_request_text": "Para acessar seus grupos privados e mensagens diretas criptografados, insira sua senha de criptografia.
Você precisa digitar essa senha para codificar / decodificar suas mensagens em todos os clientes que você usa, já que a chave não está armazenada no servidor.", - "E2E_password_reveal_text": "Agora você pode criar grupos privados e mensagens diretas criptografados. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E. Saiba mais aqui!

Sua senha é: %s

Esta é uma senha gerada automaticamente, você pode configurar uma nova senha para sua chave de criptografia a qualquer momento, a partir de qualquer navegador onde utilizou a senha existente.
Esta senha só é armazenada neste navegador até que você armazene a senha e feche esta mensagem.", + "E2E_password_reveal_text": "Agora você pode criar grupos privados e mensagens diretas criptografados. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E. Saiba mais aqui!

Sua senha é: {{randomPassword}}

Esta é uma senha gerada automaticamente, você pode configurar uma nova senha para sua chave de criptografia a qualquer momento, a partir de qualquer navegador onde utilizou a senha existente.
Esta senha só é armazenada neste navegador até que você armazene a senha e feche esta mensagem.", "E2E_Reset_Email_Content": "Você foi desconectado automaticamente. Quando você fizer login novamente, o Rocket.Chat vai gerar uma nova chave e restaurar seu acesso a qualquer sala criptografada que tenha um ou mais membros online. Devido à natureza da criptografia E2E, o Rocket.Chat não será capaz de restaurar acesso a qualquer sala criptografada que não tenha nenhum membro online.", "E2E_Reset_Key_Explanation": "Esta opção removerá sua chave E2E atual e o desconectará.
Quando você fizer login novamente, o Rocket.Chat vai gerar uma nova chave e restaurar seu acesso a qualquer sala criptografada que tenha um ou mais membros online.
Devido à natureza da criptografia E2E, o Rocket.Chat não poderá restaurar acesso a qualquer sala criptografada que não tenha algum membro online.", "E2E_Reset_Other_Key_Warning": "Redefinir a chave E2E atual vai desconectar o usuário. Quando o usuário fizer login novamente, o Rocket.Chat vai gerar uma nova chave e restaurar seu acesso a qualquer sala criptografada que tenha um ou mais membros online. Devido à natureza da criptografia E2E, o Rocket.Chat não será capaz de restaurar acesso a qualquer sala criptografada que não tenha nenhum membro online.", @@ -2477,6 +2475,7 @@ "LDAP_DataSync_Roles": "Sincronizar funções", "LDAP_DataSync_Channels": "Sincronizar canal", "LDAP_DataSync_Teams": "Sincronizar equipes", + "LDAP_Enterprise": "Enterprise", "LDAP_DataSync_BackgroundSync": "Sincronização em segundo plano", "LDAP_Server_Type": "Tipo de servidor", "LDAP_Server_Type_AD": "Active Directory", @@ -3723,6 +3722,7 @@ "SAML_AuthnRequest_Template": "Modelo AuthnRequest", "SAML_AuthnRequest_Template_Description": "As seguintes variáveis estão disponíveis: \n- **\\_\\_newId\\_\\_**: String ID gerada aleatoriamente \n- **\\_\\_instant\\_\\_**: Carimbo de hora atual \n- **\\_\\_callbackUrl\\_\\_**: O URL de callback do Rocket.Chat. \n- **\\_\\_entryPoint\\_\\_**: O valor da configuração {{Custom Entry Point}}. \n- **\\_\\_issuer\\_\\_**: O valor da configuração {{Custom Issuer}}. \n- **\\_\\_identifierFormatTag\\_\\_**: O conteúdo de {{NameID Policy Template}} se um {{Identifier Format}} válido estiver configurado. \n- **\\_\\_identifierFormat\\_\\_**: O valor da configuração {{Identifier Format}}. \n- **\\_\\_authnContextTag\\_\\_**: O conteúdo de {{AuthnContext Template}} se um {{Custom Authn Context}} válido estiver configurado. \n- **\\_\\_authnContextComparison\\_\\_**: O valor da configuração {{Authn Context Comparison}}. \n- **\\_\\_authnContext\\_\\_**: O valor da configuração {{Custom Authn Context}}.", "SAML_Connection": "Conexão", + "SAML_Enterprise": "Enterprise", "SAML_General": "Geral", "SAML_Custom_Authn_Context": "Authn Contex personalizado", "SAML_Custom_Authn_Context_Comparison": "Comparação de Authn Contex", @@ -3833,6 +3833,7 @@ "Security": "Segurança", "See_full_profile": "Ver perfil completo", "See_on_Engagement_Dashboard": "Ver no painel de engajamento", + "Select": "Selecionar", "Select_a_department": "Selecione um departamento", "Select_a_room": "Selecione uma sala", "Select_a_user": "Selecione um usuário", @@ -4983,6 +4984,7 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mail da conta da nuvem", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Eu concordo com os <1>Termos e condições e a <3>Política de privacidade", + "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "Auditoria de mensagem" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json index 72a3bf417bde..367c9c2cd97b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -1095,7 +1095,7 @@ "E2E_Enabled": "E2E activado", "E2E_Encryption_Password_Explanation": "Agora você pode criar grupos privados criptografados e mensagens diretas. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E.", "E2E_password_request_text": "Para acessar seus grupos privados e mensagens diretas criptografados , insira sua senha de criptografia.
Você precisa digitar essa senha para codificar / decodificar suas mensagens em todos os clientes que você usa, já que a chave não está armazenada no servidor.", - "E2E_password_reveal_text": "Agora pode criar grupos privados ou mensagens diretas encriptadas. Pode também alterar os grupos privados ou DMs existentes para encriptados.

Esta é uma encriptação de ponta a ponta, logo a chave para codificar / decodificar as suas mensagens não será salva no servidor. Por este motivo, precisa guardar a sua senha num lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a encriptação E2E. Saiba mais aqui!

A sua senha és: %s

Esta é uma senha gerada automaticamente, pode configurar uma nova senha para sua chave encriptada a qualquer momento e a partir de qualquer browser onde utilizou a senha existente.
Esta senha só é guardada neste browser até fechar esta mensagem.", + "E2E_password_reveal_text": "Agora pode criar grupos privados ou mensagens diretas encriptadas. Pode também alterar os grupos privados ou DMs existentes para encriptados.

Esta é uma encriptação de ponta a ponta, logo a chave para codificar / decodificar as suas mensagens não será salva no servidor. Por este motivo, precisa guardar a sua senha num lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a encriptação E2E. Saiba mais aqui!

A sua senha és: {{randomPassword}}

Esta é uma senha gerada automaticamente, pode configurar uma nova senha para sua chave encriptada a qualquer momento e a partir de qualquer browser onde utilizou a senha existente.
Esta senha só é guardada neste browser até fechar esta mensagem.", "Edit": "Editar", "Edit_Custom_Field": "Editar campo personalizado", "Edit_Department": "Editar departamento", @@ -3174,5 +3174,6 @@ "registration.component.form.invalidConfirmPass": "A confirmação da senha não é igual à senha", "registration.component.form.confirmPassword": "Confirmar a senha", "registration.component.form.sendConfirmationEmail": "Enviar email de confirmação", + "Enterprise": "Empreendimento", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json index ba36c951eee0..8a966903515c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json @@ -2752,5 +2752,6 @@ "registration.component.form.invalidConfirmPass": "Confirmarea parolei nu se potrivește cu parola introdusă", "registration.component.form.confirmPassword": "Confirmați parola", "registration.component.form.sendConfirmationEmail": "Trimite email de confirmare", + "Enterprise": "Afacere", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json index 997e45ea2eb7..80dbea76ae34 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -974,8 +974,6 @@ "Cloud_register_offline_finish_helper": "После завершения процесса регистрации в Cloud Console вам должен быть представлен некоторый текст. Пожалуйста, вставьте его здесь, чтобы закончить регистрацию.", "Cloud_register_offline_helper": "Рабочие места могут быть зарегистрированы вручную, если доступ в сеть ограничен. Скопируйте текст ниже и перейдите в нашу Cloud Console, чтобы завершить процесс.", "Cloud_register_success": "Ваше рабочее место успешно зарегистрировано!", - "Cloud_registration_pending_html": "Мобильные уведомления не будут работать до тех пор, пока не будет завершена регистрация. Узнайте больше ", - "Cloud_registration_pending_title": "Регистрация в облаке еще не завершена", "Cloud_registration_required": "Требуется регистрация", "Cloud_registration_required_description": "Похоже, что во время установки вы не решили регистрировать свое рабочее пространство.", "Cloud_registration_required_link_text": "Нажмите здесь, чтобы зарегистрировать ваше рабочее пространство.", @@ -1622,7 +1620,7 @@ "E2E_Encryption_Password_Explanation": "Теперь вы можете создавать зашифрованные частные группы и прямые сообщения. Вы также можете изменить существующие частные группы или DM на зашифрованные.

Это шифрование от конца до конца, поэтому ключ для кодирования / декодирования ваших сообщений не будет сохранен на сервере. По этой причине вам нужно хранить ваш пароль где-то в безопасности. Вам потребуется ввести его на других устройствах, на которых вы хотите использовать шифрование e2e.", "E2E_key_reset_email": "Уведомление о сбросе ключа E2E", "E2E_password_request_text": "Чтобы получить доступ к вашим зашифрованным частным группам и прямым сообщениям, введите пароль шифрования.
Вам необходимо ввести этот пароль для кодирования / декодирования ваших сообщений на каждом используемом вами клиенте, поскольку ключ не хранится на сервере.", - "E2E_password_reveal_text": "Теперь вы можете создавать зашифрованные частные группы и прямые сообщения. Вы также можете изменить существующие частные группы или DM на зашифрованные.

Это шифрование от конца до конца, поэтому ключ для кодирования / декодирования ваших сообщений не будет сохранен на сервере. По этой причине вам нужно сохранить этот пароль где-то в безопасности. Вам потребуется ввести его на другие устройства, на которых вы хотите использовать шифрование e2e. Подробнее здесь

Ваш пароль: %s

Это автоматический сгенерированный пароль, Вы можете установить новый пароль для шифрования в любое время из любого браузера вы ввели существующий пароль.
Этот пароль хранится только в этом браузере, пока вы не сохраните пароль и не отпустите это сообщение.", + "E2E_password_reveal_text": "Теперь вы можете создавать зашифрованные частные группы и прямые сообщения. Вы также можете изменить существующие частные группы или DM на зашифрованные.

Это шифрование от конца до конца, поэтому ключ для кодирования / декодирования ваших сообщений не будет сохранен на сервере. По этой причине вам нужно сохранить этот пароль где-то в безопасности. Вам потребуется ввести его на другие устройства, на которых вы хотите использовать шифрование e2e. Подробнее здесь

Ваш пароль: {{randomPassword}}

Это автоматический сгенерированный пароль, Вы можете установить новый пароль для шифрования в любое время из любого браузера вы ввели существующий пароль.
Этот пароль хранится только в этом браузере, пока вы не сохраните пароль и не отпустите это сообщение.", "E2E_Reset_Email_Content": "Для вас был осуществлен автоматический выход из системы. При повторном входе в систему Rocket.Chat сгенерирует новый ключ и восстановит доступ пользователя в любой зашифрованный чат, в котором есть один или несколько пользователей в сети. В связи с особенностями шифрования E2E, Rocket.Chat не сможет восстановить доступ к любому зашифрованному чату, в котором нет участников онлайн.", "E2E_Reset_Key_Explanation": "Эта опция удалит ваш текущий ключ E2E и выйдет из системы.
При повторном входе в систему Rocket.Chat сгенерирует новый ключ и восстановит доступ к любой зашифрованной комнате, в которой есть один или несколько пользователей в сети.
В связи с особенностями шифрования E2E, Rocket.Chat не сможет восстановить доступ к любой зашифрованной комнате, в которой нет пользователей в сети.", "E2E_Reset_Other_Key_Warning": "Сброс текущего ключа E2E приведет к выходу пользователя из системы. При повторном входе пользователя в систему Rocket.Chat сгенерирует новый ключ и восстановит доступ пользователя в любой зашифрованный чат в котором есть один или несколько пользователей в сети. В связи с особенностями шифрования E2E, Rocket.Chat не сможет восстановить доступ к любому зашифрованному чату, в котором нет участников онлайн.", @@ -2568,6 +2566,7 @@ "LDAP_DataSync_Roles": "Синхронизировать роли", "LDAP_DataSync_Channels": "Синхронизировать каналы", "LDAP_DataSync_Teams": "Синхронизировать рабочие группы", + "LDAP_Enterprise": "Организация", "LDAP_DataSync_BackgroundSync": "Фоновая синхронизация", "LDAP_Server_Type": "Тип сервера", "LDAP_Server_Type_AD": "Active Directory", @@ -3806,6 +3805,7 @@ "SAML_AuthnRequest_Template": "Шаблон AuthnRequest", "SAML_AuthnRequest_Template_Description": "Доступны следующие переменные: \n- **\\_\\_\\_newId\\_\\_**: Случайно сгенерированная строка идентификатора \n- **\\_\\_\\_\\_стоянная\\_\\_**: Текущая метка времени \n- **\\_\\_callbackUrl\\_\\_**: URL обратного вызова Rocket.Chat. \n- **\\_\\_entryPoint\\_\\_**: Значение параметра {{Custom Entry Point}}. \n- **\\_\\_\\_\\_issuer\\_\\_**: Значение параметра {{Custom Issuer}}. \n- **\\_\\_identifierFormatTag\\_\\_**: Содержимое шаблона {{NameID Policy Template}}, если настроен действительный {{Identifier Format}}. \n- **\\_\\_identifierFormat\\_\\_**: Значение параметра __Формат_идентификатора__. \n- **\\_\\_authnContextTag\\_\\_**: Содержимое шаблона __Автоконтекста__, если настроен действительный __Настроенный Автоконтекст__. \n- **\\_\\_authnContextComparison\\_\\_**: Значение параметра __Сравнение контекстов_. \n- **\\_\\_authnContext\\_\\_**: Значение параметра {{Custom Authn Context}}.", "SAML_Connection": "Подключение", + "SAML_Enterprise": "Организация", "SAML_General": "Общее", "SAML_Custom_Authn_Context": "Пользовательский контекст Authn", "SAML_Custom_Authn_Context_Comparison": "Сравнение контекста Authn", @@ -3917,6 +3917,7 @@ "See_documentation": "Открыть документацию", "See_full_profile": "Смотреть полный профиль", "See_on_Engagement_Dashboard": "Смотри на панели взаимодействия", + "Select": "Выбрать", "Select_a_department": "Выберите отдел", "Select_a_room": "Выберите чат", "Select_a_user": "Выберите пользователя", @@ -5092,6 +5093,7 @@ "RegisterWorkspace_Setup_Label": "Адрес электронной почты учетной записи в облаке", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Я принимаю <1>Положения и условия и <3>Политику конфиденциальности", "Theme_Appearence": "Внешний вид", + "Enterprise": "Корпорация", "UpgradeToGetMore_engagement-dashboard_Title": "Аналитика", "UpgradeToGetMore_auditing_Title": "Аудит сообщений" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json index 2f06da10fa21..b3062bd2787a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json @@ -2762,5 +2762,6 @@ "registration.component.form.invalidConfirmPass": "Potvrdenie hesla sa nezhoduje s heslom", "registration.component.form.confirmPassword": "Potvrďte svoje heslo", "registration.component.form.sendConfirmationEmail": "Pošlite potvrdzovací e-mail", + "Enterprise": "podnik", "UpgradeToGetMore_engagement-dashboard_Title": "Analytika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json index 4e5c27ba319b..d36f64dee4a8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json @@ -2742,5 +2742,6 @@ "registration.component.form.invalidConfirmPass": "Potrditev gesla se ne ujema z geslom", "registration.component.form.confirmPassword": "Potrdi geslo", "registration.component.form.sendConfirmationEmail": "Pošlji potrditveno e-poštno sporočilo", + "Enterprise": "Podjetje", "UpgradeToGetMore_engagement-dashboard_Title": "Analiza" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json index dfc68feb8873..8754bcdf3ea4 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json @@ -2753,5 +2753,6 @@ "registration.component.form.invalidConfirmPass": "Konfirmimi Fjalëkalimi nuk përputhet me fjalëkalimin", "registration.component.form.confirmPassword": "Konfirmoni fjalëkalimin tuaj", "registration.component.form.sendConfirmationEmail": "Dërgo email konfirmimi", + "Enterprise": "Ndërmarrje", "UpgradeToGetMore_engagement-dashboard_Title": "Analitikë" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json index 150749dde7b1..629b20286646 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json @@ -2563,5 +2563,6 @@ "registration.component.form.invalidConfirmPass": "Потврдна лозинка се не поклапа са лозинком", "registration.component.form.confirmPassword": "Потврдите лозинку", "registration.component.form.sendConfirmationEmail": "Пошаљи потврдну поруку", + "Enterprise": "Предузеће", "UpgradeToGetMore_engagement-dashboard_Title": "Аналитика" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json index a015f4a55ae6..5bc7afe40920 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json @@ -1,5 +1,6 @@ { "500": "Internt serverfel", + "__agents__agents_and__count__conversations__period__": "{{agents}} agenter och {{count}} konversationer, {{period}}", "__count__empty_rooms_will_be_removed_automatically": "{{count}} tomma rum tas bort automatiskt.", "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomma rum tas bort automatiskt:
{{rooms}}.", "__count__message_pruned": "{{count}} meddelande rensat", @@ -501,7 +502,7 @@ "Apps": "Appar", "Apps_context_explore": "Utforska", "Apps_context_installed": "Installerad", - "Apps_context_requested": "Begärt", + "Apps_context_requested": "Förfrågningar", "Apps_context_private": "Privata appar", "Apps_Count_Enabled": "{{count}} app aktiverad", "Apps_Count_Enabled_plural": "{{count}} appar aktiverade", @@ -1005,8 +1006,6 @@ "Cloud_register_offline_finish_helper": "När du har slutfört registreringen i molnkonsolen ska text visas för dig. Klistra in den här för att slutföra registreringen.", "Cloud_register_offline_helper": "Arbetsytor kan registreras manuellt om nätverket är airgap-skyddat eller om nätverksåtkomsten är begränsad. Kopiera texten nedan och gå till molnkonsolen för att slutföra processen.", "Cloud_register_success": "Arbetsytan har registrerats.", - "Cloud_registration_pending_html": "Pushmeddelanden kan inte användas förrän registreringen är slutförd. Mer information", - "Cloud_registration_pending_title": "Molnregistreringen är fortfarande inte slutförd", "Cloud_registration_required": "Registrering krävs", "Cloud_registration_required_description": "Du verkar inte ha valt att registrera din arbetsyta under konfigurationen.", "Cloud_registration_required_link_text": "Klicka här för att registrera arbetsytan.", @@ -1693,7 +1692,7 @@ "E2E_key_reset_email": "Meddelande om återställning av E2E-nyckel", "E2E_message_encrypted_placeholder": "Det här meddelandet är end-to-end-krypterat. Vill du visa det måste du ange din krypteringsnyckel i kontoinställningarna.", "E2E_password_request_text": "Ange krypteringslösenordet för att komma åt dina krypterade privata grupper och direktmeddelanden.
Du måste ange det här lösenordet för att koda/avkoda dina meddelanden på varje klient du använder eftersom nyckeln inte lagras i servern.", - "E2E_password_reveal_text": "Nu kan du skapa krypterade privata grupper och direktmeddelanden. Du kan också kryptera befintliga privata grupper och direktmeddelanden.

Det här görs med end-to-end-kryptering, så nyckeln för att koda/avkoda meddelanden sparas inte på servern. Därför behöver du spara lösenordet på en säker plats. Du måste ange det på andra enheter du vill använda end-to-end-kryptering på. Du hittar mer information här.

Ditt lösenord är: %s

Det här är ett automatiskt genererat lösenord. Du kan när som helst ställa in ett nytt lösenord för krypteringsnyckeln via en webbläsare i vilken du angett det befintliga lösenordet.
Lösenordet sparas bara i den här webbläsaren tills du har lagrat lösenordet och stänger det här meddelandet.", + "E2E_password_reveal_text": "Nu kan du skapa krypterade privata grupper och direktmeddelanden. Du kan också kryptera befintliga privata grupper och direktmeddelanden.

Det här görs med end-to-end-kryptering, så nyckeln för att koda/avkoda meddelanden sparas inte på servern. Därför behöver du spara lösenordet på en säker plats. Du måste ange det på andra enheter du vill använda end-to-end-kryptering på. Du hittar mer information här.

Ditt lösenord är: {{randomPassword}}

Det här är ett automatiskt genererat lösenord. Du kan när som helst ställa in ett nytt lösenord för krypteringsnyckeln via en webbläsare i vilken du angett det befintliga lösenordet.
Lösenordet sparas bara i den här webbläsaren tills du har lagrat lösenordet och stänger det här meddelandet.", "E2E_Reset_Email_Content": "Du har loggats ut. När du loggar in igen genererar Rocket.Chat en ny nyckel och återställer din åtkomst till de krypterade rum som har en eller flera medlemmar online. På grund av hur E2E-kryptering fungerar kan Rocket.Chat inte återställa åtkomsten till krypterade rum utan användare som är online.", "E2E_Reset_Key_Explanation": "Med det här alternativet tas din aktuella E2E-nyckel bort och du loggas ut.
När du loggar in igen genererar Rocket.Chat en ny nyckel och återställer din åtkomst till de krypterade rum som har en eller flera medlemmar online.
På grund av hur E2E-kryptering fungerar kan Rocket.Chat inte återställa åtkomsten till krypterade rum utan användare som är online.", "E2E_Reset_Other_Key_Warning": "Om du återställer den aktuella E2E-nyckeln loggas användaren ut. När användaren loggar in igen genererar Rocket.Chat en ny nyckel och återställer användarens åtkomst till krypterade rum som har en eller flera medlemmar online. På grund av hur E2E-kryptering fungerar kan Rocket.Chat inte återställa åtkomst till krypterade rum som inte har användare som är online.", @@ -2762,8 +2761,9 @@ "LDAP_DataSync_Advanced": "Avancerad synkronisering", "LDAP_DataSync_CustomFields": "Synkronisera anpassade fält", "LDAP_DataSync_Roles": "Synkronisera roller", - "LDAP_DataSync_Channels": "Synkronisera Channel", - "LDAP_DataSync_Teams": "Synkronisera team", + "LDAP_DataSync_Channels": "Synkronisera kanaler", + "LDAP_DataSync_Teams": "Synkronisera teams", + "LDAP_Enterprise": "Enterprise", "LDAP_DataSync_BackgroundSync": "Synkronisering i bakgrunden", "LDAP_Server_Type": "Servertyp", "LDAP_Server_Type_AD": "Active Directory", @@ -2895,6 +2895,8 @@ "Lead_capture_email_regex": "Lead capture email regex", "Lead_capture_phone_regex": "Lead capture phone regex", "Learn_more": "Mer information", + "Learn_more_about_conversations": "Läs mer om konversationer här", + "Learn_more_about_voice_channel": "Läs mer om röstsamtal här", "Least_recent_updated": "Uppdaterades senast", "Learn_how_to_unlock_the_myriad_possibilities_of_rocket_chat": "Ta reda på hur du kan utnyttja alla möjligheter med Rocket.Chat.", "Leave": "Lämna", @@ -3489,6 +3491,10 @@ "No_Canned_Responses_Yet-description": "Med standardsvar kan du ge snabba och konsekventa svar på vanliga frågor.", "No_channels_in_team": "Inga kanaler i teamet", "No_channels_yet": "Du är inte med i någon kanal ännu.", + "No_chats_yet": "Inga chattar hittades", + "No_chats_yet_description": "Alla chattar kommer dyka upp här", + "No_calls_yet": "Inga samtal hittades", + "No_calls_yet_description": "Alla samtal kommer dyka upp här", "No_data_found": "Inga data hittades", "No_direct_messages_yet": "Inga direktmeddelanden.", "No_Discussions_found": "Inga diskussioner hittades", @@ -4034,7 +4040,7 @@ "requests": "förfrågningar", "Requests": "Förfrågningar", "Search_Enterprise_Apps": "Sök efter Enterprise-applikationer", - "Requested": "Förfrågat", + "Requested": "Förfrågningar", "Requested_apps_will_appear_here": "Här visas appförfrågningar", "request-pdf-transcript": "Begär PDF-utskrift", "request-pdf-transcript_description": "Tillstånd att begära en PDF-utskrift för ett visst Omnichannel-rum", @@ -4197,6 +4203,7 @@ "SAML_AuthnRequest_Template": "Mallen AuthnRequest", "SAML_AuthnRequest_Template_Description": "Följande variabler är tillgängliga: \n- **\\_\\_newId\\_\\_**: Slumpmässigt genererad id-sträng \n- **\\_\\_instant\\_\\_**: Aktuell tidsstämpel \n- **\\_\\_callbackUrl\\_\\_**: Återanrops-URL:en för Rocket.Chat. \n- **\\_\\_entryPoint\\_\\_**: Värdet för inställningen {{Custom Entry Point}}. \n- **\\_\\_issuer\\_\\_**: Värdet för inställningen {{Custom Issuer}}. \n- **\\_\\_identifierFormatTag\\_\\_**: Innehållet i {{NameID Policy Template}} om ett giltigt {{Identifier Format}} har konfigurerats. \n- **\\_\\_identifierFormat\\_\\_**: Värdet för inställningen {{Identifier Format}}. \n- **\\_\\_authnContextTag\\_\\_**: Innehållet i {{AuthnContext Template}} om en giltig {{Custom Authn Context}} is har konfigurerats. \n- **\\_\\_authnContextComparison\\_\\_**: Värdet för inställningen {{Authn Context Comparison}}. \n- **\\_\\_authnContext\\_\\_**: Värdet för inställningen {{Custom Authn Context}}.", "SAML_Connection": "Anslutning", + "SAML_Enterprise": "Enterprise", "SAML_General": "Allmänt", "SAML_Custom_Authn_Context": "Anpassad autentiseringskontext", "SAML_Custom_Authn_Context_Comparison": "Jämförelse av autentiseringskontext", @@ -5547,7 +5554,7 @@ "registration.component.login.incorrectPassword": "Felaktigt lösenord", "registration.component.switchLanguage": "Växla till <1>{{name}}", "registration.component.resetPassword": "Återställ lösenord", - "registration.component.form.emailOrUsername": "E-postadress eller lösenord", + "registration.component.form.emailOrUsername": "E-postadress eller användarnamn", "registration.component.form.username": "Användarnamn", "registration.component.form.name": "Namn", "registration.component.form.nameOptional": "Namn (valfritt)", @@ -5644,7 +5651,7 @@ "Toolbox_room_actions": "Primära åtgärder i rum", "Theme_light": "Ljus", "Theme_dark": "Mörk", - "Enable_of_limit_apps_currently_enabled": "**{{enabled}} av {{limit}} {{context}} appar som för närvarande är aktiverade.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{kontext}} appar aktiverade. \n \n**{{appName}} är inaktiverad som standard.** Inaktivera en annan {{kontex}}-app eller uppgradera till Enterprise för att aktivera den här appen.", + "Enable_of_limit_apps_currently_enabled": "**{{enabled}} av {{limit}} {{context}} appar som för närvarande är aktiverade.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{context}} appar aktiverade. \n \n**{{appName}} är inaktiverad som standard.** Inaktivera en annan {{context}}-app eller uppgradera till Enterprise för att aktivera den här appen.", "Enable_of_limit_apps_currently_enabled_exceeded": "**{{enabled}} av {{limit}} {{context}} appar som för närvarande är aktiverade.** \n \nGränsen för apparna i gemenskapsutgåvan har överskridits. \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{context}} appar aktiverade. \n \n**{{appName}} är inaktiverad som standard.** Du måste inaktivera minst {{exceed}} andra {{context}}-appar eller uppgradera till Enterprise för att aktivera den här appen.", "Workspaces_on_Community_edition_install_app": "Arbetsytorna i Community Edition kan ha upp till {{limit}} {{context}} appar aktiverade. Uppgradera till Enterprise för att aktivera obegränsat antal appar.", "Apps_Currently_Enabled": "{{enabled}} av {{limit}} {{context}}-appar är för närvarande aktiverade.", @@ -5751,5 +5758,6 @@ "Uninstall_grandfathered_app": "Avinstallera {{appName}}?", "App_will_lose_grandfathered_status": "**Denna {{context}}-app kommer att förlora sin status som gammal app.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} __kontext__-appar aktiverade. Gamla appar inkluderas i gränsen, men gränsen tillämpas inte på dem.", "Theme_Appearence": "Utseende för tema", + "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json index 8db5552cb7ff..33ed4e6d83df 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json @@ -2757,5 +2757,6 @@ "registration.component.form.invalidConfirmPass": "கடவுச்சொல்லை உறுதிப்படுத்தும் கடவுச்சொல் பொருந்தவில்லை", "registration.component.form.confirmPassword": "உங்கள் கடவுச்சொல்லை உறுதிப்படுத்துக", "registration.component.form.sendConfirmationEmail": "உறுதிப்படுத்தும் மின்னஞ்சல் அனுப்பவும்", + "Enterprise": "நிறுவன", "UpgradeToGetMore_engagement-dashboard_Title": "அனலிட்டிக்ஸ்" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json index 86fa8967abc5..e97d28e2c30b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json @@ -2740,5 +2740,6 @@ "registration.component.form.invalidConfirmPass": "การยืนยันรหัสผ่านไม่ตรงกับรหัสผ่าน", "registration.component.form.confirmPassword": "ยืนยันรหัสผ่านของคุณ", "registration.component.form.sendConfirmationEmail": "ส่งอีเมลยืนยัน", + "Enterprise": "องค์กร", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json index fcb44774c0d4..3485f01cd190 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json @@ -1102,7 +1102,7 @@ "E2E_Encryption_Password_Change": "Şifreleme Parolasını Değiştir", "E2E_Encryption_Password_Explanation": "Artık şifrelenmiş özel gruplar ve doğrudan iletiler oluşturabilirsiniz. Mevcut özel grupları veya doğrudan iletileri de şifrelenmiş hale getirebilirsiniz.

Uçtan uca şifreleme ile, iletilerinizi şifreleme/şifresini çözme anahtarı sunucuda saklanmayacaktır. Bu nedenle şifrenizi güvenli bir yerde saklamanız gerekmektedir. Uçtan uca şifrelemeyi üzerinde kullanmak istediğiniz diğer aygıtta girmeniz gerekir.", "E2E_password_request_text": "Şifrelenmiş özel gruplarınıza ve doğrudan iletilerinize erişmek için, şifreleme parolanızını girin.
Anahtar, sunucuda saklanmadığı için kullandığnız her istemcide iletilerinizi şifreleme/şifre çözme için bu parolayı girmeniz gerekmektedir.", - "E2E_password_reveal_text": "Artık şifrelenmiş özel gruplar ve doğrudan iletiler oluşturabilirsiniz. Mevcut özel gruplar ve doğrudan iletileri de şifrelenmiş hale getirebilirsiniz.

Uçtan uca şifreleme ile, iletilerinizi şifreleme/şifresini çözme anahtarı sunucuda saklanmayacaktır. Bu nedenle şifrenizi güvenli bir yerde saklamanız gerekmektedir. Uçtan uca şifrelemeyi üzerinde kullanmak istediğiniz diğer aygıtta girmeniz gerekir.Daha fazlasını buradan öğrenin!

Şifreniz: %s

Bu otomatik oluşturulan şifredir; istediğiniz zaman mevcut şifrenizle oturum açtığınız bir tarayıcıdan şifreleme anahtarınızı yenisi ile değiştirebilirsiniz.
Bu şifre, siz saklayıncaya ve bu iletiyi reddedinceye kadar, yalnızca bu tarayıcıda saklanacaktır.", + "E2E_password_reveal_text": "Artık şifrelenmiş özel gruplar ve doğrudan iletiler oluşturabilirsiniz. Mevcut özel gruplar ve doğrudan iletileri de şifrelenmiş hale getirebilirsiniz.

Uçtan uca şifreleme ile, iletilerinizi şifreleme/şifresini çözme anahtarı sunucuda saklanmayacaktır. Bu nedenle şifrenizi güvenli bir yerde saklamanız gerekmektedir. Uçtan uca şifrelemeyi üzerinde kullanmak istediğiniz diğer aygıtta girmeniz gerekir.Daha fazlasını buradan öğrenin!

Şifreniz: {{randomPassword}}

Bu otomatik oluşturulan şifredir; istediğiniz zaman mevcut şifrenizle oturum açtığınız bir tarayıcıdan şifreleme anahtarınızı yenisi ile değiştirebilirsiniz.
Bu şifre, siz saklayıncaya ve bu iletiyi reddedinceye kadar, yalnızca bu tarayıcıda saklanacaktır.", "Edit": "Düzenle", "Edit_Custom_Field": "Düzenleme Özel Alan", "Edit_Department": "Düzenleme Bölümü", @@ -3264,5 +3264,6 @@ "onboarding.component.form.action.pasteHere": "Buraya yapıştırın...", "onboarding.form.registerOfflineForm.title": "Manuel Kayıt", "RegisterWorkspace_Features_Omnichannel_Title": "Çoklu Kanal", + "Enterprise": "Kuruluş", "UpgradeToGetMore_engagement-dashboard_Title": "Mantıksal Analiz" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json index 7e17116d33f5..bc31ae328e6a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json @@ -1194,7 +1194,7 @@ "E2E_Encryption_Password_Change": "Змінити пароль шифрування", "E2E_Encryption_Password_Explanation": "Тепер ви можете створювати зашифровані приватні групи та особистіі повідомлення. Також Ви можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини Вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e.", "E2E_password_request_text": "Щоб отримати доступ до своїх зашифрованих приватних груп та особистих повідомлень, введіть пароль шифрування.
Вам потрібно ввести цей пароль, щоб кодувати / декодувати Ваші повідомлення для кожного клієнта, який Ви використовуєте, оскільки ключ не зберігається на сервері.", - "E2E_password_reveal_text": "Тепер ви можете створювати зашифровані приватні групи та прямі повідомлення. Ви також можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e. Детальніше тут

Ваш пароль: %s

Це автоматичний згенерований пароль, Ви можете встановити новий пароль для шифрування введіть будь-який час у будь-якому веб-переглядачі, який ви ввели існуючий пароль.
Цей пароль зберігається в цьому веб-переглядачі, поки ви не збережете пароль і не відхилите це повідомлення.", + "E2E_password_reveal_text": "Тепер ви можете створювати зашифровані приватні групи та прямі повідомлення. Ви також можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e. Детальніше тут

Ваш пароль: {{randomPassword}}

Це автоматичний згенерований пароль, Ви можете встановити новий пароль для шифрування введіть будь-який час у будь-якому веб-переглядачі, який ви ввели існуючий пароль.
Цей пароль зберігається в цьому веб-переглядачі, поки ви не збережете пароль і не відхилите це повідомлення.", "E2E_Reset_Key_Explanation": "Ця опція видалить ваш поточний ключ E2E і вийде з системи.
Коли ви знову ввійдете в систему, Rocket.Chat згенерує для вас новий ключ і відновить ваш доступ до усіх зашифрованих кімнати, в яких є хоча б один учасник у стані онлайн.
Rocket.Chat не зможе відновити доступ до кімнат, в яких немає онлайн жодного учасника, бо цього не дозволяє природа шифрування E2E.", "Edit": "Редагувати", "Edit_Business_Hour": "Редагування час роботи", @@ -3349,6 +3349,7 @@ "registration.component.form.confirmPassword": "Підтвердити новий пароль", "registration.component.form.sendConfirmationEmail": "Надіслати електронною поштою підтвердження", "onboarding.form.registerOfflineForm.title": "Реєстрація вручну", + "Enterprise": "Підприємство", "UpgradeToGetMore_engagement-dashboard_Title": "Аналітика", "UpgradeToGetMore_auditing_Title": "Аудит повідомлень" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json index c7421b1525a1..88bcf754c10d 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json @@ -2851,5 +2851,6 @@ "registration.component.form.invalidConfirmPass": "Xác nhận mật khẩu không khớp với mật khẩu", "registration.component.form.confirmPassword": "Xác nhận mật khẩu của bạn", "registration.component.form.sendConfirmationEmail": "Gửi email xác nhận", + "Enterprise": "Doanh nghiệp", "UpgradeToGetMore_engagement-dashboard_Title": "phân tích" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json index b34e924da9ae..afeecab7fb7c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json @@ -2772,5 +2772,6 @@ "registration.component.form.invalidConfirmPass": "第二次密码输入与第一次不匹配", "registration.component.form.confirmPassword": "确认密码", "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件", + "Enterprise": "企业", "UpgradeToGetMore_engagement-dashboard_Title": "分析" } \ No newline at end of file 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 29321362031c..eeebb90c1d6d 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json @@ -864,8 +864,6 @@ "Cloud_register_offline_finish_helper": "在雲端控制介面完成註冊程序之後您應該會顯示一些文字。請貼到這裡來完成註冊。", "Cloud_register_offline_helper": "如果存在間隙或網路存取受到限制,則可以手動註冊工作區。複製下面的文字,然後轉到我們的雲端控制介面以完成該過程。", "Cloud_register_success": "您的工作區已成功註冊!", - "Cloud_registration_pending_html": "在註冊完成之前,手機通知將沒有作用。 了解更多 ", - "Cloud_registration_pending_title": "雲端註冊仍在等待中", "Cloud_registration_required": "必須註冊", "Cloud_registration_required_description": "看起來安裝過程中您沒有選擇您的工作區域。", "Cloud_registration_required_link_text": "點擊這裡來註冊您的工作區域。", @@ -1477,7 +1475,7 @@ "E2E_Encryption_Password_Explanation": "您可以建立加密私人群組和直接訊息。您可能也可以變更已經存在的私人群組或是直接訊息中來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。", "E2E_key_reset_email": "E2E 金鑰重設通知", "E2E_password_request_text": "存取您的加密私人群組和直接訊息,輸入您的加密密碼。
您需要輸入這個密碼來加密/解密您的訊息在每個您使用的客戶端,金鑰不會儲存在伺服器上。", - "E2E_password_reveal_text": "您現在可以建立加密私人群組和直接訊息。您可能也可以變更已存在的私人群組或直接訊息來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。 點擊這裡了解更多!

您的密碼是: %s

這是自動產生的密碼,在任何時間從任何瀏覽器您可以設定新的密碼給您的加密金鑰您可以輸入已存在的密碼。
這個密碼只能存在這個瀏覽器,直到您儲存密碼和關閉這個訊息。", + "E2E_password_reveal_text": "您現在可以建立加密私人群組和直接訊息。您可能也可以變更已存在的私人群組或直接訊息來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。 點擊這裡了解更多!

您的密碼是: {{randomPassword}}

這是自動產生的密碼,在任何時間從任何瀏覽器您可以設定新的密碼給您的加密金鑰您可以輸入已存在的密碼。
這個密碼只能存在這個瀏覽器,直到您儲存密碼和關閉這個訊息。", "E2E_Reset_Email_Content": "您已自動登出。當您再次登入時,Rocket.Chat將生成一個新的金鑰,並復原您對具有一個或多個成員在線上的任何加密房間的存取。由於E2E加密的性質,Rocket.Chat將無法復原對沒有在線成員的任何加密房間的存取。", "E2E_Reset_Key_Explanation": "此選項將刪除您目前的 E2E 金鑰並登出您。
當再次登入時,Rocket.Chat 將為您產生一個新的金鑰並復原您對具有一個或多個線上成員的任何加密房間的存取權限。
由於E2E加密的性質,Rocket.Chat 將無法復原對沒有線上成員的任何加密房間的存取。", "E2E_Reset_Other_Key_Warning": "重設目前的 E2E 金鑰將登出使用者。當使用者再次登入時,Rocket.Chat 將產生一個新的金鑰,並復原使用者對具有一個或多個線上成員的任何加密會議室的存取權限。由於 E2E 加密的特性,Rocket.Chat 將無法復原對離線成員的任何加密房間的存取。", @@ -2378,6 +2376,7 @@ "LDAP_DataSync_Roles": "同步身份", "LDAP_DataSync_Channels": "同步 Channel", "LDAP_DataSync_Teams": "同步團體", + "LDAP_Enterprise": "企業", "LDAP_DataSync_BackgroundSync": "背景同步", "LDAP_Server_Type": "伺服器類型", "LDAP_Server_Type_AD": "Active Directory", @@ -3613,6 +3612,7 @@ "Security": "安全", "See_full_profile": "查看完整檔案", "See_on_Engagement_Dashboard": "在參與儀表板上檢視", + "Select": "選取", "Select_a_department": "選擇一個部門", "Select_a_room": "選擇一個房間", "Select_a_user": "選擇一個使用者", @@ -4589,6 +4589,7 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "雲端帳戶電子郵件", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "我同意<1>條款及條件和<3>隱私權政策", + "Enterprise": "企業", "UpgradeToGetMore_engagement-dashboard_Title": "分析", "UpgradeToGetMore_auditing_Title": "訊息稽核" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json index 736df101ecdf..1a698984199d 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -764,8 +764,6 @@ "Cloud_register_offline_finish_helper": "在Cloud Console中完成注册过程后,应该显示出一些文本。请粘贴到此处以完成注册。", "Cloud_register_offline_helper": "如果网络访问受到限制,可以手动注册工作区。复制下面的文字并转到Cloud Console以完成本次操作。", "Cloud_register_success": "您的工作区已成功注册!", - "Cloud_registration_pending_html": "完成注册前移动端通知将不可用。了解更多", - "Cloud_registration_pending_title": "云注册尚未完成", "Cloud_registration_required": "要求注册", "Cloud_registration_required_description": "在安装过程中,您似乎没有选择注册工作区。", "Cloud_registration_required_link_text": "点此注册您的工作区。", @@ -1340,7 +1338,7 @@ "E2E_Encryption_Password_Explanation": "您现在可以创建加密的私有组和私聊。您也可以将现有的私人组或直接消息更改为加密。

这是端到端加密,因此编码/解码邮件的密钥不会保存在服务器上。因此,您需要将密码存储在安全的地方。您需要在希望使用端到端加密的其他设备上输入。", "E2E_key_reset_email": "端到端加密重置通知", "E2E_password_request_text": "要访问加密的私人组和私聊,请输入密码。
您需要在使用的每个客户端上输入此密码来对消息进行编码/解码,因为密钥未存储在服务器上。", - "E2E_password_reveal_text": "您现在可以创建加密的组和私聊。您也可以将现有的私有组和私聊转为加密的。

这是端到端加密,因此编码/解码邮件的密钥不会保存在服务器上。所以您需要将此密码存储在安全的地方。您需要在希望使用端到端加密的其他设备上输入它。 点击这里了解更多

您的密码是: %s

这是系统自动生成的密码,您可以为您的密钥设置一个新密码(您可以随时从任何浏览器输入现有密码)。
此浏览器仅存储此密码到您存储密码并关闭此消息前。", + "E2E_password_reveal_text": "您现在可以创建加密的组和私聊。您也可以将现有的私有组和私聊转为加密的。

这是端到端加密,因此编码/解码邮件的密钥不会保存在服务器上。所以您需要将此密码存储在安全的地方。您需要在希望使用端到端加密的其他设备上输入它。 点击这里了解更多

您的密码是: {{randomPassword}}

这是系统自动生成的密码,您可以为您的密钥设置一个新密码(您可以随时从任何浏览器输入现有密码)。
此浏览器仅存储此密码到您存储密码并关闭此消息前。", "E2E_Reset_Email_Content": "您将被自动登出。当您再次登录时,Rocket.Chat 将生成新的密钥并恢复您对任何有至少一个成员在线加密聊天室的访问权。由于端到端加密的原理,Rocket.Chat 将不能恢复您对无成员在线的聊天室访问权。", "E2E_Reset_Key_Explanation": "此选项将删除您当前的E2E密钥并注销您的账户。
再次登录时,Rocket.Chat将为您生成一个新密钥,并恢复您对具有一个以上成员的加密房间。
因E2E加密的性质,Rocket.Chat不能够恢复对没有在线成员加密房间的访问权。", "E2E_Reset_Other_Key_Warning": "重置当前的端到端加密密钥将使用户登出。当用户再次登录时,Rocket.Chat 将生成新的密钥并恢复用户对任何有至少一个成员在线加密聊天室的访问权。由于端到端加密的原理,Rocket.Chat 将不能恢复用户对无成员在线的聊天室访问权。", @@ -4136,6 +4134,7 @@ "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件", "onboarding.component.form.action.pasteHere": "在此粘贴", "onboarding.form.registerOfflineForm.title": "离线注册", + "Enterprise": "企业", "UpgradeToGetMore_engagement-dashboard_Title": "分析", "UpgradeToGetMore_auditing_Title": "消息审计" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-livechat/assets/demo.html b/apps/meteor/packages/rocketchat-livechat/assets/demo.html index b327c1505d6a..ee5fd6944d4f 100644 --- a/apps/meteor/packages/rocketchat-livechat/assets/demo.html +++ b/apps/meteor/packages/rocketchat-livechat/assets/demo.html @@ -33,9 +33,12 @@

without changing page title

page 7
diff --git a/apps/meteor/server/importPackages.ts b/apps/meteor/server/importPackages.ts index ec5d68dd6bd0..d92e02f35038 100644 --- a/apps/meteor/server/importPackages.ts +++ b/apps/meteor/server/importPackages.ts @@ -66,7 +66,6 @@ import '../app/slashcommands-status/server'; import '../app/slashcommands-topic/server'; import '../app/slashcommands-unarchiveroom/server'; import '../app/smarsh-connector/server'; -import '../app/spotify/server'; import '../app/theme/server'; import '../app/threads/server'; import '../app/tokenpass/server'; diff --git a/apps/meteor/server/lib/rooms/roomCoordinator.ts b/apps/meteor/server/lib/rooms/roomCoordinator.ts index d291f036542b..c640b8fec4b8 100644 --- a/apps/meteor/server/lib/rooms/roomCoordinator.ts +++ b/apps/meteor/server/lib/rooms/roomCoordinator.ts @@ -3,6 +3,7 @@ import { Users } from '@rocket.chat/models'; import { settings } from '../../../app/settings/server'; import type { IRoomTypeConfig, IRoomTypeServerDirectives, RoomSettingsEnum, RoomMemberActions } from '../../../definition/IRoomTypeConfig'; +import { getUserDisplayName } from '../../../lib/getUserDisplayName'; import { RoomCoordinator } from '../../../lib/rooms/coordinator'; class RoomCoordinatorServer extends RoomCoordinator { @@ -40,13 +41,14 @@ class RoomCoordinatorServer extends RoomCoordinator { sender: AtLeast, notificationMessage: string, userId: string, - ): Promise<{ title: string | undefined; text: string }> { + ): Promise<{ title: string | undefined; text: string; name: string | undefined }> { const title = `#${await this.roomName(room, userId)}`; - const name = settings.get('UI_Use_Real_Name') ? sender.name : sender.username; + const useRealName = settings.get('UI_Use_Real_Name'); + const senderName = getUserDisplayName(sender.name, sender.username, useRealName); - const text = `${name}: ${notificationMessage}`; + const text = `${senderName}: ${notificationMessage}`; - return { title, text }; + return { title, text, name: room.name }; }, getMsgSender(senderId: IUser['_id']): Promise { return Users.findOneById(senderId); diff --git a/apps/meteor/server/lib/rooms/roomTypes/direct.ts b/apps/meteor/server/lib/rooms/roomTypes/direct.ts index ad1913345b85..4f28d93040e1 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/direct.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/direct.ts @@ -94,16 +94,20 @@ roomCoordinator.add(DirectMessageRoomType, { async getNotificationDetails(room, sender, notificationMessage, userId) { const useRealName = settings.get('UI_Use_Real_Name'); + const displayRoomName = await this.roomName(room, userId); + if (this.isGroupChat(room)) { return { - title: await this.roomName(room, userId), + title: displayRoomName, text: `${(useRealName && sender.name) || sender.username}: ${notificationMessage}`, + name: room.name || displayRoomName, }; } return { title: (useRealName && sender.name) || sender.username, text: notificationMessage, + name: room.name || displayRoomName, }; }, diff --git a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts index 92d722ac2bb0..fb1415b02f82 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts @@ -35,7 +35,7 @@ roomCoordinator.add(LivechatRoomType, { const title = `[Omnichannel] ${roomName}`; const text = notificationMessage; - return { title, text }; + return { title, text, name: roomName }; }, async getMsgSender(senderId) { diff --git a/apps/meteor/server/lib/rooms/roomTypes/voip.ts b/apps/meteor/server/lib/rooms/roomTypes/voip.ts index f3a7fdb123bb..7925cd65e302 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/voip.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/voip.ts @@ -16,7 +16,7 @@ roomCoordinator.add(VoipRoomType, { const title = `[Omnichannel] ${this.roomName(room, userId)}`; const text = notificationMessage; - return { title, text }; + return { title, text, name: room.name }; }, async getMsgSender(senderId) { diff --git a/apps/meteor/server/models/raw/Analytics.ts b/apps/meteor/server/models/raw/Analytics.ts index 254ff32965bb..4e95cadebbcd 100644 --- a/apps/meteor/server/models/raw/Analytics.ts +++ b/apps/meteor/server/models/raw/Analytics.ts @@ -14,7 +14,7 @@ export class AnalyticsRaw extends BaseRaw implements IAnalyticsModel } protected modelIndexes(): IndexDescription[] { - return [{ key: { date: 1 } }, { key: { 'room._id': 1, 'date': 1 }, unique: true }]; + return [{ key: { date: 1 } }, { key: { 'room._id': 1, 'date': 1 }, unique: true, partialFilterExpression: { type: 'rooms' } }]; } saveMessageSent({ room, date }: { room: IRoom; date: IAnalytic['date'] }): Promise { diff --git a/apps/meteor/server/models/raw/LivechatBusinessHours.ts b/apps/meteor/server/models/raw/LivechatBusinessHours.ts index aaf2abeb4518..19b37f4ba02f 100644 --- a/apps/meteor/server/models/raw/LivechatBusinessHours.ts +++ b/apps/meteor/server/models/raw/LivechatBusinessHours.ts @@ -63,7 +63,7 @@ export class LivechatBusinessHoursRaw extends BaseRaw imp active: true, workHours: { $elemMatch: { - $or: [{ 'start.cron.dayOfWeek': day, 'finish.cron.dayOfWeek': day }], + $or: [{ 'start.cron.dayOfWeek': day }, { 'finish.cron.dayOfWeek': day }], open: true, }, }, diff --git a/apps/meteor/server/models/raw/LivechatInquiry.ts b/apps/meteor/server/models/raw/LivechatInquiry.ts index fd95a0ea8c4f..b9269915731c 100644 --- a/apps/meteor/server/models/raw/LivechatInquiry.ts +++ b/apps/meteor/server/models/raw/LivechatInquiry.ts @@ -172,6 +172,10 @@ export class LivechatInquiryRaw extends BaseRaw implemen } async unlock(inquiryId: string): Promise { + return this.updateOne({ _id: inquiryId }, { $unset: { locked: 1, lockedAt: 1 } }); + } + + async unlockAndQueue(inquiryId: string): Promise { return this.updateOne( { _id: inquiryId }, { $unset: { locked: 1, lockedAt: 1 }, $set: { status: LivechatInquiryStatus.QUEUED, queuedAt: new Date() } }, @@ -283,7 +287,7 @@ export class LivechatInquiryRaw extends BaseRaw implemen }, { $set: { status: LivechatInquiryStatus.TAKEN, takenAt: new Date() }, - $unset: { defaultAgent: 1, estimatedInactivityCloseTimeAt: 1 }, + $unset: { defaultAgent: 1, estimatedInactivityCloseTimeAt: 1, queuedAt: 1 }, }, ); } diff --git a/apps/meteor/server/models/raw/Messages.ts b/apps/meteor/server/models/raw/Messages.ts index 49930a8c92ea..93ef8982a604 100644 --- a/apps/meteor/server/models/raw/Messages.ts +++ b/apps/meteor/server/models/raw/Messages.ts @@ -27,6 +27,7 @@ import type { UpdateResult, Document, UpdateFilter, + ModifyResult, } from 'mongodb'; import { otrSystemMessages } from '../../../app/otr/lib/constants'; @@ -1593,19 +1594,23 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { * to race conditions: If multiple updates occur, the current state will be updated * only if the new state of the discussion room is really newer. */ - async refreshDiscussionMetadata(room: Pick): Promise { + async refreshDiscussionMetadata(room: Pick): Promise> { const { _id: drid, msgs: dcount, lm: dlm } = room; const query = { drid, }; - return this.updateMany(query, { - $set: { - dcount, - dlm, + return this.col.findOneAndUpdate( + query, + { + $set: { + dcount, + dlm, + }, }, - }); + { returnDocument: 'after' }, + ); } // ////////////////////////////////////////////////////////////////// diff --git a/apps/meteor/server/models/raw/OAuthAccessTokens.ts b/apps/meteor/server/models/raw/OAuthAccessTokens.ts index b8b3daac8772..6143a6379e2f 100644 --- a/apps/meteor/server/models/raw/OAuthAccessTokens.ts +++ b/apps/meteor/server/models/raw/OAuthAccessTokens.ts @@ -18,11 +18,17 @@ export class OAuthAccessTokensRaw extends BaseRaw implements ]; } - findOneByAccessToken(accessToken: string, options?: FindOptions): Promise { + async findOneByAccessToken(accessToken: string, options?: FindOptions): Promise { + if (!accessToken) { + return null; + } return this.findOne({ accessToken }, options); } - findOneByRefreshToken(refreshToken: string, options?: FindOptions): Promise { + async findOneByRefreshToken(refreshToken: string, options?: FindOptions): Promise { + if (!refreshToken) { + return null; + } return this.findOne({ refreshToken }, options); } } diff --git a/apps/meteor/server/modules/listeners/listeners.module.ts b/apps/meteor/server/modules/listeners/listeners.module.ts index c580b47d7c6e..aba351dbc958 100644 --- a/apps/meteor/server/modules/listeners/listeners.module.ts +++ b/apps/meteor/server/modules/listeners/listeners.module.ts @@ -1,7 +1,7 @@ import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { ISetting as AppsSetting } from '@rocket.chat/apps-engine/definition/settings'; import type { IServiceClass } from '@rocket.chat/core-services'; -import { EnterpriseSettings } from '@rocket.chat/core-services'; +import { EnterpriseSettings, listenToMessageSentEvent } from '@rocket.chat/core-services'; import { UserStatus, isSettingColor, isSettingEnterprise } from '@rocket.chat/core-typings'; import type { IUser, IRoom, VideoConference, ISetting, IOmnichannelRoom } from '@rocket.chat/core-typings'; import { Logger } from '@rocket.chat/logger'; @@ -99,9 +99,10 @@ export class ListenersModule { }); }); - service.onEvent('user.deleted', ({ _id: userId }) => { + service.onEvent('user.deleted', ({ _id: userId }, data) => { notifications.notifyLoggedInThisInstance('Users:Deleted', { userId, + ...data, }); }); @@ -166,7 +167,7 @@ export class ListenersModule { }); }); - service.onEvent('watch.messages', ({ message }) => { + listenToMessageSentEvent(service, async (message) => { if (!message.rid) { return; } diff --git a/apps/meteor/server/modules/watchers/lib/messages.ts b/apps/meteor/server/modules/watchers/lib/messages.ts new file mode 100644 index 000000000000..ded1c2389e17 --- /dev/null +++ b/apps/meteor/server/modules/watchers/lib/messages.ts @@ -0,0 +1,52 @@ +import type { IMessage, SettingValue, IUser } from '@rocket.chat/core-typings'; +import { Messages, Settings, Users } from '@rocket.chat/models'; +import mem from 'mem'; + +const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); + +const getUserNameCached = mem( + async (userId: string): Promise => { + const user = await Users.findOne>(userId, { projection: { name: 1 } }); + return user?.name; + }, + { maxAge: 10000 }, +); + +export const broadcastMessageSentEvent = async ({ + id, + data, + broadcastCallback, +}: { + id: IMessage['_id']; + broadcastCallback: (message: IMessage) => Promise; + data?: IMessage; +}): Promise => { + const message = data ?? (await Messages.findOneById(id)); + if (!message) { + return; + } + + if (message._hidden !== true && message.imported == null) { + const UseRealName = (await getSettingCached('UI_Use_Real_Name')) === true; + + if (UseRealName) { + if (message.u?._id) { + const name = await getUserNameCached(message.u._id); + if (name) { + message.u.name = name; + } + } + + if (message.mentions?.length) { + for await (const mention of message.mentions) { + const name = await getUserNameCached(mention._id); + if (name) { + mention.name = name; + } + } + } + } + + void broadcastCallback(message); + } +}; diff --git a/apps/meteor/server/modules/watchers/watchers.module.ts b/apps/meteor/server/modules/watchers/watchers.module.ts index 1d8402786a2f..88e465edc018 100644 --- a/apps/meteor/server/modules/watchers/watchers.module.ts +++ b/apps/meteor/server/modules/watchers/watchers.module.ts @@ -1,4 +1,5 @@ import type { EventSignatures } from '@rocket.chat/core-services'; +import { dbWatchersDisabled } from '@rocket.chat/core-services'; import type { ISubscription, IUser, @@ -13,7 +14,6 @@ import type { IIntegration, IEmailInbox, IPbxEvent, - SettingValue, ILivechatInquiryRecord, IRole, ILivechatPriority, @@ -36,10 +36,10 @@ import { Permissions, LivechatPriority, } from '@rocket.chat/models'; -import mem from 'mem'; import { subscriptionFields, roomFields } from '../../../lib/publishFields'; import type { DatabaseWatcher } from '../../database/DatabaseWatcher'; +import { broadcastMessageSentEvent } from './lib/messages'; type BroadcastCallback = (event: T, ...args: Parameters) => Promise; @@ -64,52 +64,26 @@ export function isWatcherRunning(): boolean { return watcherStarted; } -export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallback): void { - const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); - - const getUserNameCached = mem( - async (userId: string): Promise => { - const user = await Users.findOne>(userId, { projection: { name: 1 } }); - return user?.name; - }, - { maxAge: 10000 }, - ); - +const messageWatcher = (watcher: DatabaseWatcher, broadcast: BroadcastCallback): void => { watcher.on(Messages.getCollectionName(), async ({ clientAction, id, data }) => { switch (clientAction) { case 'inserted': case 'updated': - const message = data ?? (await Messages.findOneById(id)); - if (!message) { - return; - } - - if (message._hidden !== true && message.imported == null) { - const UseRealName = (await getSettingCached('UI_Use_Real_Name')) === true; - - if (UseRealName) { - if (message.u?._id) { - const name = await getUserNameCached(message.u._id); - if (name) { - message.u.name = name; - } - } - - if (message.mentions?.length) { - for await (const mention of message.mentions) { - const name = await getUserNameCached(mention._id); - if (name) { - mention.name = name; - } - } - } - } - - void broadcast('watch.messages', { clientAction, message }); - } + void broadcastMessageSentEvent({ + id, + data, + broadcastCallback: (message) => broadcast('watch.messages', { clientAction, message }), + }); break; } }); +}; + +export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallback): void { + const dbWatchersEnabled = !dbWatchersDisabled; + if (dbWatchersEnabled) { + messageWatcher(watcher, broadcast); + } watcher.on(Subscriptions.getCollectionName(), async ({ clientAction, id, data, diff }) => { switch (clientAction) { diff --git a/apps/meteor/server/routes/i18n.ts b/apps/meteor/server/routes/i18n.ts index 8aa1c30a3085..1bdba1f09cc8 100644 --- a/apps/meteor/server/routes/i18n.ts +++ b/apps/meteor/server/routes/i18n.ts @@ -7,7 +7,8 @@ import { match } from 'path-to-regexp'; const matchRoute = match<{ lng: string }>('/:lng.json', { decode: decodeURIComponent }); const i18nHandler = async function (req: IncomingMessage, res: ServerResponse) { - const match = matchRoute(req.url ?? '/'); + const url = new URL(req.url ?? '/', `https://${req.headers.host}`); + const match = matchRoute(url.pathname); if (match === false) { res.writeHead(400); diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveBadWords.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveBadWords.ts new file mode 100644 index 000000000000..92e0a57ac7f1 --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveBadWords.ts @@ -0,0 +1,49 @@ +import { type IMessage } from '@rocket.chat/core-typings'; +import type BadWordsFilter from 'bad-words'; + +export class BeforeSaveBadWords { + badWords: BadWordsFilter | null = null; + + async configure(badWordsList?: string, goodWordsList?: string) { + const { default: Filter } = await import('bad-words'); + + const options = { + list: + badWordsList + ?.split(',') + .map((word) => word.trim()) + .filter(Boolean) || [], + // library definition does not allow optional definition + exclude: undefined, + splitRegex: undefined, + placeHolder: undefined, + regex: undefined, + replaceRegex: undefined, + emptyList: undefined, + }; + + this.badWords = new Filter(options); + + if (goodWordsList?.length) { + this.badWords.removeWords(...goodWordsList.split(',').map((word) => word.trim())); + } + } + + disable() { + this.badWords = null; + } + + async filterBadWords({ message }: { message: IMessage }): Promise { + if (!message.msg || !this.badWords) { + return message; + } + + try { + message.msg = this.badWords.clean(message.msg); + } catch (error) { + // ignore + } + + return message; + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSavePreventMention.ts b/apps/meteor/server/services/messages/hooks/BeforeSavePreventMention.ts new file mode 100644 index 000000000000..b87c0e613d2d --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSavePreventMention.ts @@ -0,0 +1,47 @@ +import { Authorization, MeteorError, type IApiService } from '@rocket.chat/core-services'; +import { type IMessage, type IUser } from '@rocket.chat/core-typings'; + +import { i18n } from '../../../lib/i18n'; + +export class BeforeSavePreventMention { + constructor(private api?: IApiService) {} + + async preventMention({ + message, + user, + mention, + permission, + }: { + message: IMessage; + user: Pick; + mention: 'here' | 'all'; + permission: string; + }): Promise { + if (!message.mentions?.some(({ _id }) => _id === mention)) { + return true; + } + + // Check if the user has permissions to use @all in both global and room scopes. + if (await Authorization.hasPermission(message.u._id, permission)) { + return true; + } + + if (await Authorization.hasPermission(message.u._id, permission, message.rid)) { + return true; + } + + const action = i18n.t('Notify_all_in_this_room', { lng: user.language }); + + // Add a notification to the chat, informing the user that this + // action is not allowed. + void this.api?.broadcast('notify.ephemeralMessage', message.u._id, message.rid, { + // TODO: i18n + msg: i18n.t('error-action-not-allowed', { action } as any, user.language), + }); + + // Also throw to stop propagation of 'sendMessage'. + throw new MeteorError('error-action-not-allowed', `Notify ${mention} in this room not allowed`, { + action: 'Notify_all_in_this_room', + }); + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveSpotify.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveSpotify.ts new file mode 100644 index 000000000000..8d0ceca98437 --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveSpotify.ts @@ -0,0 +1,38 @@ +import type { IMessage } from '@rocket.chat/core-typings'; + +// look for spotify syntax (e.g.: spotify:track:1q6IK1l4qpYykOaWaLJkWG) on the message and add them to the urls array +export class BeforeSaveSpotify { + async convertSpotifyLinks({ message }: { message: IMessage }): Promise { + if (!message.msg?.trim()) { + return message; + } + + const urls = Array.isArray(message.urls) ? message.urls : []; + + let changed = false; + + const msgParts = message.msg.split(/(```\w*[\n ]?[\s\S]*?```+?)|(`(?:[^`]+)`)/); + for (let index = 0; index < msgParts.length; index++) { + const part = msgParts[index]; + + if (!/(?:```(\w*)[\n ]?([\s\S]*?)```+?)|(?:`(?:[^`]+)`)/.test(part)) { + const re = /(?:^|\s)spotify:([^:\s]+):([^:\s]+)(?::([^:\s]+))?(?::(\S+))?(?:\s|$)/g; + + let match; + while ((match = re.exec(part)) != null) { + const data = match.slice(1).filter(Boolean); + const path = data.map((value) => encodeURI(value)).join('/'); + const url = `https://open.spotify.com/${path}`; + urls.push({ url, source: `spotify:${data.join(':')}`, meta: {} }); + changed = true; + } + } + } + + if (changed) { + message.urls = urls; + } + + return message; + } +} diff --git a/apps/meteor/server/services/messages/hooks/badwords.ts b/apps/meteor/server/services/messages/hooks/badwords.ts deleted file mode 100644 index 17641d8f9c7f..000000000000 --- a/apps/meteor/server/services/messages/hooks/badwords.ts +++ /dev/null @@ -1,26 +0,0 @@ -export async function configureBadWords(badWordsList?: string, goodWordsList?: string) { - const { default: Filter } = await import('bad-words'); - - const options = { - list: - badWordsList - ?.split(',') - .map((word) => word.trim()) - .filter(Boolean) || [], - // library definition does not allow optional definition - exclude: undefined, - splitRegex: undefined, - placeHolder: undefined, - regex: undefined, - replaceRegex: undefined, - emptyList: undefined, - }; - - const badWords = new Filter(options); - - if (goodWordsList?.length) { - badWords.removeWords(...goodWordsList.split(',').map((word) => word.trim())); - } - - return badWords; -} diff --git a/apps/meteor/server/services/messages/service.ts b/apps/meteor/server/services/messages/service.ts index f981422727f7..b59670df4edc 100644 --- a/apps/meteor/server/services/messages/service.ts +++ b/apps/meteor/server/services/messages/service.ts @@ -1,8 +1,7 @@ import type { IMessageService } from '@rocket.chat/core-services'; import { ServiceClassInternal } from '@rocket.chat/core-services'; -import type { IMessage, MessageTypesValues, IUser, IRoom } from '@rocket.chat/core-typings'; +import { type IMessage, type MessageTypesValues, type IUser, type IRoom, isEditedMessage } from '@rocket.chat/core-typings'; import { Messages } from '@rocket.chat/models'; -import type BadWordsFilter from 'bad-words'; import { deleteMessage } from '../../../app/lib/server/functions/deleteMessage'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; @@ -10,14 +9,25 @@ import { updateMessage } from '../../../app/lib/server/functions/updateMessage'; import { executeSendMessage } from '../../../app/lib/server/methods/sendMessage'; import { executeSetReaction } from '../../../app/reactions/server/setReaction'; import { settings } from '../../../app/settings/server'; -import { configureBadWords } from './hooks/badwords'; +import { broadcastMessageSentEvent } from '../../modules/watchers/lib/messages'; +import { BeforeSaveBadWords } from './hooks/BeforeSaveBadWords'; +import { BeforeSavePreventMention } from './hooks/BeforeSavePreventMention'; +import { BeforeSaveSpotify } from './hooks/BeforeSaveSpotify'; export class MessageService extends ServiceClassInternal implements IMessageService { protected name = 'message'; - private badWordsFilter?: BadWordsFilter; + private preventMention: BeforeSavePreventMention; + + private badWords: BeforeSaveBadWords; + + private spotify: BeforeSaveSpotify; async created() { + this.preventMention = new BeforeSavePreventMention(this.api); + this.badWords = new BeforeSaveBadWords(); + this.spotify = new BeforeSaveSpotify(); + await this.configureBadWords(); } @@ -26,10 +36,10 @@ export class MessageService extends ServiceClassInternal implements IMessageServ ['Message_AllowBadWordsFilter', 'Message_BadWordsFilterList', 'Message_BadWordsWhitelist'], async ([enabled, badWordsList, whiteList]) => { if (!enabled) { - this.badWordsFilter = undefined; + this.badWords.disable(); return; } - this.badWordsFilter = await configureBadWords(badWordsList as string, whiteList as string); + await this.badWords.configure(badWordsList as string, whiteList as string); }, ); } @@ -73,46 +83,40 @@ export class MessageService extends ServiceClassInternal implements IMessageServ settings.get('Message_Read_Receipt_Enabled'), extraData, ); - + void broadcastMessageSentEvent({ + id: result.insertedId, + broadcastCallback: async (message) => this.api?.broadcast('message.sent', message), + }); return result.insertedId; } async beforeSave({ message, room: _room, - user: _user, + user, }: { message: IMessage; room: IRoom; - user: Pick; + user: Pick; }): Promise { // TODO looks like this one was not being used (so I'll left it commented) // await this.joinDiscussionOnMessage({ message, room, user }); - // conditionals here should be fast, so they won't add up for each message - if (this.isBadWordsFilterEnabled()) { - message = await this.filterBadWords(message); + message = await this.badWords.filterBadWords({ message }); + message = await this.spotify.convertSpotifyLinks({ message }); + + if (!this.isEditedOrOld(message)) { + await Promise.all([ + this.preventMention.preventMention({ message, user, mention: 'all', permission: 'mention-all' }), + this.preventMention.preventMention({ message, user, mention: 'here', permission: 'mention-here' }), + ]); } return message; } - private isBadWordsFilterEnabled() { - return !!settings.get('Message_AllowBadWordsFilter'); - } - - private async filterBadWords(message: IMessage): Promise { - if (!message.msg || !this.badWordsFilter) { - return message; - } - - try { - message.msg = this.badWordsFilter.clean(message.msg); - } catch (error) { - // ignore - } - - return message; + private isEditedOrOld(message: IMessage): boolean { + return isEditedMessage(message) || !message.ts || Math.abs(Date.now() - message.ts.getTime()) > 60000; } // joinDiscussionOnMessage diff --git a/apps/meteor/server/services/meteor/service.ts b/apps/meteor/server/services/meteor/service.ts index 2420a70d7ada..fc58e4b0418f 100644 --- a/apps/meteor/server/services/meteor/service.ts +++ b/apps/meteor/server/services/meteor/service.ts @@ -1,13 +1,13 @@ -import { api, ServiceClassInternal } from '@rocket.chat/core-services'; +import { api, ServiceClassInternal, listenToMessageSentEvent } from '@rocket.chat/core-services'; import type { AutoUpdateRecord, IMeteor } from '@rocket.chat/core-services'; -import type { ILivechatAgent } from '@rocket.chat/core-typings'; +import type { ILivechatAgent, UserStatus } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { MongoInternals } from 'meteor/mongo'; import { ServiceConfiguration } from 'meteor/service-configuration'; import { triggerHandler } from '../../../app/integrations/server/lib/triggerHandler'; -import { Livechat } from '../../../app/livechat/server'; +import { Livechat } from '../../../app/livechat/server/lib/LivechatTyped'; import { onlineAgents, monitorAgents } from '../../../app/livechat/server/lib/stream/agentStatus'; import { metrics } from '../../../app/metrics/server'; import notifications from '../../../app/notifications/server/lib/Notifications'; @@ -221,7 +221,7 @@ export class MeteorService extends ServiceClassInternal implements IMeteor { }); if (!disableMsgRoundtripTracking) { - this.onEvent('watch.messages', ({ message }) => { + listenToMessageSentEvent(this, async (message) => { if (message?._updatedAt) { metrics.messageRoundtripTime.set(Date.now() - message._updatedAt.getDate()); } @@ -275,7 +275,7 @@ export class MeteorService extends ServiceClassInternal implements IMeteor { }; } - async notifyGuestStatusChanged(token: string, status: string): Promise { + async notifyGuestStatusChanged(token: string, status: UserStatus): Promise { return Livechat.notifyGuestStatusChanged(token, status); } diff --git a/apps/meteor/server/services/nps/notification.ts b/apps/meteor/server/services/nps/notification.ts index 692b9bc6291f..50cfa52331e7 100644 --- a/apps/meteor/server/services/nps/notification.ts +++ b/apps/meteor/server/services/nps/notification.ts @@ -1,5 +1,6 @@ import type { IBanner } from '@rocket.chat/core-typings'; import { BannerPlatform } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; import moment from 'moment'; import { settings } from '../../../app/settings/server'; @@ -21,7 +22,7 @@ export const getBannerForAdmins = (expireAt: Date): Omit => { }, _updatedAt: new Date(), view: { - viewId: '', + viewId: Random.id(), appId: '', blocks: [ { diff --git a/apps/meteor/server/services/omnichannel/queue.ts b/apps/meteor/server/services/omnichannel/queue.ts index 8bb2e86f2313..9617704b8950 100644 --- a/apps/meteor/server/services/omnichannel/queue.ts +++ b/apps/meteor/server/services/omnichannel/queue.ts @@ -64,6 +64,12 @@ export class OmnichannelQueue implements IOmnichannelQueue { return; } + if (await License.shouldPreventAction('monthlyActiveContacts', 1)) { + queueLogger.debug('MAC limit reached. Queue wont execute'); + this.running = false; + return; + } + const queue = await this.nextQueue(); const queueDelayTimeout = this.delay(); queueLogger.info(`Executing queue ${queue || 'Public'} with timeout of ${queueDelayTimeout}`); @@ -86,8 +92,10 @@ export class OmnichannelQueue implements IOmnichannelQueue { // Note: this removes the "one-shot" behavior of queue, allowing it to take a conversation again in the future // And sorting them by _updatedAt: -1 will make it so that the oldest inquiries are taken first // preventing us from playing with the same inquiry over and over again - await LivechatInquiry.unlock(nextInquiry._id); + return await LivechatInquiry.unlockAndQueue(nextInquiry._id); } + + await LivechatInquiry.unlock(nextInquiry._id); } catch (e) { queueLogger.error({ msg: 'Error processing queue', @@ -105,10 +113,6 @@ export class OmnichannelQueue implements IOmnichannelQueue { return; } - if (await License.shouldPreventAction('monthlyActiveContacts')) { - return; - } - const routingSupportsAutoAssign = RoutingManager.getConfig()?.autoAssignAgent; queueLogger.debug({ msg: 'Routing method supports auto assignment', diff --git a/apps/meteor/server/services/omnichannel/service.ts b/apps/meteor/server/services/omnichannel/service.ts index d89f840a41bb..34599cbc7a33 100644 --- a/apps/meteor/server/services/omnichannel/service.ts +++ b/apps/meteor/server/services/omnichannel/service.ts @@ -44,6 +44,12 @@ export class OmnichannelService extends ServiceClassInternal implements IOmnicha License.onValidateLicense(async (): Promise => { RoutingManager.isMethodSet() && (await this.queueWorker.shouldStart()); }); + + // NOTE: When there's no license or license is invalid, we fallback to CE behavior + // CE behavior means there's no MAC limit, so we start the queue + License.onInvalidateLicense(async (): Promise => { + this.queueWorker.isRunning() && (await this.queueWorker.shouldStart()); + }); } getQueueWorker(): IOmnichannelQueue { diff --git a/apps/meteor/server/services/push/service.ts b/apps/meteor/server/services/push/service.ts index 437db7b391d8..2d2c1c61ea38 100644 --- a/apps/meteor/server/services/push/service.ts +++ b/apps/meteor/server/services/push/service.ts @@ -9,7 +9,8 @@ export class PushService extends ServiceClassInternal implements IPushService { super(); this.onEvent('watch.users', async (data) => { - if (!('diff' in data) || !('services.resume.loginTokens' in data.diff)) { + // for some reason data.diff can be set to undefined + if (!('diff' in data) || !data.diff || !('services.resume.loginTokens' in data.diff)) { return; } if (data.diff['services.resume.loginTokens'] === undefined) { diff --git a/apps/meteor/server/settings/message.ts b/apps/meteor/server/settings/message.ts index 17dd1f7b230d..e83189579085 100644 --- a/apps/meteor/server/settings/message.ts +++ b/apps/meteor/server/settings/message.ts @@ -337,23 +337,23 @@ export const createMessageSettings = () => public: true, }); - await this.section('Katex', async () => { + await this.section('Katex', async function () { const enableQuery = { _id: 'Katex_Enabled', value: true, }; - await settingsRegistry.add('Katex_Enabled', true, { + await this.add('Katex_Enabled', true, { type: 'boolean', public: true, i18nDescription: 'Katex_Enabled_Description', }); - await settingsRegistry.add('Katex_Parenthesis_Syntax', true, { + await this.add('Katex_Parenthesis_Syntax', true, { type: 'boolean', public: true, enableQuery, i18nDescription: 'Katex_Parenthesis_Syntax_Description', }); - await settingsRegistry.add('Katex_Dollar_Syntax', false, { + await this.add('Katex_Dollar_Syntax', false, { type: 'boolean', public: true, enableQuery, @@ -361,14 +361,14 @@ export const createMessageSettings = () => }); }); - await this.section('Google Maps', async () => { - await settingsRegistry.add('MapView_Enabled', false, { + await this.section('Google Maps', async function () { + await this.add('MapView_Enabled', false, { type: 'boolean', public: true, i18nLabel: 'MapView_Enabled', i18nDescription: 'MapView_Enabled_Description', }); - await settingsRegistry.add('MapView_GMapsAPIKey', '', { + await this.add('MapView_GMapsAPIKey', '', { type: 'string', public: true, i18nLabel: 'MapView_GMapsAPIKey', diff --git a/apps/meteor/server/settings/misc.ts b/apps/meteor/server/settings/misc.ts index fa7b6bbde3d0..e04c4d6d3b8e 100644 --- a/apps/meteor/server/settings/misc.ts +++ b/apps/meteor/server/settings/misc.ts @@ -46,10 +46,6 @@ const verifyFingerPrint = async function () { await updateFingerprint(fingerprint, false); }; -settings.watch('Site_Url', () => { - void verifyFingerPrint(); -}); - // Insert server unique id if it doesn't exist export const createMiscSettings = async () => { await settingsRegistry.add('uniqueID', process.env.DEPLOYMENT_ID || uuidv4(), { @@ -61,12 +57,16 @@ export const createMiscSettings = async () => { readonly: true, }); - await settingsRegistry.add('Deployment_FingerPrint_Verified', false, { + await settingsRegistry.add('Deployment_FingerPrint_Verified', true, { type: 'boolean', public: true, readonly: true, }); + settings.watch('Site_Url', () => { + void verifyFingerPrint(); + }); + await settingsRegistry.add('Initial_Channel_Created', false, { type: 'boolean', hidden: true, diff --git a/apps/meteor/server/startup/migrations/index.ts b/apps/meteor/server/startup/migrations/index.ts index 26bc4f992ee2..8247f9a72bb5 100644 --- a/apps/meteor/server/startup/migrations/index.ts +++ b/apps/meteor/server/startup/migrations/index.ts @@ -36,4 +36,5 @@ import './v299'; import './v300'; import './v301'; import './v303'; +import './v304'; import './xrun'; diff --git a/apps/meteor/server/startup/migrations/v304.ts b/apps/meteor/server/startup/migrations/v304.ts new file mode 100644 index 000000000000..e5d6484446f0 --- /dev/null +++ b/apps/meteor/server/startup/migrations/v304.ts @@ -0,0 +1,11 @@ +import { Analytics } from '@rocket.chat/models'; + +import { addMigration } from '../../lib/migrations'; + +addMigration({ + version: 304, + name: 'Drop wrong index from analytics collection', + async up() { + await Analytics.col.dropIndex('room._id_1_date_1'); + }, +}); diff --git a/apps/meteor/tests/e2e/message-actions.spec.ts b/apps/meteor/tests/e2e/message-actions.spec.ts index 7cfa089326b2..ad48c09beeba 100644 --- a/apps/meteor/tests/e2e/message-actions.spec.ts +++ b/apps/meteor/tests/e2e/message-actions.spec.ts @@ -1,8 +1,7 @@ -import type { Page } from '@playwright/test'; - import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; import { createTargetChannel } from './utils'; +import { setUserPreferences } from './utils/setUserPreferences'; import { expect, test } from './utils/test'; test.use({ storageState: Users.admin.state }); @@ -69,6 +68,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.content.sendMessage('Message to star'); await poHomeChannel.content.openLastMessageMenu(); await page.locator('[data-qa-id="star-message"]').click(); + await poHomeChannel.dismissToast(); await page.getByRole('button').and(page.getByTitle('Options')).click(); await page.locator('[data-key="starred-messages"]').click(); await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('Message to star'); @@ -87,22 +87,11 @@ test.describe.serial('message-actions', () => { }); test.describe('Preference Hide Contextual Bar by clicking outside of it Enabled', () => { - let adminPage: Page; - test.beforeAll(async ({ browser }) => { - adminPage = await browser.newPage({ storageState: Users.admin.state }); - await adminPage.goto('/account/preferences'); - await adminPage.locator('role=heading[name="Messages"]').click(); - await adminPage.locator('text="Hide Contextual Bar by clicking outside of it"').click(); - }); - test.afterAll(async () => { - await adminPage.close(); + test.beforeAll(async ({ api }) => { + await setUserPreferences(api, { hideFlexTab: true }); }); - test.afterAll(async ({ browser }) => { - adminPage = await browser.newPage({ storageState: Users.admin.state }); - await adminPage.goto('/account/preferences'); - await adminPage.locator('role=heading[name="Messages"]').click(); - await adminPage.locator('text="Hide Contextual Bar by clicking outside of it"').click(); - await adminPage.close(); + test.afterAll(async ({ api }) => { + await setUserPreferences(api, { hideFlexTab: false }); }); test.beforeEach(async ({ page }) => { poHomeChannel = new HomeChannel(page); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-widget.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-widget.spec.ts new file mode 100644 index 000000000000..812a2496c740 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-widget.spec.ts @@ -0,0 +1,31 @@ +import type { Page } from '@playwright/test'; + +import { test, expect } from '../utils/test'; + +test.describe('Omnichannel - Livechat Widget Embedded', () => { + test.describe('Widget is working on Embedded View', () => { + let page: Page; + let siteName: string; + + test.beforeAll(async ({ browser, api }) => { + page = await browser.newPage(); + await expect((await api.post('/settings/Enable_CSP', { value: false })).status()).toBe(200); + const { value } = await(await api.get('/settings/Site_Name')).json(); + siteName = value; + + + await page.goto('/packages/rocketchat_livechat/assets/demo.html'); + }); + + test.afterAll(async ({ api }) => { + await expect((await api.post('/settings/Enable_CSP', { value: true })).status()).toBe(200); + await page.close(); + }); + + test('Open and Close widget', async () => { + await test.step('Expect widget to be visible while embedded in an iframe', async () => { + await expect(page.frameLocator('#rocketchat-iframe').locator(`role=button[name="${siteName}"]`)).toBeVisible(); + }); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts index 85c0f518d362..c7b1ff4a86c0 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts @@ -14,7 +14,14 @@ test.describe.serial('omnichannel-manager', () => { await poOmnichannelManagers.sidenav.linkManagers.click(); }); - test('Managers', async ({ page }) => { + test('OC - Manage Managers - Add, Search and Remove', async ({ page }) => { + await test.step('expect "user1" be first ', async () => { + await poOmnichannelManagers.inputUsername.type('user'); + await expect(page.locator('role=option[name="user1"]')).toContainText('user1'); + + await poOmnichannelManagers.inputUsername.type(''); + }); + await test.step('expect add "user1" as manager', async () => { await poOmnichannelManagers.inputUsername.type('user1'); await page.locator('role=option[name="user1"]').click(); @@ -22,7 +29,19 @@ test.describe.serial('omnichannel-manager', () => { await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeVisible(); }); + + await test.step('expect search for manager', async () => { + await poOmnichannelManagers.search('user1'); + await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeVisible(); + + await poOmnichannelManagers.search('NonExistingUser'); + await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeHidden(); + + await poOmnichannelManagers.clearSearch(); + }); + await test.step('expect remove "user1" as manager', async () => { + await poOmnichannelManagers.search('user1'); await poOmnichannelManagers.btnDeleteSelectedAgent('user1').click(); await poOmnichannelManagers.btnModalRemove.click(); diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts index 7eecca8de892..c2551e6e87df 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts @@ -12,6 +12,20 @@ export class OmnichannelManager { this.sidenav = new OmnichannelSidenav(page); } + get inputSearch() { + return this.page.locator('[placeholder="Search"]'); + } + + async search(text: string) { + await this.inputSearch.fill(text); + await this.page.waitForTimeout(500); + } + + async clearSearch() { + await this.inputSearch.fill(''); + await this.page.waitForTimeout(500); + } + get inputUsername(): Locator { return this.page.locator('input').first(); } diff --git a/apps/meteor/tests/e2e/utils/setUserPreferences.ts b/apps/meteor/tests/e2e/utils/setUserPreferences.ts new file mode 100644 index 000000000000..7be26ce4a894 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/setUserPreferences.ts @@ -0,0 +1,7 @@ +import type { APIResponse } from '@playwright/test'; +import { UsersSetPreferencesParamsPOST } from '@rocket.chat/rest-typings'; + +import type { BaseTest } from './test'; + +export const setUserPreferences = (api: BaseTest['api'], preferences: UsersSetPreferencesParamsPOST['data']): Promise => + api.post(`/v1/users.setPreferences`, { data: preferences }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts b/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts index 6df7919bea0b..e949ef706319 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts @@ -80,5 +80,41 @@ describe('LIVECHAT - appearance', function () { .send([{ _id: 'Livechat_title', value: 'test' }]) .expect(200); }); + // Test for: https://github.com/ajv-validator/ajv/issues/1140 + it('should update a boolean setting and keep it as boolean', async () => { + await request + .post(api('livechat/appearance')) + .set(credentials) + .send([{ _id: 'Livechat_registration_form', value: true }]) + .expect(200); + + // Get data from livechat/config + const { body } = await request.get(api('livechat/config')).set(credentials).expect(200); + expect(body.config.settings.registrationForm).to.be.true; + }); + it('should update a boolean setting and keep it as boolean', async () => { + await request + .post(api('livechat/appearance')) + .set(credentials) + .send([{ _id: 'Livechat_registration_form', value: false }]) + .expect(200); + + // Get data from livechat/config + const { body } = await request.get(api('livechat/config')).set(credentials).expect(200); + expect(body.config.settings.registrationForm).to.be.false; + }); + it('should update a number setting and keep it as number', async () => { + await updateSetting('Livechat_enable_message_character_limit', true); + await request + .post(api('livechat/appearance')) + .set(credentials) + .send([{ _id: 'Livechat_message_character_limit', value: 100 }]) + .expect(200); + + // Get data from livechat/config + const { body } = await request.get(api('livechat/config')).set(credentials).expect(200); + expect(body.config.settings.limitTextLength).to.be.equal(100); + await updateSetting('Livechat_enable_message_character_limit', false); + }); }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts b/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts index a5a4d848b70d..538ae040fde6 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts @@ -344,8 +344,15 @@ import { IS_EE } from '../../../e2e/config/constants'; }); describe('PUT livechat/departments/:_id', () => { + let department: ILivechatDepartment; + before(async () => { + department = await createDepartment(); + }); + after(async () => { + await deleteDepartment(department._id); + }); + it('should return an error if fallbackForwardDepartment points to same department', async () => { - const department = await createDepartment(); await request .put(api(`livechat/department/${department._id}`)) .set(credentials) @@ -361,7 +368,58 @@ import { IS_EE } from '../../../e2e/config/constants'; }) .expect('Content-Type', 'application/json') .expect(400); - await deleteDepartment(department._id); + }); + it('should fail if `agents` param is not an array', async () => { + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + agents: 'not an array', + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should throw an error if user has permission to add agents and agents array has invalid format', async () => { + await updatePermission('add-livechat-department-agents', ['admin']); + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + agents: [{ notAValidKey: 'string' }], + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should throw an error if user has permission to add agents and agents array has invalid internal format', async () => { + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + agents: [{ upsert: [{ notAValidKey: 'string' }] }], + }) + .expect('Content-Type', 'application/json') + .expect(400); }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts b/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts index 0585c20bf127..073b031c2590 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts @@ -43,6 +43,17 @@ describe('LIVECHAT - business hours', function () { let defaultBhId: any; describe('[CE] livechat/business-hour', () => { + after(async () => { + await saveBusinessHour({ + ...defaultBhId, + timezone: { + name: 'America/Sao_Paulo', + utc: '-03:00', + }, + workHours: getWorkHours(true), + }); + }); + it('should fail when user doesnt have view-livechat-business-hours permission', async () => { await removePermissionFromAllRoles('view-livechat-business-hours'); const response = await request.get(api('livechat/business-hour')).set(credentials).expect(403); @@ -100,6 +111,39 @@ describe('LIVECHAT - business hours', function () { expect(body).to.have.property('success', true); }); + it('should save a default business hour with proper timezone settings', async () => { + await saveBusinessHour({ + ...defaultBhId, + timezone: { + name: 'Asia/Kolkata', + utc: '+05:30', + }, + workHours: getWorkHours(true), + timezoneName: 'Asia/Kolkata', + }); + + const { body } = await request + .get(api('livechat/business-hour')) + .set(credentials) + .query({ type: LivechatBusinessHourTypes.DEFAULT }) + .expect(200); + + expect(body.success).to.be.true; + expect(body.businessHour).to.be.an('object'); + expect(body.businessHour.timezone).to.be.an('object').that.has.property('name').that.is.equal('Asia/Kolkata'); + expect(body.businessHour.workHours).to.be.an('array').with.lengthOf(7); + + const { workHours } = body.businessHour; + + expect(workHours[0].day).to.be.equal('Sunday'); + expect(workHours[0].start.utc.dayOfWeek).to.be.equal('Saturday'); + expect(workHours[0].finish.utc.dayOfWeek).to.be.equal('Sunday'); + }); + + it('should allow agents to be available', async () => { + const { body } = await makeAgentAvailable(credentials); + expect(body).to.have.property('success', true); + }); }); (IS_EE ? describe : describe.skip)('[EE] livechat/business-hour', () => { diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveBadWords.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveBadWords.tests.ts new file mode 100644 index 000000000000..adaecc6cd2e1 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveBadWords.tests.ts @@ -0,0 +1,83 @@ +import { expect } from 'chai'; + +import { BeforeSaveBadWords } from '../../../../../../server/services/messages/hooks/BeforeSaveBadWords'; + +const createMessage = (msg?: string) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, +}); + +describe('Filter bad words before saving message', () => { + it('should return same message if bad words not configured', async () => { + const badWords = new BeforeSaveBadWords(); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('hell'); + }); + + it("should return same message if no 'msg' property provided", async () => { + const badWords = new BeforeSaveBadWords(); + + const message = createMessage(); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal(undefined); + }); + + it('should return filter bad words from message when configured', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure(); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.equal('****'); + }); + + it('should return same message if bad words disabled after configured', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure(); + + badWords.disable(); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('hell'); + }); + + it('should filter custom bad words', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure('good'); + + const message = createMessage('good'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('****'); + }); + + it('should allow custom good words', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure(undefined, 'hell'); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('hell'); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSavePreventMention.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSavePreventMention.tests.ts new file mode 100644 index 000000000000..6dc6d472cae5 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSavePreventMention.tests.ts @@ -0,0 +1,114 @@ +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; + +const Authorization = { + hasPermission: async (_uid: string, _permission: string, _room?: string): Promise => true, +}; + +class MeteorError extends Error {} + +const { BeforeSavePreventMention } = proxyquire + .noCallThru() + .load('../../../../../../server/services/messages/hooks/BeforeSavePreventMention', { + '@rocket.chat/core-services': { + Authorization, + MeteorError, + }, + '../../../lib/i18n': { + i18n: { + t: (s: any) => s, + }, + }, + }); + +describe('Prevent mention on messages', () => { + it('should return void if message has no mentions', async () => { + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it("should return void if message doesnt't have @all mention", () => { + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'here' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it("should return void if message doesnt't have @here mention", () => { + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-here', + }), + ).to.eventually.be.true; + }); + + it('should return true if user has required permission', () => { + const preventMention = new BeforeSavePreventMention(); + + Authorization.hasPermission = async () => true; + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it('should return void if user has required permission on room scope', () => { + const preventMention = new BeforeSavePreventMention(); + + Authorization.hasPermission = async (_uid, _permission, room) => { + if (room) { + return true; + } + + return false; + }; + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it("should throw if user doesn't have required permissions", () => { + Authorization.hasPermission = async (_uid, _permission, _room) => false; + + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.be.rejectedWith(MeteorError); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveSpotify.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveSpotify.tests.ts new file mode 100644 index 000000000000..03c23502d38b --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveSpotify.tests.ts @@ -0,0 +1,92 @@ +import { expect } from 'chai'; + +import { BeforeSaveSpotify } from '../../../../../../server/services/messages/hooks/BeforeSaveSpotify'; + +const createMessage = (msg?: string, extra: any = {}) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, + ...extra, +}); + +describe('Convert Spotify syntax to URLs', () => { + it('should return no URLs if no Spotify syntax provided', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('hey'), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should return no URLs if an undefined message is provided', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage(), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should not return a Spotify URL if some Spotify syntax is provided within a code block', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('test\n```\nspotify:track:1q6IK1l4qpYykOaWaLJkWG\n```'), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should not return a Spotify URL if some Spotify syntax is provided within a inline code', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('test `spotify:track:1q6IK1l4qpYykOaWaLJkWG` ok'), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should return a Spotify URL if some Spotify syntax is provided', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('spotify:track:1q6IK1l4qpYykOaWaLJkWG'), + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + + const [url] = message.urls ?? []; + + expect(url).to.have.property('url', 'https://open.spotify.com/track/1q6IK1l4qpYykOaWaLJkWG'); + expect(url).to.have.property('source', 'spotify:track:1q6IK1l4qpYykOaWaLJkWG'); + }); + + it('should append a Spotify URL when Spotify syntax is provided with already existing URLs', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('spotify:track:1q6IK1l4qpYykOaWaLJkWG', { + urls: [{ url: 'https://rocket.chat' }], + }), + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(2); + + const [url1, url2] = message.urls ?? []; + + expect(url1).to.have.property('url', 'https://rocket.chat'); + + expect(url2).to.have.property('url', 'https://open.spotify.com/track/1q6IK1l4qpYykOaWaLJkWG'); + expect(url2).to.have.property('source', 'spotify:track:1q6IK1l4qpYykOaWaLJkWG'); + }); +}); diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index 029dc0e3630e..a19189da6cbf 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,55 @@ # @rocket.chat/account-service +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -45,6 +95,36 @@ - @rocket.chat/rest-typings@6.5.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.2.14 ### Patch Changes diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index f5297d9b7a03..9a8de416d40e 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", @@ -22,7 +22,7 @@ "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "bcrypt": "^5.0.1", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", @@ -30,18 +30,18 @@ "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", "polka": "^0.5.2", - "uuid": "^9.0.0" + "uuid": "^9.0.1" }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/bcrypt": "^5.0.0", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/bcrypt": "^5.0.1", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", "typescript": "~5.2.2" diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index 2afee9e7f44b..08a17b61063b 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,55 @@ # @rocket.chat/authorization-service +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -45,6 +95,36 @@ - @rocket.chat/rest-typings@6.5.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.2.14 ### Patch Changes diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index f9bff1aa245b..83d0969d07cf 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", @@ -22,14 +22,14 @@ "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", "eventemitter3": "^4.0.7", "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", @@ -37,8 +37,8 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", "typescript": "~5.2.2" diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index 8df2b2d1ab44..f86e59f76b96 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,65 @@ # @rocket.chat/ddp-streamer +## 0.2.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 +- @rocket.chat/instance-status@0.0.21-rc.7 + +## 0.2.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 +- @rocket.chat/instance-status@0.0.21-rc.6 + +## 0.2.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 +- @rocket.chat/instance-status@0.0.21-rc.5 + +## 0.2.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 +- @rocket.chat/instance-status@0.0.21-rc.4 + +## 0.2.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 +- @rocket.chat/instance-status@0.0.21-rc.3 + ## 0.2.0-rc.2 ### Patch Changes @@ -52,6 +112,42 @@ - @rocket.chat/models@0.0.21-rc.0 - @rocket.chat/instance-status@0.0.21-rc.0 +## 0.1.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/models@0.0.23 +- @rocket.chat/instance-status@0.0.23 + +## 0.1.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/models@0.0.22 +- @rocket.chat/instance-status@0.0.22 + +## 0.1.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/models@0.0.21 +- @rocket.chat/instance-status@0.0.21 + ## 0.1.14 ### Patch Changes diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index d238b92a5067..4cee0967c56c 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.2.0-rc.2", + "version": "0.2.0-rc.7", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", @@ -34,26 +34,26 @@ "gc-stats": "^1.4.0", "jaeger-client": "^3.19.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", "polka": "^0.5.2", - "sharp": "^0.30.7", + "sharp": "^0.32.6", "underscore": "^1.13.6", "uuid": "^7.0.3", "ws": "^8.8.1" }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/ejson": "^2.2.0", - "@types/gc-stats": "^1", - "@types/meteor": "^2.9.2", - "@types/node": "^14.18.51", - "@types/polka": "^0.5.4", + "@types/ejson": "^2.2.1", + "@types/gc-stats": "^1.4.2", + "@types/meteor": "^2.9.5", + "@types/node": "^14.18.63", + "@types/polka": "^0.5.6", "@types/sharp": "^0.30.5", "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.5", + "@types/ws": "^8.5.8", "eslint": "~8.45.0", "pino-pretty": "^7.6.1", "ts-node": "^10.9.1", diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index 350764769eb2..4cf5684defe4 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,60 @@ # @rocket.chat/omnichannel-transcript +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/omnichannel-services@0.1.0-rc.7 +- @rocket.chat/pdf-worker@0.0.21-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/omnichannel-services@0.1.0-rc.6 +- @rocket.chat/pdf-worker@0.0.21-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/omnichannel-services@0.1.0-rc.5 +- @rocket.chat/pdf-worker@0.0.21-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/omnichannel-services@0.1.0-rc.4 +- @rocket.chat/pdf-worker@0.0.21-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/omnichannel-services@0.1.0-rc.3 +- @rocket.chat/pdf-worker@0.0.21-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -48,6 +103,39 @@ - @rocket.chat/pdf-worker@0.0.21-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/omnichannel-services@0.0.23 +- @rocket.chat/pdf-worker@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/omnichannel-services@0.0.22 +- @rocket.chat/pdf-worker@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/omnichannel-services@0.0.21 +- @rocket.chat/pdf-worker@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.2.14 ### Patch Changes diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index 6d1fc19d703d..7369f418a6d0 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", @@ -15,7 +15,7 @@ ], "author": "Rocket.Chat", "dependencies": { - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "next", @@ -25,7 +25,7 @@ "@rocket.chat/omnichannel-services": "workspace:^", "@rocket.chat/pdf-worker": "workspace:^", "@rocket.chat/tools": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "event-loop-stats": "^1.4.1", @@ -33,7 +33,7 @@ "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "moment-timezone": "^0.5.43", "mongo-message-queue": "^1.0.0", "mongodb": "^4.17.1", @@ -44,8 +44,8 @@ "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", "typescript": "~5.2.2" diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index 0254b45b3d29..cc34c979175a 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,55 @@ # @rocket.chat/presence-service +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/presence@0.1.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/presence@0.1.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/presence@0.1.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/presence@0.1.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/presence@0.1.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -45,6 +95,36 @@ - @rocket.chat/core-services@0.3.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/presence@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/presence@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/presence@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.2.14 ### Patch Changes diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index b6f705ee2081..092c29aea948 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", @@ -22,14 +22,14 @@ "@rocket.chat/models": "workspace:^", "@rocket.chat/presence": "workspace:^", "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", "eventemitter3": "^4.0.7", "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", @@ -37,8 +37,8 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", "typescript": "~5.2.2" diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index e7eae99a78e6..54b40f64181d 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,55 @@ # @rocket.chat/queue-worker +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/omnichannel-services@0.1.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/omnichannel-services@0.1.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/omnichannel-services@0.1.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/omnichannel-services@0.1.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/omnichannel-services@0.1.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -44,6 +94,36 @@ - @rocket.chat/omnichannel-services@0.1.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/omnichannel-services@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/omnichannel-services@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/omnichannel-services@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.2.14 ### Patch Changes diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index 548f498c02d9..d86b3d8ac00e 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", @@ -15,7 +15,7 @@ ], "author": "Rocket.Chat", "dependencies": { - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "next", @@ -23,7 +23,7 @@ "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/omnichannel-services": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "event-loop-stats": "^1.4.1", @@ -31,7 +31,7 @@ "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "moment-timezone": "^0.5.43", "mongo-message-queue": "^1.0.0", "mongodb": "^4.17.1", @@ -41,8 +41,8 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", "typescript": "~5.2.2" diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index 2fc856ca4dc7..d27e6701d005 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,50 @@ # @rocket.chat/stream-hub-service +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -41,6 +86,33 @@ - @rocket.chat/core-services@0.3.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.2.14 ### Patch Changes diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index d2bcd0d78db4..a615bb9bde70 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", @@ -22,14 +22,14 @@ "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", "eventemitter3": "^4.0.7", "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", @@ -38,9 +38,9 @@ "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@types/bcrypt": "^5.0.0", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/bcrypt": "^5.0.1", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", "typescript": "~5.2.2" diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index 9a82141d95a5..7f0793b918b8 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,40 @@ # @rocket.chat/api-client +## 0.1.15-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 + +## 0.1.15-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 + +## 0.1.15-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 + +## 0.1.15-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 + +## 0.1.15-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 + ## 0.1.15-rc.2 ### Patch Changes @@ -29,6 +64,27 @@ - @rocket.chat/core-typings@6.5.0-rc.0 - @rocket.chat/rest-typings@6.5.0-rc.0 +## 0.1.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 + +## 0.1.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 + +## 0.1.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 + ## 0.1.14 ### Patch Changes diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 3f14e3d266f5..3cefb84a8088 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/api-client", - "version": "0.1.15-rc.2", + "version": "0.1.18-rc.0", "devDependencies": { - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", - "@types/jest": "~29.5.3", - "@types/strict-uri-encode": "^2.0.0", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", + "@types/jest": "~29.5.7", + "@types/strict-uri-encode": "^2.0.1", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "jest-fetch-mock": "^3.0.3", "ts-jest": "~29.0.5", "typescript": "~5.2.2" diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index b2f752a57c05..b665410d6093 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,40 @@ # @rocket.chat/ddp-client +## 0.2.6-rc.7 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/api-client@0.1.15-rc.7 + +## 0.2.6-rc.6 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/api-client@0.1.15-rc.6 + +## 0.2.6-rc.5 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/api-client@0.1.15-rc.5 + +## 0.2.6-rc.4 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/api-client@0.1.15-rc.4 + +## 0.2.6-rc.3 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/api-client@0.1.15-rc.3 + ## 0.2.6-rc.2 ### Patch Changes @@ -28,6 +63,27 @@ - @rocket.chat/rest-typings@6.5.0-rc.0 - @rocket.chat/api-client@0.1.15-rc.0 +## 0.2.8 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/api-client@0.1.17 + +## 0.2.7 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/api-client@0.1.16 + +## 0.2.6 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/api-client@0.1.15 + ## 0.2.5 ### Patch Changes diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index f70b9d9e4d11..4804abb369a7 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,14 +1,14 @@ { "name": "@rocket.chat/ddp-client", - "version": "0.2.6-rc.2", + "version": "0.2.9-rc.0", "devDependencies": { - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", - "@types/jest": "~29.5.3", - "@types/ws": "^8.5.5", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", + "@types/jest": "~29.5.7", + "@types/ws": "^8.5.8", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "jest-websocket-mock": "^2.4.0", "typescript": "~5.2.2", "ws": "^8.13.0" diff --git a/ee/packages/ddp-client/src/types/streams.ts b/ee/packages/ddp-client/src/types/streams.ts index abadd53c1851..f1a54c674b9b 100644 --- a/ee/packages/ddp-client/src/types/streams.ts +++ b/ee/packages/ddp-client/src/types/streams.ts @@ -226,9 +226,16 @@ export interface StreamerEvents { { key: 'Users:Deleted'; args: [ - { - userId: IUser['_id']; - }, + | { + userId: IUser['_id']; + messageErasureType: 'Delete'; + replaceByUser?: never; + } + | { + userId: IUser['_id']; + messageErasureType: 'Unlink'; + replaceByUser?: { _id: IUser['_id']; username: IUser['username']; alias: string }; + }, ]; }, { diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md index 848e0ebd9d9e..a4b1453e8faf 100644 --- a/ee/packages/license/CHANGELOG.md +++ b/ee/packages/license/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/license +## 0.1.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 + +## 0.1.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 + +## 0.1.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 + +## 0.1.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 + +## 0.1.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 + ## 0.1.0-rc.2 ### Patch Changes diff --git a/ee/packages/license/__tests__/MockedLicenseBuilder.ts b/ee/packages/license/__tests__/MockedLicenseBuilder.ts index 4f2b49596be3..d68976b23df0 100644 --- a/ee/packages/license/__tests__/MockedLicenseBuilder.ts +++ b/ee/packages/license/__tests__/MockedLicenseBuilder.ts @@ -10,7 +10,7 @@ export class MockedLicenseBuilder { information: { id?: string; autoRenew: boolean; - visualExpiration: Timestamp; + visualExpiration?: Timestamp; notifyAdminsAt?: Timestamp; notifyUsersAt?: Timestamp; trial: boolean; diff --git a/ee/packages/license/__tests__/emitter.spec.ts b/ee/packages/license/__tests__/emitter.spec.ts index ce949365e8a6..bf5406ef8501 100644 --- a/ee/packages/license/__tests__/emitter.spec.ts +++ b/ee/packages/license/__tests__/emitter.spec.ts @@ -242,7 +242,7 @@ describe('Event License behaviors', () => { await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(false); await expect(fn).toBeCalledTimes(2); - await expect(toggleFn).toBeCalledTimes(1); + await expect(toggleFn).toBeCalledTimes(0); await expect(fn).toBeCalledWith({ reason: 'limit', @@ -277,7 +277,7 @@ describe('Event License behaviors', () => { expect(preventFn).toBeCalledTimes(0); expect(preventToggleFn).toBeCalledTimes(0); expect(allowFn).toBeCalledTimes(1); - expect(allowToggleFn).toBeCalledTimes(1); + expect(allowToggleFn).toBeCalledTimes(0); preventFn.mockClear(); preventToggleFn.mockClear(); diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index c586788a5ea6..814649c87e0f 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,16 +1,16 @@ { "name": "@rocket.chat/license", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.7", "private": true, "devDependencies": { - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", - "@types/bcrypt": "^5.0.0", - "@types/jest": "~29.5.3", - "@types/ws": "^8.5.5", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", + "@types/bcrypt": "^5.0.1", + "@types/jest": "~29.5.7", + "@types/ws": "^8.5.8", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "jest-websocket-mock": "^2.4.0", "ts-jest": "~29.0.5", "typescript": "^5.2.2" diff --git a/ee/packages/license/src/definition/ILicenseV3.ts b/ee/packages/license/src/definition/ILicenseV3.ts index d3a2d7f572a3..eabc276cd09d 100644 --- a/ee/packages/license/src/definition/ILicenseV3.ts +++ b/ee/packages/license/src/definition/ILicenseV3.ts @@ -8,7 +8,7 @@ export interface ILicenseV3 { information: { id?: string; autoRenew: boolean; - visualExpiration: Timestamp; + visualExpiration?: Timestamp; notifyAdminsAt?: Timestamp; notifyUsersAt?: Timestamp; trial: boolean; diff --git a/ee/packages/license/src/definition/events.ts b/ee/packages/license/src/definition/events.ts index b9d211da9b7a..f19dc13cc82e 100644 --- a/ee/packages/license/src/definition/events.ts +++ b/ee/packages/license/src/definition/events.ts @@ -15,6 +15,7 @@ export type LicenseEvents = ModuleValidation & BehaviorTriggeredToggled & BehaviorTriggered & LimitReached & { + installed: undefined; validate: undefined; invalidate: undefined; module: { module: LicenseModule; valid: boolean }; diff --git a/ee/packages/license/src/events/emitter.ts b/ee/packages/license/src/events/emitter.ts index 51f3282a9742..dde10d68563f 100644 --- a/ee/packages/license/src/events/emitter.ts +++ b/ee/packages/license/src/events/emitter.ts @@ -6,18 +6,26 @@ import { logger } from '../logger'; export function moduleValidated(this: LicenseManager, module: LicenseModule) { try { this.emit('module', { module, valid: true }); + } catch (error) { + logger.error({ msg: `Error running module (valid: true) event: ${module}`, error }); + } + try { this.emit(`valid:${module}`); } catch (error) { - logger.error({ msg: 'Error running module added event', error }); + logger.error({ msg: `Error running module added event: ${module}`, error }); } } export function moduleRemoved(this: LicenseManager, module: LicenseModule) { try { this.emit('module', { module, valid: false }); + } catch (error) { + logger.error({ msg: `Error running module (valid: false) event: ${module}`, error }); + } + try { this.emit(`invalid:${module}`); } catch (error) { - logger.error({ msg: 'Error running module removed event', error }); + logger.error({ msg: `Error running module removed event: ${module}`, error }); } } diff --git a/ee/packages/license/src/index.ts b/ee/packages/license/src/index.ts index e590ce7722b2..6e680e5296de 100644 --- a/ee/packages/license/src/index.ts +++ b/ee/packages/license/src/index.ts @@ -22,6 +22,7 @@ import { getTags } from './tags'; import { getCurrentValueForLicenseLimit, setLicenseLimitCounter } from './validation/getCurrentValueForLicenseLimit'; import { validateFormat } from './validation/validateFormat'; +export { DuplicatedLicenseError } from './errors/DuplicatedLicenseError'; export * from './definition/ILicenseTag'; export * from './definition/ILicenseV2'; export * from './definition/ILicenseV3'; diff --git a/ee/packages/license/src/license.spec.ts b/ee/packages/license/src/license.spec.ts index b6ad946860fc..a1a226bdff5b 100644 --- a/ee/packages/license/src/license.spec.ts +++ b/ee/packages/license/src/license.spec.ts @@ -148,7 +148,48 @@ describe('Validate License Limits', () => { await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); expect(preventActionCallback).toHaveBeenCalledTimes(4); - expect(fairUsageCallback).toHaveBeenCalledTimes(4); + expect(fairUsageCallback).toHaveBeenCalledTimes(1); + }); + it('should trigger the toggle event if the counter is under the limit', async () => { + const licenseManager = await getReadyLicenseManager(); + + const fairUsageCallback = jest.fn(); + const preventActionCallback = jest.fn(); + + licenseManager.onBehaviorToggled('start_fair_policy', fairUsageCallback); + licenseManager.onBehaviorTriggered('prevent_action', preventActionCallback); + + const license = await new MockedLicenseBuilder().withLimits('activeUsers', [ + { + max: 12, + behavior: 'prevent_action', + }, + { + max: 10, + behavior: 'start_fair_policy', + }, + ]); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 12); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); + expect(fairUsageCallback).toHaveBeenCalledTimes(1); + expect(preventActionCallback).toHaveBeenCalledTimes(1); + + preventActionCallback.mockClear(); + fairUsageCallback.mockClear(); + licenseManager.setLicenseLimitCounter('activeUsers', () => 12); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); + expect(fairUsageCallback).toHaveBeenCalledTimes(0); + expect(preventActionCallback).toHaveBeenCalledTimes(1); + + preventActionCallback.mockClear(); + fairUsageCallback.mockClear(); + licenseManager.setLicenseLimitCounter('activeUsers', () => 5); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(false); + expect(fairUsageCallback).toHaveBeenCalledTimes(1); + expect(preventActionCallback).toHaveBeenCalledTimes(0); }); }); @@ -274,3 +315,104 @@ describe('License.getInfo', () => { }); }); }); + +describe('License.setLicense', () => { + it('should trigger the validate event even if the module callback throws an error', async () => { + const licenseManager = await getReadyLicenseManager(); + + const validateCallback = jest.fn(); + const moduleCallback = jest.fn(() => { + throw new Error('Error'); + }); + + const syncCallback = jest.fn(); + + licenseManager.on('validate', validateCallback); + licenseManager.on('sync', syncCallback); + licenseManager.on('module', moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(0); + }); + + it('should trigger the sync event only from the sync method', async () => { + const licenseManager = await getReadyLicenseManager(); + + const validateCallback = jest.fn(); + const moduleCallback = jest.fn(); + const syncCallback = jest.fn(); + + licenseManager.on('validate', validateCallback); + licenseManager.on('sync', syncCallback); + licenseManager.on('module', moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']).withLimits('activeUsers', [ + { + max: 10, + behavior: 'disable_modules', + modules: ['auditing'], + }, + ]); + + await expect(licenseManager.setLicense(await license.sign(), true)).resolves.toBe(true); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(0); + + validateCallback.mockClear(); + moduleCallback.mockClear(); + syncCallback.mockClear(); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 11); + await licenseManager.revalidateLicense(); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(1); + }); + + it('should trigger the sync event even if the module callback throws an error', async () => { + const licenseManager = await getReadyLicenseManager(); + + const validateCallback = jest.fn(); + const moduleCallback = jest.fn(() => { + throw new Error('Error'); + }); + const syncCallback = jest.fn(); + + licenseManager.on('validate', validateCallback); + licenseManager.on('sync', syncCallback); + licenseManager.on('module', moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']).withLimits('activeUsers', [ + { + max: 10, + behavior: 'disable_modules', + modules: ['auditing'], + }, + ]); + + await expect(licenseManager.setLicense(await license.sign(), true)).resolves.toBe(true); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(0); + + validateCallback.mockClear(); + moduleCallback.mockClear(); + syncCallback.mockClear(); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 11); + await licenseManager.revalidateLicense(); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(1); + }); +}); diff --git a/ee/packages/license/src/license.ts b/ee/packages/license/src/license.ts index 0faa22f4e22d..c8a5c0a514d5 100644 --- a/ee/packages/license/src/license.ts +++ b/ee/packages/license/src/license.ts @@ -3,7 +3,7 @@ import { Emitter } from '@rocket.chat/emitter'; import { type ILicenseTag } from './definition/ILicenseTag'; import type { ILicenseV2 } from './definition/ILicenseV2'; import type { ILicenseV3, LicenseLimitKind } from './definition/ILicenseV3'; -import type { BehaviorWithContext } from './definition/LicenseBehavior'; +import type { BehaviorWithContext, LicenseBehavior } from './definition/LicenseBehavior'; import type { LicenseInfo } from './definition/LicenseInfo'; import type { LicenseModule } from './definition/LicenseModule'; import type { LicenseValidationOptions } from './definition/LicenseValidationOptions'; @@ -52,12 +52,19 @@ export class LicenseManager extends Emitter { private _lockedLicense: string | undefined; - public shouldPreventActionResults = new Map(); + private states = new Map>(); + + public get shouldPreventActionResults() { + const state = this.states.get('prevent_action') ?? new Map(); + + this.states.set('prevent_action', state); + + return state; + } constructor() { super(); - - this.on('validate', () => showLicense.call(this, this._license, this._valid)); + this.on('installed', () => showLicense.call(this, this._license, this._valid)); } public get license(): ILicenseV3 | undefined { @@ -268,6 +275,8 @@ export class LicenseManager extends Emitter { } await this.setLicenseV3(decrypted, encryptedLicense, decrypted, isNewLicense); + this.emit('installed'); + return true; } catch (e) { logger.error('Invalid license'); @@ -380,7 +389,22 @@ export class LicenseManager extends Emitter { return shouldPreventAction; } - if (isBehaviorsInResult(validationResult, ['invalidate_license', 'disable_modules', 'start_fair_policy'])) { + // check if any of the behaviors that should trigger a sync changed + if ( + (['invalidate_license', 'disable_modules', 'start_fair_policy'] as const).some((behavior) => { + const hasChanged = this.consolidateBehaviorState(action, behavior, isBehaviorsInResult(validationResult, [behavior])); + if (hasChanged && behavior === 'start_fair_policy') { + this.triggerBehaviorEventsToggled([ + { + behavior: 'start_fair_policy', + reason: 'limit', + limit: action, + }, + ]); + } + return hasChanged; + }) + ) { await this.revalidateLicense(); } @@ -395,9 +419,7 @@ export class LicenseManager extends Emitter { } as BehaviorWithContext, ]; - if (this.shouldPreventActionResults.get(action) !== shouldPreventAction) { - this.shouldPreventActionResults.set(action, shouldPreventAction); - + if (this.consolidateBehaviorState(action, 'prevent_action', shouldPreventAction)) { this.triggerBehaviorEventsToggled(eventsToEmit); } @@ -406,6 +428,23 @@ export class LicenseManager extends Emitter { return shouldPreventAction; } + private consolidateBehaviorState(action: T, behavior: LicenseBehavior, triggered: boolean): boolean { + // check if the behavior changed + const state = this.states.get(behavior) ?? new Map(); + + const currentState = state.get(action) ?? false; + + if (currentState === triggered) { + return false; + } + + // if it changed, update the state + state.set(action, triggered); + + this.states.set(behavior, state); + return true; + } + public async getInfo({ limits: includeLimits, currentValues: loadCurrentValues, diff --git a/ee/packages/license/src/v2/convertToV3.ts b/ee/packages/license/src/v2/convertToV3.ts index f4232c0bac4f..94e94a868e54 100644 --- a/ee/packages/license/src/v2/convertToV3.ts +++ b/ee/packages/license/src/v2/convertToV3.ts @@ -14,7 +14,7 @@ export const convertToV3 = (v2: ILicenseV2): ILicenseV3 => { version: '3.0', information: { autoRenew: false, - visualExpiration: new Date(Date.parse(v2.meta?.trialEnd || v2.expiry)).toISOString(), + ...((v2.meta?.trialEnd || v2.expiry) && { visualExpiration: new Date(Date.parse(v2.meta?.trialEnd || v2.expiry)).toISOString() }), trial: v2.meta?.trial || false, offline: false, createdAt: new Date().toISOString(), diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index 31954b07fe2f..aea3cb273457 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,60 @@ # @rocket.chat/omnichannel-services +## 0.1.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/pdf-worker@0.0.21-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.1.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/pdf-worker@0.0.21-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.1.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/pdf-worker@0.0.21-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.1.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/pdf-worker@0.0.21-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.1.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/pdf-worker@0.0.21-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.1.0-rc.2 ### Patch Changes @@ -50,6 +105,39 @@ - @rocket.chat/pdf-worker@0.0.21-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.0.23 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/pdf-worker@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/pdf-worker@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/pdf-worker@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + ## 0.0.20 ### Patch Changes diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index 3e12fba9aeaf..73fa510e6d12 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,12 +1,12 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.7", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, @@ -21,7 +21,7 @@ "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "next", "@rocket.chat/tools": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "eventemitter3": "^4.0.7", diff --git a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts index 0e135d5ed263..7f27e70ac8a5 100644 --- a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts +++ b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts @@ -8,7 +8,6 @@ import { QueueWorker as queueService, Translation as translationService, Settings as settingsService, - License as licenseService, } from '@rocket.chat/core-services'; import type { IOmnichannelTranscriptService } from '@rocket.chat/core-services'; import type { IMessage, IUser, IRoom, IUpload, ILivechatVisitor, ILivechatAgent } from '@rocket.chat/core-typings'; @@ -61,27 +60,11 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT currentJobNumber = 0; - shouldWork = false; - constructor(loggerClass: typeof Logger) { super(); this.worker = new PdfWorker('chat-transcript'); // eslint-disable-next-line new-cap this.log = new loggerClass('OmnichannelTranscript'); - - this.onEvent('license.module', ({ module, valid }) => { - if (module === 'scalability') { - this.shouldWork = valid; - } - }); - } - - async started(): Promise { - try { - this.shouldWork = await licenseService.hasModule('scalability'); - } catch (e: unknown) { - // ignore - } } async getTimezone(user?: { utcOffset?: string | number }): Promise { @@ -109,10 +92,6 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } async requestTranscript({ details }: { details: WorkDetails }): Promise { - if (!this.shouldWork) { - this.log.info(`Not requesting transcript for room ${details.rid} because scalability module is not enabled`); - return; - } this.log.info(`Requesting transcript for room ${details.rid} by user ${details.userId}`); const room = await LivechatRooms.findOneById(details.rid); if (!room) { @@ -286,10 +265,6 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } async workOnPdf({ details }: { details: WorkDetailsWithSource }): Promise { - if (!this.shouldWork) { - this.log.info(`Processing transcript for room ${details.rid} by user ${details.userId} - Stopped (no scalability license found)`); - return; - } this.log.info(`Processing transcript for room ${details.rid} by user ${details.userId} - Received from queue`); if (this.maxNumberOfConcurrentJobs <= this.currentJobNumber) { this.log.error(`Processing transcript for room ${details.rid} by user ${details.userId} - Too many concurrent jobs, queuing again`); diff --git a/ee/packages/omnichannel-services/src/QueueWorker.ts b/ee/packages/omnichannel-services/src/QueueWorker.ts index bfb69362fac6..b217586d3a83 100644 --- a/ee/packages/omnichannel-services/src/QueueWorker.ts +++ b/ee/packages/omnichannel-services/src/QueueWorker.ts @@ -1,4 +1,4 @@ -import { ServiceClass, api, License } from '@rocket.chat/core-services'; +import { ServiceClass, api } from '@rocket.chat/core-services'; import type { IQueueWorkerService, HealthAggResult } from '@rocket.chat/core-services'; import type { Logger } from '@rocket.chat/logger'; import type { Actions, ValidResult, Work } from 'mongo-message-queue'; @@ -17,28 +17,12 @@ export class QueueWorker extends ServiceClass implements IQueueWorkerService { private logger: Logger; - private shouldWork = true; - constructor(private readonly db: Db, loggerClass: typeof Logger) { super(); // eslint-disable-next-line new-cap this.logger = new loggerClass('QueueWorker'); this.queue = new MessageQueue(); - - this.onEvent('license.module', ({ module, valid }) => { - if (module === 'scalability') { - this.shouldWork = valid; - } - }); - } - - async started(): Promise { - try { - this.shouldWork = await License.hasModule('scalability'); - } catch (e: unknown) { - // ignore - } } isServiceNotFoundMessage(message: string): boolean { @@ -132,11 +116,6 @@ export class QueueWorker extends ServiceClass implements IQueueWorkerService { // `to` is a service name that will be called, including namespace + action // This is a "generic" job that allows you to call any service async queueWork>(queue: Actions, to: string, data: T): Promise { - if (!this.shouldWork) { - this.logger.info('Queue worker is disabled, not queueing work'); - return; - } - this.logger.info(`Queueing work for ${to}`); if (!this.matchServiceCall(to)) { // We don't want to queue calls to invalid service names diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index 5329595830be..c27e364ea564 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/pdf-worker +## 0.0.21-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 + +## 0.0.21-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 + +## 0.0.21-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 + +## 0.0.21-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 + +## 0.0.21-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 + ## 0.0.21-rc.2 ### Patch Changes @@ -25,6 +55,24 @@ - Updated dependencies [dea1fe9191] - @rocket.chat/core-typings@6.5.0-rc.0 +## 0.0.23 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 + ## 0.0.20 ### Patch Changes diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index a0c44d32c825..9b0e3579f80e 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,19 +1,19 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.0.21-rc.2", + "version": "0.0.24-rc.0", "private": true, "devDependencies": { "@storybook/addon-essentials": "~6.5.16", "@storybook/react": "~6.5.16", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "~13.4.0", - "@types/emojione": "^2.2.6", - "@types/jest": "~29.5.3", - "@types/react-dom": "~17.0.20", - "@types/testing-library__jest-dom": "~5.14.6", + "@types/emojione": "^2.2.8", + "@types/jest": "~29.5.7", + "@types/react-dom": "~17.0.22", + "@types/testing-library__jest-dom": "~5.14.9", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "react-dom": "^18.2.0", "ts-jest": "~29.0.5", "typescript": "~5.2.2" @@ -32,10 +32,10 @@ "/dist" ], "dependencies": { - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/fuselage-tokens": "^0.32.0", - "@types/react": "~17.0.62", + "@types/react": "~17.0.69", "emoji-assets": "^7.0.1", "emoji-toolkit": "^7.0.1", "moment": "^2.29.4", diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index 06a6a910a533..ba4eb4b27108 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,45 @@ # @rocket.chat/presence +## 0.1.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.1.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.1.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.1.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.1.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.1.0-rc.2 ### Patch Changes @@ -38,6 +78,30 @@ - @rocket.chat/core-services@0.3.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.0.23 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/models@0.0.23 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/models@0.0.22 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/models@0.0.21 + ## 0.0.20 ### Patch Changes diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index bc3e4785438a..7bcfc6e1db03 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,18 +1,18 @@ { "name": "@rocket.chat/presence", - "version": "0.1.0-rc.2", + "version": "0.1.0-rc.7", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", - "@babel/preset-typescript": "~7.22.5", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/apps-engine": "1.41.0-alpha.290", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "babel-jest": "^29.0.3", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "typescript": "~5.2.2" }, "scripts": { diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index fa914c188b11..3870408f7a50 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -18,14 +18,14 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", "eslint": "~8.45.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-testing-library": "^5.11.0", - "jest": "~29.6.1", + "eslint-plugin-testing-library": "^5.11.1", + "jest": "~29.6.4", "react": "~17.0.2", "react-docgen-typescript-plugin": "~1.0.5", "ts-jest": "~29.0.5", diff --git a/ee/packages/ui-theming/src/PaletteStyleTag.tsx b/ee/packages/ui-theming/src/PaletteStyleTag.tsx index ce911ce4a122..62e31ef3d947 100644 --- a/ee/packages/ui-theming/src/PaletteStyleTag.tsx +++ b/ee/packages/ui-theming/src/PaletteStyleTag.tsx @@ -1,4 +1,4 @@ -import { memo } from 'react'; +import React, { memo } from 'react'; import { createPortal } from 'react-dom'; import { codeBlock } from './codeBlockStyles'; @@ -23,5 +23,5 @@ export const PaletteStyleTag = memo(function PaletteStyleTag() { }; const palette = convertToCss(getPalette(), '.rcx-content--main, .rcx-tile'); - return createPortal(theme === 'dark' ? palette + codeBlock : palette, useCreateStyleContainer('main-palette')); + return <>{createPortal(theme === 'dark' ? palette + codeBlock : palette, useCreateStyleContainer('main-palette'))}; }); diff --git a/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx b/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx index fd8cdba5022d..593f8ab2cdf7 100644 --- a/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx +++ b/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx @@ -1,5 +1,5 @@ import type { ReactElement } from 'react'; -import { memo } from 'react'; +import React, { memo } from 'react'; import { createPortal } from 'react-dom'; import { convertToCss } from './helpers/convertToCss'; @@ -18,5 +18,5 @@ export const SidebarPaletteStyleTag = memo(function SidebarPaletteStyleTag(): Re const palette = convertToCss({ ...darkPalette, ...defaultSidebarPalette }, '.rcx-sidebar--main'); - return createPortal(palette, useCreateStyleContainer('sidebar-palette')); + return <>{createPortal(palette, useCreateStyleContainer('sidebar-palette'))}; }); diff --git a/package.json b/package.json index 500e518ead1b..f70a9e071055 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "main": "index.js", "private": true, "scripts": { - "postinstall": "husky install", "build": "turbo run build", "build:services": "turbo run build --filter=rocketchat-services...", "build:ci": "turbo run build:ci", @@ -17,10 +16,9 @@ "fuselage": "./fuselage.sh" }, "devDependencies": { - "@changesets/cli": "^2.26.1", - "@types/chart.js": "^2.9.37", - "@types/js-yaml": "^4.0.5", - "husky": "^7.0.4", + "@changesets/cli": "^2.26.2", + "@types/chart.js": "^2.9.39", + "@types/js-yaml": "^4.0.8", "turbo": "~1.10.16" }, "workspaces": [ diff --git a/packages/account-utils/package.json b/packages/account-utils/package.json index 23423d568acc..30fe066a978a 100644 --- a/packages/account-utils/package.json +++ b/packages/account-utils/package.json @@ -3,9 +3,9 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/agenda/package.json b/packages/agenda/package.json index f533e05dba28..695859a888b4 100644 --- a/packages/agenda/package.json +++ b/packages/agenda/package.json @@ -12,10 +12,10 @@ "mongodb": "^4.17.1" }, "devDependencies": { - "@types/debug": "^4.1.8", - "@types/jest": "~29.5.3", + "@types/debug": "^4.1.10", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/base64/package.json b/packages/base64/package.json index 36e4d0da04af..eb4882767f33 100644 --- a/packages/base64/package.json +++ b/packages/base64/package.json @@ -13,13 +13,13 @@ "test": "jest" }, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/cas-validate/package.json b/packages/cas-validate/package.json index ea7e05a1ba16..4f60755332c3 100644 --- a/packages/cas-validate/package.json +++ b/packages/cas-validate/package.json @@ -4,9 +4,9 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index b1d49fd2232d..37a2fec2ff4e 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,45 @@ # @rocket.chat/core-services +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.3.0-rc.2 ### Patch Changes @@ -40,6 +80,30 @@ - @rocket.chat/rest-typings@6.5.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.2.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/models@0.0.23 + +## 0.2.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/models@0.0.22 + +## 0.2.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/models@0.0.21 + ## 0.2.5 ### Patch Changes diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 6a80bfc813b6..22883244d4e3 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,18 +1,18 @@ { "name": "@rocket.chat/core-services", - "version": "0.3.0-rc.2", + "version": "0.3.0-rc.7", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", - "@babel/preset-typescript": "~7.22.5", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/eslint-config": "workspace:^", - "@types/babel__core": "^7", - "@types/babel__preset-env": "^7", - "@types/jest": "~29.5.3", + "@types/babel__core": "^7.20.3", + "@types/babel__preset-env": "^7.9.4", + "@types/jest": "~29.5.7", "babel-jest": "^29.5.0", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "mongodb": "^4.17.1", "prettier": "~2.8.8", "typescript": "~5.2.2" @@ -41,7 +41,7 @@ "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/ui-kit": "^0.32.1", - "@types/fibers": "^3.1.1", + "@types/fibers": "^3.1.3", "fibers": "^5.0.3" } } diff --git a/packages/core-services/src/LocalBroker.ts b/packages/core-services/src/LocalBroker.ts index dc27e62a5acb..cdedd4fa7057 100644 --- a/packages/core-services/src/LocalBroker.ts +++ b/packages/core-services/src/LocalBroker.ts @@ -3,7 +3,7 @@ import { EventEmitter } from 'events'; import { InstanceStatus } from '@rocket.chat/models'; import { asyncLocalStorage } from '.'; -import type { EventSignatures } from './Events'; +import type { EventSignatures } from './events/Events'; import type { IBroker, IBrokerNode } from './types/IBroker'; import type { ServiceClass, IServiceClass } from './types/ServiceClass'; diff --git a/packages/core-services/src/Events.ts b/packages/core-services/src/events/Events.ts similarity index 96% rename from packages/core-services/src/Events.ts rename to packages/core-services/src/events/Events.ts index c5f36d921655..49e78ea7244a 100644 --- a/packages/core-services/src/Events.ts +++ b/packages/core-services/src/events/Events.ts @@ -36,7 +36,7 @@ import type { } from '@rocket.chat/core-typings'; import type { LicenseLimitKind } from '@rocket.chat/license'; -import type { AutoUpdateRecord } from './types/IMeteor'; +import type { AutoUpdateRecord } from '../types/IMeteor'; type ClientAction = 'inserted' | 'updated' | 'removed' | 'changed'; @@ -100,7 +100,17 @@ export type EventSignatures = { 'stream'([streamer, eventName, payload]: [string, string, any[]]): void; 'subscription'(data: { action: string; subscription: Partial }): void; 'user.avatarUpdate'(user: Partial): void; - 'user.deleted'(user: Pick): void; + 'user.deleted'( + user: Pick, + data: + | { + messageErasureType: 'Delete'; + } + | { + messageErasureType: 'Unlink'; + replaceByUser: { _id: IUser['_id']; username: IUser['username']; alias: string }; + }, + ): void; 'user.deleteCustomStatus'(userStatus: IUserStatus): void; 'user.nameChanged'(user: Pick): void; 'user.realNameChanged'(user: Partial): void; @@ -273,4 +283,5 @@ export type EventSignatures = { 'command.updated'(command: string): void; 'command.removed'(command: string): void; 'actions.changed'(): void; + 'message.sent'(message: IMessage): void; }; diff --git a/packages/core-services/src/events/listeners.ts b/packages/core-services/src/events/listeners.ts new file mode 100644 index 000000000000..ced986cb6f30 --- /dev/null +++ b/packages/core-services/src/events/listeners.ts @@ -0,0 +1,12 @@ +import type { IMessage } from '@rocket.chat/core-typings'; + +import type { IServiceClass } from '../types/ServiceClass'; + +export const dbWatchersDisabled = ['yes', 'true'].includes(String(process.env.DISABLE_DB_WATCHERS).toLowerCase()); + +export const listenToMessageSentEvent = (service: IServiceClass, action: (message: IMessage) => Promise): void => { + if (dbWatchersDisabled) { + return service.onEvent('message.sent', (message: IMessage) => action(message)); + } + return service.onEvent('watch.messages', ({ message }) => action(message)); +}; diff --git a/packages/core-services/src/index.ts b/packages/core-services/src/index.ts index d3cc778e5a22..46697b7e5c09 100644 --- a/packages/core-services/src/index.ts +++ b/packages/core-services/src/index.ts @@ -1,6 +1,7 @@ import { proxify, proxifyWithWait } from './lib/proxify'; import type { IAccount, ILoginResult } from './types/IAccount'; import type { IAnalyticsService } from './types/IAnalyticsService'; +import { IApiService } from './types/IApiService'; import type { IAppsEngineService } from './types/IAppsEngineService'; import type { IAuthorization, RoomAccessValidator } from './types/IAuthorization'; import type { IAuthorizationLivechat } from './types/IAuthorizationLivechat'; @@ -49,7 +50,8 @@ import type { IVoipService } from './types/IVoipService'; export { asyncLocalStorage } from './lib/asyncLocalStorage'; export { MeteorError, isMeteorError } from './MeteorError'; export { api } from './api'; -export { EventSignatures } from './Events'; +export { EventSignatures } from './events/Events'; +export { listenToMessageSentEvent, dbWatchersDisabled } from './events/listeners'; export { LocalBroker } from './LocalBroker'; export { IBroker, IBrokerNode, BaseMetricOptions, IServiceMetrics } from './types/IBroker'; @@ -63,6 +65,7 @@ export { FindVoipRoomsParams, IAccount, IAnalyticsService, + IApiService, IAppsEngineService, IAuthorization, IAuthorizationLivechat, diff --git a/packages/core-services/src/lib/Api.ts b/packages/core-services/src/lib/Api.ts index f0b5e67594c2..61a58301a0cc 100644 --- a/packages/core-services/src/lib/Api.ts +++ b/packages/core-services/src/lib/Api.ts @@ -1,4 +1,4 @@ -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import type { IApiService } from '../types/IApiService'; import type { IBroker, IBrokerNode } from '../types/IBroker'; import type { IServiceClass } from '../types/ServiceClass'; diff --git a/packages/core-services/src/types/IApiService.ts b/packages/core-services/src/types/IApiService.ts index 9361eb6fce9d..ef88d57713bc 100644 --- a/packages/core-services/src/types/IApiService.ts +++ b/packages/core-services/src/types/IApiService.ts @@ -1,4 +1,4 @@ -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import type { IBroker, IBrokerNode } from './IBroker'; import type { IServiceClass } from './ServiceClass'; diff --git a/packages/core-services/src/types/IBroker.ts b/packages/core-services/src/types/IBroker.ts index 4bd48afef0ff..cd1e0a3ded19 100644 --- a/packages/core-services/src/types/IBroker.ts +++ b/packages/core-services/src/types/IBroker.ts @@ -1,4 +1,4 @@ -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import type { IServiceClass } from './ServiceClass'; export interface IBrokerNode { diff --git a/packages/core-services/src/types/ServiceClass.ts b/packages/core-services/src/types/ServiceClass.ts index 47f23e757a1b..5e6b202a103d 100644 --- a/packages/core-services/src/types/ServiceClass.ts +++ b/packages/core-services/src/types/ServiceClass.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events'; -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import { asyncLocalStorage } from '../lib/asyncLocalStorage'; import type { IApiService } from './IApiService'; import type { IBroker, IBrokerNode } from './IBroker'; diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index 8367f3898064..fdbaa2258da4 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/core-typings +## 6.5.0-rc.7 + +## 6.5.0-rc.6 + +## 6.5.0-rc.5 + +## 6.5.0-rc.4 + +## 6.5.0-rc.3 + ## 6.5.0-rc.2 ## 6.5.0-rc.1 @@ -32,6 +42,12 @@ feat: Limit endpoints on MAC limit reached - dea1fe9191: feat: Disable and annonimize visitors instead of removing +## 6.4.8 + +## 6.4.7 + +## 6.4.6 + ## 6.4.5 ## 6.4.4 diff --git a/packages/core-typings/src/INotification.ts b/packages/core-typings/src/INotification.ts index 46c3341eea23..11746e01ddd2 100644 --- a/packages/core-typings/src/INotification.ts +++ b/packages/core-typings/src/INotification.ts @@ -51,6 +51,7 @@ export interface INotification { export interface INotificationDesktop { title: string; text: string; + icon?: string; duration?: number; payload: { _id: IMessage['_id']; diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index 30e414720728..df345293e9ee 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,40 @@ # @rocket.chat/cron +## 0.0.17-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.0.17-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.0.17-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.0.17-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.0.17-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + ## 0.0.17-rc.2 ### Patch Changes @@ -28,6 +63,27 @@ - @rocket.chat/core-typings@6.5.0-rc.0 - @rocket.chat/models@0.0.21-rc.0 +## 0.0.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/models@0.0.23 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/models@0.0.22 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/models@0.0.21 + ## 0.0.16 ### Patch Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index 0c752fa4c024..70a436aff65f 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,11 +1,11 @@ { "name": "@rocket.chat/cron", - "version": "0.0.17-rc.2", + "version": "0.0.20-rc.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 9b0adef2d80e..b33ec1369392 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -4,8 +4,8 @@ "description": "Rocket.Chat's JS/TS ESLint config", "dependencies": { "@babel/core": "^7.20.7", - "@babel/eslint-parser": "~7.22.9", - "@types/eslint": "~8.44.0", + "@babel/eslint-parser": "~7.22.15", + "@types/eslint": "~8.44.6", "@types/prettier": "^2.6.3", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", @@ -13,7 +13,7 @@ "eslint-config-prettier": "~8.8.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-import": "~2.26.0", - "eslint-plugin-jest": "~27.2.2", + "eslint-plugin-jest": "~27.2.3", "eslint-plugin-prettier": "~4.2.1", "prettier": "~2.8.8" }, diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index e64dba78d9ff..ea42640d97a1 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,45 @@ # Change Log +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.7 +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/ui-video-conf@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.6 +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/ui-video-conf@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.5 +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/ui-video-conf@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.4 +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/ui-video-conf@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.3 +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/ui-video-conf@3.0.0-rc.3 + ## 3.0.0-rc.2 ### Patch Changes @@ -26,6 +66,30 @@ - @rocket.chat/gazzodown@3.0.0-rc.0 - @rocket.chat/ui-video-conf@3.0.0-rc.0 +## 2.0.8 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.8 +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/ui-video-conf@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.7 +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/ui-video-conf@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.6 +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/ui-video-conf@2.0.6 + ## 2.0.5 ### Patch Changes diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 34348989649e..090477afdf9f 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "3.0.0-rc.2", + "version": "3.0.0-rc.7", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -47,18 +47,18 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-contexts": "3.0.0-rc.2", + "@rocket.chat/ui-contexts": "3.0.0-rc.7", "@rocket.chat/ui-kit": "*", - "@rocket.chat/ui-video-conf": "3.0.0-rc.2", + "@rocket.chat/ui-video-conf": "3.0.0-rc.7", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" }, "devDependencies": { - "@babel/core": "~7.22.10", - "@babel/preset-env": "~7.22.10", - "@babel/preset-react": "~7.22.5", - "@babel/preset-typescript": "~7.22.5", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-react": "~7.22.15", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/apps-engine": "1.41.0-alpha.290", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/fuselage": "^0.37.1", @@ -78,10 +78,10 @@ "@storybook/source-loader": "~6.5.16", "@storybook/theming": "~6.5.16", "@tanstack/react-query": "^4.16.1", - "@types/babel__core": "^7", - "@types/babel__preset-env": "^7", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", + "@types/babel__core": "^7.20.3", + "@types/babel__preset-env": "^7.9.4", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", "babel-loader": "~8.2.5", "cross-env": "^7.0.3", "eslint": "~8.45.0", @@ -90,6 +90,7 @@ "prettier": "~2.8.8", "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "^17.0.2", + "react-i18next": "~13.2.2", "rimraf": "^3.0.2", "storybook-dark-mode": "~3.0.1", "tslib": "^2.5.3", diff --git a/packages/fuselage-ui-kit/src/contexts/AppIdContext.tsx b/packages/fuselage-ui-kit/src/contexts/AppIdContext.tsx new file mode 100644 index 000000000000..717c5fa9a58a --- /dev/null +++ b/packages/fuselage-ui-kit/src/contexts/AppIdContext.tsx @@ -0,0 +1,30 @@ +import type { ReactNode } from 'react'; +import { createContext, useContext, useDebugValue } from 'react'; + +import { UiKitContext } from './UiKitContext'; + +const AppIdContext = createContext(undefined); + +type AppIdProviderProps = { + children: ReactNode; + appId?: string; +}; + +export const AppIdProvider = ({ children, appId }: AppIdProviderProps) => { + if (!appId) { + return <>{children}; + } + + return ( + {children} + ); +}; + +export const useAppId = () => { + const outerAppId = useContext(UiKitContext).appId ?? 'core'; + const appId = useContext(AppIdContext) ?? outerAppId; + + useDebugValue(appId); + + return appId; +}; diff --git a/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx b/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx index a0357c303e1f..c2744ce47571 100644 --- a/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx @@ -2,19 +2,19 @@ import { InputBox } from '@rocket.chat/fuselage'; import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type DatePickerElementProps = BlockProps; const DatePickerElement = ({ block, context, - surfaceRenderer, }: DatePickerElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); const { actionId, placeholder } = block; + const fromTextObjectToString = useStringFromTextObject(); return ( ); diff --git a/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx b/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx index 25e552772604..6085c2831128 100644 --- a/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx @@ -1,32 +1,17 @@ import { Markup } from '@rocket.chat/gazzodown'; import { parse } from '@rocket.chat/message-parser'; -import { useTranslation } from '@rocket.chat/ui-contexts'; import type { TextObject } from '@rocket.chat/ui-kit'; -import { useContext } from 'react'; -import { UiKitContext } from '../contexts/UiKitContext'; +import { useAppTranslation } from '../hooks/useAppTranslation'; const MarkdownTextElement = ({ textObject }: { textObject: TextObject }) => { - const t = useTranslation() as ( - key: string, - args: { [key: string]: string | number } - ) => string; + const { t } = useAppTranslation(); - const { appId } = useContext(UiKitContext); + const text = textObject.i18n + ? t(textObject.i18n.key, { ...textObject.i18n.args }) + : textObject.text; - const { i18n } = textObject; - - if (i18n) { - return ( - - ); - } - - return ; + return ; }; export default MarkdownTextElement; diff --git a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx index 3649fd2cd172..a1948a921f49 100644 --- a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx @@ -4,26 +4,26 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { memo, useCallback, useMemo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type MultiStaticSelectElementProps = BlockProps; const MultiStaticSelectElement = ({ block, context, - surfaceRenderer, }: MultiStaticSelectElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); const options = useMemo( () => - block.options.map(({ value, text }, i) => [ + block.options.map(({ value, text }) => [ value, - fromTextObjectToString(surfaceRenderer, text, i) ?? '', + fromTextObjectToString(text) ?? '', ]), - [block.options, surfaceRenderer] + [block.options, fromTextObjectToString] ); const handleChange = useCallback( @@ -39,11 +39,7 @@ const MultiStaticSelectElement = ({ disabled={loading} error={error} options={options} - placeholder={fromTextObjectToString( - surfaceRenderer, - block.placeholder, - 0 - )} + placeholder={fromTextObjectToString(block.placeholder)} onChange={handleChange} /> ); diff --git a/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx b/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx index c239271f1c70..1af8fe18394c 100644 --- a/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx @@ -9,18 +9,18 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { useRef, useCallback, useMemo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type OverflowElementProps = BlockProps; const OverflowElement = ({ block, context, - surfaceRenderer, }: OverflowElementProps): ReactElement => { const [{ loading }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); const fireChange = useCallback( ([value]: [UiKit.ActionOf, string]) => @@ -30,15 +30,15 @@ const OverflowElement = ({ const options = useMemo( () => - block.options.map(({ value, text, url }: UiKit.Option, i) => [ + block.options.map(({ value, text, url }) => [ value, - fromTextObjectToString(surfaceRenderer, text, i) ?? '', + fromTextObjectToString(text) ?? '', undefined, undefined, undefined, url, ]), - [block.options, surfaceRenderer] + [block.options, fromTextObjectToString] ); const [cursor, handleKeyDown, handleKeyUp, reset, [visible, hide, show]] = diff --git a/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx b/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx index 7b5510645ffe..df3aabb356ff 100644 --- a/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx @@ -1,23 +1,15 @@ -import { useTranslation } from '@rocket.chat/ui-contexts'; import type { TextObject } from '@rocket.chat/ui-kit'; -import { useContext } from 'react'; -import { UiKitContext } from '../contexts/UiKitContext'; +import { useAppTranslation } from '../hooks/useAppTranslation'; const PlainTextElement = ({ textObject }: { textObject: TextObject }) => { - const t = useTranslation() as ( - key: string, - args: { [key: string]: string | number } - ) => string; + const { t } = useAppTranslation(); - const { appId } = useContext(UiKitContext); - const { i18n } = textObject; + const text = textObject.i18n + ? t(textObject.i18n.key, { ...textObject.i18n.args }) + : textObject.text; - if (i18n) { - return <>{t(`apps-${appId}-${i18n.key}`, { ...i18n.args })}; - } - - return <>{textObject.text}; + return <>{text}; }; export default PlainTextElement; diff --git a/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx b/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx index 698d4ded25f8..013c0985b832 100644 --- a/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx @@ -3,18 +3,18 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { memo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type PlainTextInputElementProps = BlockProps; const PlainTextInputElement = ({ block, context, - surfaceRenderer, }: PlainTextInputElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); if (block.multiline) { return ( @@ -26,11 +26,7 @@ const PlainTextInputElement = ({ error={error} value={value} onChange={action} - placeholder={ - block.placeholder - ? fromTextObjectToString(surfaceRenderer, block.placeholder, 0) - : undefined - } + placeholder={fromTextObjectToString(block.placeholder)} /> ); } @@ -43,11 +39,7 @@ const PlainTextInputElement = ({ error={error} value={value} onChange={action} - placeholder={ - block.placeholder - ? fromTextObjectToString(surfaceRenderer, block.placeholder, 0) - : undefined - } + placeholder={fromTextObjectToString(block.placeholder)} /> ); }; diff --git a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx index 781e25ad831c..c68a7f067a8d 100644 --- a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx @@ -3,26 +3,26 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { memo, useCallback, useMemo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type StaticSelectElementProps = BlockProps; const StaticSelectElement = ({ block, context, - surfaceRenderer, }: StaticSelectElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); const options = useMemo<[string, string][]>( () => - block.options.map((option, i) => [ + block.options.map((option) => [ option.value, - fromTextObjectToString(surfaceRenderer, option.text, i) ?? '', + fromTextObjectToString(option.text) ?? '', ]), - [block.options, surfaceRenderer] + [block.options, fromTextObjectToString] ); const handleChange = useCallback( @@ -38,11 +38,7 @@ const StaticSelectElement = ({ disabled={loading} error={error} options={options} - placeholder={fromTextObjectToString( - surfaceRenderer, - block.placeholder, - 0 - )} + placeholder={fromTextObjectToString(block.placeholder)} onChange={handleChange} /> ); diff --git a/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx b/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx index 9814b412e6e3..b0bda777cd3e 100644 --- a/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx @@ -2,19 +2,19 @@ import { InputBox } from '@rocket.chat/fuselage'; import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type TimePickerElementProps = BlockProps; const TimePickerElement = ({ block, context, - surfaceRenderer, }: TimePickerElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); const { actionId, placeholder } = block; + const fromTextObjectToString = useStringFromTextObject(); return ( ); diff --git a/packages/fuselage-ui-kit/src/extractInitialStateFromLayout.ts b/packages/fuselage-ui-kit/src/extractInitialStateFromLayout.ts deleted file mode 100644 index 10b6790d976a..000000000000 --- a/packages/fuselage-ui-kit/src/extractInitialStateFromLayout.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -type Value = { value: unknown; blockId?: string }; - -type LayoutBlockWithElement = Extract< - UiKit.LayoutBlock, - { element: UiKit.BlockElement | UiKit.TextObject } ->; -type LayoutBlockWithElements = Extract< - UiKit.LayoutBlock, - { elements: readonly (UiKit.BlockElement | UiKit.TextObject)[] } ->; - -const hasElement = ( - block: UiKit.LayoutBlock -): block is LayoutBlockWithElement => 'element' in block; - -const hasElements = ( - block: UiKit.LayoutBlock -): block is LayoutBlockWithElements => - 'elements' in block && Array.isArray(block.elements); - -const isActionableElement = ( - element: UiKit.BlockElement | UiKit.TextObject -): element is UiKit.ActionableElement => - 'actionId' in element && typeof element.actionId === 'string'; - -const hasInitialValue = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialValue: number | string } => - 'initialValue' in element; - -const hasInitialTime = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialTime: string } => - 'initialTime' in element; - -const hasInitialDate = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialDate: string } => - 'initialDate' in element; - -const hasInitialOption = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialOption: UiKit.Option } => - 'initialOption' in element; - -const hasInitialOptions = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialOptions: UiKit.Option[] } => - 'initialOptions' in element; - -const getInitialValue = (element: UiKit.ActionableElement) => - (hasInitialValue(element) && element.initialValue) || - (hasInitialTime(element) && element.initialTime) || - (hasInitialDate(element) && element.initialDate) || - (hasInitialOption(element) && element.initialOption.value) || - (hasInitialOptions(element) && - element.initialOptions.map((option) => option.value)) || - undefined; - -const reduceInitialValuesFromLayoutBlock = ( - state: { [actionId: string]: Value }, - block: UiKit.LayoutBlock -) => { - if (hasElement(block)) { - if (isActionableElement(block.element)) { - state[block.element.actionId] = { - value: getInitialValue(block.element), - blockId: block.blockId, - }; - } - } - - if (hasElements(block)) { - for (const element of block.elements) { - if (isActionableElement(element)) { - state[element.actionId] = { - value: getInitialValue(element), - blockId: block.blockId, - }; - } - } - } - - return state; -}; - -export const extractInitialStateFromLayout = (blocks: UiKit.LayoutBlock[]) => - blocks.reduce(reduceInitialValuesFromLayoutBlock, {}); diff --git a/packages/fuselage-ui-kit/src/hooks/useAppTranslation.ts b/packages/fuselage-ui-kit/src/hooks/useAppTranslation.ts new file mode 100644 index 000000000000..c29cf0953386 --- /dev/null +++ b/packages/fuselage-ui-kit/src/hooks/useAppTranslation.ts @@ -0,0 +1,13 @@ +import { useDebugValue } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { useAppId } from '../contexts/AppIdContext'; + +export const useAppTranslation = () => { + const appId = useAppId(); + const appNs = `app-${appId}`; + + useDebugValue(appNs); + + return useTranslation(appNs); +}; diff --git a/packages/fuselage-ui-kit/src/hooks/useStringFromTextObject.ts b/packages/fuselage-ui-kit/src/hooks/useStringFromTextObject.ts new file mode 100644 index 000000000000..72908da48eca --- /dev/null +++ b/packages/fuselage-ui-kit/src/hooks/useStringFromTextObject.ts @@ -0,0 +1,21 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; +import { useCallback } from 'react'; + +import { useAppTranslation } from './useAppTranslation'; + +export const useStringFromTextObject = () => { + const { t } = useAppTranslation(); + + return useCallback( + (textObject: UiKit.TextObject | undefined): string | undefined => { + if (!textObject) { + return undefined; + } + + return textObject.i18n + ? t?.(textObject.i18n.key, { ...textObject.i18n.args }) + : textObject.text; + }, + [t] + ); +}; diff --git a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts index 0a736dcc1c6c..4468f4fd86a7 100644 --- a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts +++ b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts @@ -3,40 +3,7 @@ import * as UiKit from '@rocket.chat/ui-kit'; import { useContext, useMemo, useState } from 'react'; import { UiKitContext } from '../contexts/UiKitContext'; - -const hasInitialValue = ( - element: TElement -): element is TElement & { initialValue: number | string } => - 'initialValue' in element; - -const hasInitialTime = ( - element: TElement -): element is TElement & { initialTime: string } => 'initialTime' in element; - -const hasInitialDate = ( - element: TElement -): element is TElement & { initialDate: string } => 'initialDate' in element; - -const hasInitialOption = ( - element: TElement -): element is TElement & { initialOption: UiKit.Option } => - 'initialOption' in element; - -const hasInitialOptions = ( - element: TElement -): element is TElement & { initialOptions: UiKit.Option[] } => - 'initialOptions' in element; - -const getInitialValue = ( - element: TElement -) => - (hasInitialValue(element) && element.initialValue) || - (hasInitialTime(element) && element.initialTime) || - (hasInitialDate(element) && element.initialDate) || - (hasInitialOption(element) && element.initialOption.value) || - (hasInitialOptions(element) && - element.initialOptions.map((option) => option.value)) || - undefined; +import { getInitialValue } from '../utils/getInitialValue'; const getElementValueFromState = ( actionId: string, diff --git a/packages/fuselage-ui-kit/src/index.ts b/packages/fuselage-ui-kit/src/index.ts index 9db1f2097835..d2d31f0d2ace 100644 --- a/packages/fuselage-ui-kit/src/index.ts +++ b/packages/fuselage-ui-kit/src/index.ts @@ -2,4 +2,4 @@ export * from './hooks/useUiKitState'; export * from './contexts/UiKitContext'; export * from './surfaces'; export { UiKitComponent } from './utils/UiKitComponent'; -export { extractInitialStateFromLayout } from './extractInitialStateFromLayout'; +export { extractInitialStateFromLayout } from './utils/extractInitialStateFromLayout'; diff --git a/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx index 5e4af0e7caeb..48b678365a7f 100644 --- a/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx +++ b/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx @@ -2,6 +2,7 @@ import * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import TabNavigationBlock from '../blocks/TabNavigationBlock'; +import { AppIdProvider } from '../contexts/AppIdContext'; import { FuselageSurfaceRenderer, renderTextObject, @@ -33,13 +34,14 @@ export class ContextualBarSurfaceRenderer extends FuselageSurfaceRenderer { ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } diff --git a/packages/fuselage-ui-kit/src/surfaces/MessageSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageMessageSurfaceRenderer.tsx similarity index 73% rename from packages/fuselage-ui-kit/src/surfaces/MessageSurfaceRenderer.tsx rename to packages/fuselage-ui-kit/src/surfaces/FuselageMessageSurfaceRenderer.tsx index 4ca4682123ff..610dd1f408c5 100644 --- a/packages/fuselage-ui-kit/src/surfaces/MessageSurfaceRenderer.tsx +++ b/packages/fuselage-ui-kit/src/surfaces/FuselageMessageSurfaceRenderer.tsx @@ -2,6 +2,7 @@ import * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import VideoConferenceBlock from '../blocks/VideoConferenceBlock/VideoConferenceBlock'; +import { AppIdProvider } from '../contexts/AppIdContext'; import { FuselageSurfaceRenderer, renderTextObject, @@ -32,13 +33,14 @@ export class FuselageMessageSurfaceRenderer extends FuselageSurfaceRenderer { ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } diff --git a/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx index 348aafd7c1ee..a2cbdb62d16c 100644 --- a/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx +++ b/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx @@ -9,6 +9,7 @@ import ImageBlock from '../blocks/ImageBlock'; import InputBlock from '../blocks/InputBlock'; import PreviewBlock from '../blocks/PreviewBlock'; import SectionBlock from '../blocks/SectionBlock'; +import { AppIdProvider } from '../contexts/AppIdContext'; import ButtonElement from '../elements/ButtonElement'; import CheckboxElement from '../elements/CheckboxElement'; import DatePickerElement from '../elements/DatePickerElement'; @@ -58,6 +59,13 @@ export const renderTextObject = ( } }; +const isImageBlock = ( + _elementOrBlock: UiKit.ImageBlock | UiKit.ImageElement, + context: UiKit.BlockContext +): _elementOrBlock is UiKit.ImageBlock => { + return context === UiKit.BlockContext.BLOCK; +}; + type FuselageSurfaceRendererProps = ConstructorParameters< typeof UiKit.SurfaceRenderer >[0]; @@ -120,13 +128,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -159,13 +168,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -179,13 +189,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -197,15 +208,16 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -227,13 +239,17 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + appId={block.appId} + > + + ); } @@ -247,13 +263,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -270,13 +287,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -290,13 +308,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -310,13 +329,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -330,13 +350,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -350,13 +371,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -370,13 +392,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -390,13 +413,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -410,13 +434,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -430,13 +455,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -450,13 +476,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -467,13 +494,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } @@ -490,13 +518,14 @@ export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer + + + ); } } diff --git a/packages/fuselage-ui-kit/src/surfaces/index.ts b/packages/fuselage-ui-kit/src/surfaces/index.ts index 133ec5dc714a..8b92a4d646a2 100644 --- a/packages/fuselage-ui-kit/src/surfaces/index.ts +++ b/packages/fuselage-ui-kit/src/surfaces/index.ts @@ -2,8 +2,8 @@ import BannerSurface from './BannerSurface'; import { BannerSurfaceRenderer } from './BannerSurfaceRenderer'; import ContextualBarSurface from './ContextualBarSurface'; import { ContextualBarSurfaceRenderer } from './ContextualBarSurfaceRenderer'; +import { FuselageMessageSurfaceRenderer } from './FuselageMessageSurfaceRenderer'; import MessageSurface from './MessageSurface'; -import { FuselageMessageSurfaceRenderer } from './MessageSurfaceRenderer'; import ModalSurface from './ModalSurface'; import { ModalSurfaceRenderer } from './ModalSurfaceRenderer'; import { createSurfaceRenderer } from './createSurfaceRenderer'; diff --git a/packages/fuselage-ui-kit/src/utils/extractInitialStateFromLayout.ts b/packages/fuselage-ui-kit/src/utils/extractInitialStateFromLayout.ts new file mode 100644 index 000000000000..0fc66c7f72ab --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/extractInitialStateFromLayout.ts @@ -0,0 +1,40 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +import { type Value, getInitialValue } from './getInitialValue'; +import { hasElement } from './hasElement'; +import { hasElements } from './hasElements'; + +const isActionableElement = ( + element: UiKit.BlockElement | UiKit.TextObject +): element is UiKit.ActionableElement => + 'actionId' in element && typeof element.actionId === 'string'; + +const reduceInitialValuesFromLayoutBlock = ( + state: { [actionId: string]: Value }, + block: UiKit.LayoutBlock +) => { + if (hasElement(block)) { + if (isActionableElement(block.element)) { + state[block.element.actionId] = { + value: getInitialValue(block.element), + blockId: block.blockId, + }; + } + } + + if (hasElements(block)) { + for (const element of block.elements) { + if (isActionableElement(element)) { + state[element.actionId] = { + value: getInitialValue(element), + blockId: block.blockId, + }; + } + } + } + + return state; +}; + +export const extractInitialStateFromLayout = (blocks: UiKit.LayoutBlock[]) => + blocks.reduce(reduceInitialValuesFromLayoutBlock, {}); diff --git a/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts b/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts deleted file mode 100644 index adc624986c7e..000000000000 --- a/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import { renderToStaticMarkup } from 'react-dom/server'; - -export const fromTextObjectToString = ( - surfaceRenderer: UiKit.SurfaceRenderer, - textObject: UiKit.TextObject, - index: number -): string | undefined => { - const element = surfaceRenderer.renderTextObject( - textObject, - index, - UiKit.BlockContext.NONE - ); - - if (!element) { - return undefined; - } - - return renderToStaticMarkup(element); -}; diff --git a/packages/fuselage-ui-kit/src/utils/getInitialValue.ts b/packages/fuselage-ui-kit/src/utils/getInitialValue.ts new file mode 100644 index 000000000000..7e75d4d5231c --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/getInitialValue.ts @@ -0,0 +1,37 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +export type Value = { value: unknown; blockId?: string }; + +const hasInitialValue = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialValue: number | string } => + 'initialValue' in element; + +const hasInitialTime = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialTime: string } => + 'initialTime' in element; + +const hasInitialDate = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialDate: string } => + 'initialDate' in element; + +const hasInitialOption = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialOption: UiKit.Option } => + 'initialOption' in element; + +const hasInitialOptions = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialOptions: UiKit.Option[] } => + 'initialOptions' in element; + +export const getInitialValue = (element: UiKit.ActionableElement) => + (hasInitialValue(element) && element.initialValue) || + (hasInitialTime(element) && element.initialTime) || + (hasInitialDate(element) && element.initialDate) || + (hasInitialOption(element) && element.initialOption.value) || + (hasInitialOptions(element) && + element.initialOptions.map((option) => option.value)) || + undefined; diff --git a/packages/fuselage-ui-kit/src/utils/hasElement.ts b/packages/fuselage-ui-kit/src/utils/hasElement.ts new file mode 100644 index 000000000000..42484addf444 --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/hasElement.ts @@ -0,0 +1,10 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +type LayoutBlockWithElement = Extract< + UiKit.LayoutBlock, + { element: UiKit.BlockElement | UiKit.TextObject } +>; + +export const hasElement = ( + block: UiKit.LayoutBlock +): block is LayoutBlockWithElement => 'element' in block; diff --git a/packages/fuselage-ui-kit/src/utils/hasElements.ts b/packages/fuselage-ui-kit/src/utils/hasElements.ts new file mode 100644 index 000000000000..9df00cda1768 --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/hasElements.ts @@ -0,0 +1,11 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +type LayoutBlockWithElements = Extract< + UiKit.LayoutBlock, + { elements: readonly (UiKit.BlockElement | UiKit.TextObject)[] } +>; + +export const hasElements = ( + block: UiKit.LayoutBlock +): block is LayoutBlockWithElements => + 'elements' in block && Array.isArray(block.elements); diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index b4585e6f5253..db795a3acad7 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,45 @@ # @rocket.chat/gazzodown +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/ui-client@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/ui-client@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/ui-client@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/ui-client@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/ui-client@3.0.0-rc.3 + ## 3.0.0-rc.2 ### Patch Changes @@ -33,6 +73,30 @@ - @rocket.chat/core-typings@6.5.0-rc.0 - @rocket.chat/ui-client@3.0.0-rc.0 +## 2.0.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/ui-client@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/ui-client@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/ui-client@2.0.6 + ## 2.0.5 ### Patch Changes diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index 929129d99722..dfd8a632814a 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,9 +1,9 @@ { "name": "@rocket.chat/gazzodown", - "version": "3.0.0-rc.2", + "version": "3.0.0-rc.7", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", + "@babel/core": "~7.22.20", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "next", "@rocket.chat/fuselage": "^0.37.1", @@ -21,15 +21,15 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "~12.1.5", - "@types/jest": "~29.5.3", - "@types/katex": "~0.16.0", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", - "@types/testing-library__jest-dom": "~5.14.6", + "@types/jest": "~29.5.7", + "@types/katex": "~0.16.5", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", + "@types/testing-library__jest-dom": "~5.14.9", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "babel-loader": "^8.3.0", @@ -37,11 +37,11 @@ "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", + "eslint-plugin-storybook": "~0.6.15", "identity-obj-proxy": "^3.0.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", - "katex": "~0.16.7", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", + "katex": "~0.16.9", "outdent": "^0.8.0", "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "~17.0.2", @@ -71,8 +71,8 @@ "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "3.0.0-rc.2", - "@rocket.chat/ui-contexts": "3.0.0-rc.2", + "@rocket.chat/ui-client": "3.0.0-rc.7", + "@rocket.chat/ui-contexts": "3.0.0-rc.7", "katex": "*", "react": "*" }, diff --git a/packages/i18n/package.json b/packages/i18n/package.json index b01528df5766..86d60ed24c3c 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -3,11 +3,11 @@ "version": "0.0.3-rc.0", "private": true, "devDependencies": { - "@babel/core": "~7.22.10", - "@babel/preset-env": "~7.22.10", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "babel-jest": "^29.5.0", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "tsup": "^6.7.0", "typescript": "~5.2.2" diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index e77152b333aa..45593a97f303 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/instance-status +## 0.0.21-rc.7 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.7 + +## 0.0.21-rc.6 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.6 + +## 0.0.21-rc.5 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.5 + +## 0.0.21-rc.4 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.4 + +## 0.0.21-rc.3 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.3 + ## 0.0.21-rc.2 ### Patch Changes @@ -18,6 +48,24 @@ - @rocket.chat/models@0.0.21-rc.0 +## 0.0.23 + +### Patch Changes + +- @rocket.chat/models@0.0.23 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/models@0.0.22 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/models@0.0.21 + ## 0.0.20 ### Patch Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index 83652ac190b8..eb512a50dffe 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/instance-status", - "version": "0.0.21-rc.2", + "version": "0.0.24-rc.0", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/jwt/package.json b/packages/jwt/package.json index d505a67e12ba..be389ab3e046 100644 --- a/packages/jwt/package.json +++ b/packages/jwt/package.json @@ -3,9 +3,9 @@ "version": "0.1.0-rc.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "^29.1.1", "typescript": "~5.2.2" }, diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index c16e970014e6..abe2212eb7b7 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/livechat Change Log +## 1.14.6-rc.7 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.7 + +## 1.14.6-rc.6 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.6 + +## 1.14.6-rc.5 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.5 + +## 1.14.6-rc.4 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.4 + +## 1.14.6-rc.3 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.3 + ## 1.14.6-rc.2 ### Patch Changes @@ -19,6 +49,25 @@ - Updated dependencies [c2f337664e] - @rocket.chat/gazzodown@3.0.0-rc.0 +## 1.14.8 + +### Patch Changes + +- d1c8e7ac13: Fixes reactivity issue with `registerGuest` Widget API Call, as well as other similar endpoint + - @rocket.chat/gazzodown@2.0.8 + +## 1.14.7 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.7 + +## 1.14.6 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.6 + ## 1.14.5 ### Patch Changes diff --git a/packages/livechat/package.json b/packages/livechat/package.json index 32d499c0fd32..0cf288930699 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.14.6-rc.2", + "version": "1.14.9-rc.0", "files": [ "/build" ], @@ -24,9 +24,9 @@ "typecheck": "tsc -p tsconfig.typecheck.json" }, "devDependencies": { - "@babel/eslint-parser": "~7.22.9", - "@babel/preset-env": "~7.22.9", - "@babel/preset-typescript": "~7.22.5", + "@babel/eslint-parser": "~7.22.15", + "@babel/preset-env": "~7.22.20", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/ddp-client": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", @@ -36,10 +36,10 @@ "@storybook/addon-postcss": "~2.0.0", "@storybook/preact": "~6.5.16", "@storybook/theming": "~6.5.16", - "@types/crypto-js": "~4.1.1", + "@types/crypto-js": "~4.1.3", "@types/mini-css-extract-plugin": "~1.4.3", "@types/webpack": "^5.28.4", - "@types/webpack-bundle-analyzer": "^4", + "@types/webpack-bundle-analyzer": "^4.6.2", "@types/webpack-dev-server": "~4.7.2", "@types/whatwg-fetch": "~0.0.33", "@typescript-eslint/eslint-plugin": "~5.60.1", @@ -69,7 +69,7 @@ "postcss-ie11-supports": "^0.1.3", "postcss-loader": "^3.0.0", "postcss-logical": "^4.0.2", - "postcss-scss": "^4.0.6", + "postcss-scss": "^4.0.9", "postcss-selector-not": "^4.0.1", "react-dom": "~17.0.2", "rimraf": "^3.0.2", @@ -84,7 +84,7 @@ "typescript": "~5.2.2", "url-loader": "^4.1.1", "webpack": "^5.89.0", - "webpack-bundle-analyzer": "^4.9.0", + "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "~4.13.3" }, @@ -102,7 +102,7 @@ "date-fns": "^2.15.0", "emoji-mart": "^3.0.1", "history": "~5.3.0", - "i18next": "~23.4.5", + "i18next": "~23.4.9", "markdown-it": "^11.0.1", "mem": "^6.1.1", "mitt": "^2.1.0", @@ -110,8 +110,8 @@ "preact-router": "^3.2.1", "query-string": "^7.1.3", "react-hook-form": "~7.45.4", - "react-i18next": "~13.2.1", - "whatwg-fetch": "^3.6.2" + "react-i18next": "~13.2.2", + "whatwg-fetch": "^3.6.19" }, "browserslist": [ "last 2 versions", diff --git a/packages/livechat/src/lib/hooks.js b/packages/livechat/src/lib/hooks.js index 795358312173..311cf0b2a00b 100644 --- a/packages/livechat/src/lib/hooks.js +++ b/packages/livechat/src/lib/hooks.js @@ -14,6 +14,7 @@ const createOrUpdateGuest = async (guest) => { token && (await store.setState({ token })); const { visitor: user } = await Livechat.grantVisitor({ visitor: { ...guest } }); store.setState({ user }); + await loadConfig(); }; const updateIframeGuestData = (data) => { @@ -141,8 +142,7 @@ const api = { if (token === localToken) { return; } - createOrUpdateGuest({ token }); - await loadConfig(); + await createOrUpdateGuest({ token }); }, setGuestName(name) { @@ -153,8 +153,8 @@ const api = { updateIframeGuestData({ email }); }, - registerGuest(data = {}) { - if (typeof data !== 'object') { + async registerGuest(data) { + if (!data || typeof data !== 'object') { return; } @@ -166,7 +166,9 @@ const api = { api.setDepartment(data.department); } - createOrUpdateGuest(data); + Livechat.unsubscribeAll(); + + await createOrUpdateGuest(data); }, async setLanguage(language) { diff --git a/packages/log-format/package.json b/packages/log-format/package.json index dc21d5a87dfe..56cfd2d4e4ac 100644 --- a/packages/log-format/package.json +++ b/packages/log-format/package.json @@ -4,10 +4,10 @@ "private": true, "devDependencies": { "@types/chalk": "^2.2.0", - "@types/ejson": "^2.2.0", - "@types/jest": "~29.5.3", + "@types/ejson": "^2.2.1", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/logger/package.json b/packages/logger/package.json index 48968b3d5095..a1e83ea24f3b 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -3,9 +3,9 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index 3bf2c2b78581..4c173f5de311 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -4,16 +4,16 @@ "private": true, "dependencies": { "@rocket.chat/i18n": "workspace:~", - "i18next": "~23.4.5", - "react-i18next": "~13.2.1" + "i18next": "~23.4.9", + "react-i18next": "~13.2.2" }, "devDependencies": { "@rocket.chat/ui-contexts": "workspace:*", "@storybook/react": "~6.5.16", "@tanstack/react-query": "^4.16.1", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "react": "~17.0.2", "ts-jest": "~29.0.5", "typescript": "~5.2.2" diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx index cc9de585d4de..df2c69d99b91 100644 --- a/packages/mock-providers/src/MockedAppRootBuilder.tsx +++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx @@ -438,6 +438,8 @@ export class MockedAppRootBuilder { on: () => undefined, openView: () => undefined, disposeView: () => undefined, + notifyBusy: () => undefined, + notifyIdle: () => undefined, }} > {/* diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md index 04193bbb1536..12ed3645d773 100644 --- a/packages/model-typings/CHANGELOG.md +++ b/packages/model-typings/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/model-typings +## 0.2.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 + +## 0.2.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 + +## 0.2.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 + +## 0.2.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 + +## 0.2.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 + ## 0.2.0-rc.2 ### Patch Changes @@ -37,6 +67,24 @@ - Updated dependencies [dea1fe9191] - @rocket.chat/core-typings@6.5.0-rc.0 +## 0.1.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 + +## 0.1.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 + +## 0.1.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 + ## 0.1.5 ### Patch Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 79955c437a3a..8d92ab5ae540 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,12 +1,12 @@ { "name": "@rocket.chat/model-typings", - "version": "0.2.0-rc.2", + "version": "0.2.0-rc.7", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", - "@types/node-rsa": "^1.1.1", + "@types/jest": "~29.5.7", + "@types/node-rsa": "^1.1.3", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "mongodb": "^4.17.1", "ts-jest": "~29.0.5", "typescript": "~5.2.2" diff --git a/packages/model-typings/src/models/ILivechatInquiryModel.ts b/packages/model-typings/src/models/ILivechatInquiryModel.ts index 4ab0203aa5b3..6cad9d91865e 100644 --- a/packages/model-typings/src/models/ILivechatInquiryModel.ts +++ b/packages/model-typings/src/models/ILivechatInquiryModel.ts @@ -19,6 +19,7 @@ export interface ILivechatInquiryModel extends IBaseModel; findNextAndLock(queueSortBy: OmnichannelSortingMechanismSettingType, department?: string): Promise; unlock(inquiryId: string): Promise; + unlockAndQueue(inquiryId: string): Promise; unlockAll(): Promise; getCurrentSortedQueueAsync(props: { inquiryId?: string; diff --git a/packages/model-typings/src/models/ILivechatRoomsModel.ts b/packages/model-typings/src/models/ILivechatRoomsModel.ts index 20100cbb4f61..95097374216c 100644 --- a/packages/model-typings/src/models/ILivechatRoomsModel.ts +++ b/packages/model-typings/src/models/ILivechatRoomsModel.ts @@ -135,7 +135,7 @@ export interface ILivechatRoomsModel extends IBaseModel { updateSurveyFeedbackById(_id: string, surveyFeedback: unknown): Promise; updateDataByToken(token: string, key: string, value: string, overwrite?: boolean): Promise; saveRoomById( - data: { _id: string; topic: string; tags: string[]; livechatData?: Record } & Record, + data: { _id: string; topic?: string; tags?: string[]; livechatData?: Record } & Record, ): Promise; findById(_id: string, fields?: FindOptions['projection']): FindCursor; findByIds( diff --git a/packages/model-typings/src/models/IMessagesModel.ts b/packages/model-typings/src/models/IMessagesModel.ts index d681405850fa..9b7680b56120 100644 --- a/packages/model-typings/src/models/IMessagesModel.ts +++ b/packages/model-typings/src/models/IMessagesModel.ts @@ -18,6 +18,7 @@ import type { UpdateResult, Document, Filter, + ModifyResult, } from 'mongodb'; import type { FindPaginated, IBaseModel } from './IBaseModel'; @@ -252,7 +253,7 @@ export interface IMessagesModel extends IBaseModel { getMessageByFileId(fileID: string): Promise; setThreadMessagesAsRead(tmid: string, until: Date): Promise; updateRepliesByThreadId(tmid: string, replies: string[], ts: Date): Promise; - refreshDiscussionMetadata(room: Pick): Promise; + refreshDiscussionMetadata(room: Pick): Promise>; findUnreadThreadMessagesByDate( tmid: string, userId: string, diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index e6c2011c35c2..b747514a9979 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/models +## 0.0.21-rc.7 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.7 + +## 0.0.21-rc.6 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.6 + +## 0.0.21-rc.5 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.5 + +## 0.0.21-rc.4 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.4 + +## 0.0.21-rc.3 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.3 + ## 0.0.21-rc.2 ### Patch Changes @@ -22,6 +52,24 @@ - Updated dependencies [5f81a0f3cb] - @rocket.chat/model-typings@0.2.0-rc.0 +## 0.0.23 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.8 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.7 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.6 + ## 0.0.20 ### Patch Changes diff --git a/packages/models/package.json b/packages/models/package.json index d54c9a4f931e..4471297e7a9c 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,11 +1,11 @@ { "name": "@rocket.chat/models", - "version": "0.0.21-rc.2", + "version": "0.0.24-rc.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/node-poplib/package.json b/packages/node-poplib/package.json index dc91a3722016..ce80d3c1fec4 100644 --- a/packages/node-poplib/package.json +++ b/packages/node-poplib/package.json @@ -3,9 +3,9 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/password-policies/package.json b/packages/password-policies/package.json index 52fa766671db..23ee01767bc5 100644 --- a/packages/password-policies/package.json +++ b/packages/password-policies/package.json @@ -3,11 +3,11 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/chai": "^4.3.5", - "@types/jest": "~29.5.3", - "chai": "^4.3.7", + "@types/chai": "^4.3.9", + "@types/jest": "~29.5.7", + "chai": "^4.3.10", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/random/package.json b/packages/random/package.json index 15ca3ee0b47a..931b3784aa45 100644 --- a/packages/random/package.json +++ b/packages/random/package.json @@ -14,14 +14,14 @@ "test": "jest" }, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/release-action/package.json b/packages/release-action/package.json index 0a1e3ded8927..ce574dddc8b0 100644 --- a/packages/release-action/package.json +++ b/packages/release-action/package.json @@ -10,11 +10,11 @@ "main": "dist/index.js", "packageManager": "yarn@3.5.1", "devDependencies": { - "@types/node": "^16.18.36", + "@types/node": "^16.18.60", "typescript": "~5.2.2" }, "dependencies": { - "@actions/core": "^1.10.0", + "@actions/core": "^1.10.1", "@actions/exec": "^1.1.1", "@actions/github": "^5.1.1", "@octokit/plugin-throttling": "^6.0.0", diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index 2a3bf2fe9477..9bca22a51398 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,40 @@ # @rocket.chat/rest-typings +## 6.5.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/license@0.1.0-rc.7 + +## 6.5.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/license@0.1.0-rc.6 + +## 6.5.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/license@0.1.0-rc.5 + +## 6.5.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/license@0.1.0-rc.4 + +## 6.5.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/license@0.1.0-rc.3 + ## 6.5.0-rc.2 ### Patch Changes @@ -42,6 +77,24 @@ - @rocket.chat/core-typings@6.5.0-rc.0 - @rocket.chat/license@0.1.0-rc.0 +## 6.4.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 + +## 6.4.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 + +## 6.4.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 + ## 6.4.5 ### Patch Changes diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index e422d451596c..e01bf0e1dd4f 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -3,10 +3,10 @@ "version": "6.6.0-develop", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "mongodb": "^4.17.1", "ts-jest": "~29.0.5", "typescript": "~5.2.2" diff --git a/packages/rest-typings/src/apps/index.ts b/packages/rest-typings/src/apps/index.ts index 31427afb3fee..bf1514aceeab 100644 --- a/packages/rest-typings/src/apps/index.ts +++ b/packages/rest-typings/src/apps/index.ts @@ -53,14 +53,7 @@ export type AppsEndpoints = { GET: () => { apps: { id: string; - languages: { - [key: string]: { - Params: string; - Description: string; - Setting_Name: string; - Setting_Description: string; - }; - }; + languages: { [language: string]: { [key: string]: string } }; }[]; }; }; diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts index 494bbde6f4a3..22fc7e837f7e 100644 --- a/packages/rest-typings/src/v1/omnichannel.ts +++ b/packages/rest-typings/src/v1/omnichannel.ts @@ -3138,7 +3138,8 @@ const POSTLivechatAppearanceParamsSchema = { type: 'string', }, value: { - anyOf: [{ type: 'string' }, { type: 'boolean' }, { type: 'number' }], + // Be careful with anyOf - https://github.com/ajv-validator/ajv/issues/1140 + type: ['string', 'boolean', 'number'], }, }, required: ['_id', 'value'], @@ -3290,15 +3291,12 @@ export type OmnichannelEndpoints = { }; '/v1/livechat/department/:_id': { GET: (params: LivechatDepartmentId) => { - department: ILivechatDepartment | null; + department: ILivechatDepartment; agents?: ILivechatDepartmentAgents[]; }; PUT: (params: { department: LivechatDepartmentDTO; - agents: { - upsert?: { agentId: string; count?: number; order?: number }[]; - remove?: { agentId: string; count?: number; order?: number }; - }[]; + agents: Pick[]; }) => { department: ILivechatDepartment | null; agents: ILivechatDepartmentAgents[]; diff --git a/packages/server-cloud-communication/package.json b/packages/server-cloud-communication/package.json index 52a3ff801dac..b18de7084958 100644 --- a/packages/server-cloud-communication/package.json +++ b/packages/server-cloud-communication/package.json @@ -4,9 +4,9 @@ "private": true, "devDependencies": { "@rocket.chat/license": "workspace:^", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.1.6" }, diff --git a/packages/server-fetch/package.json b/packages/server-fetch/package.json index ab571e2f2e72..8ef2e1b9a7ad 100644 --- a/packages/server-fetch/package.json +++ b/packages/server-fetch/package.json @@ -3,9 +3,9 @@ "version": "0.0.2-rc.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, @@ -25,7 +25,7 @@ "extends": "../../package.json" }, "dependencies": { - "@types/proxy-from-env": "^1.0.1", + "@types/proxy-from-env": "^1.0.3", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "node-fetch": "2.3.0", diff --git a/packages/sha256/package.json b/packages/sha256/package.json index b343cc5cae2d..12ebcc783afd 100644 --- a/packages/sha256/package.json +++ b/packages/sha256/package.json @@ -13,13 +13,13 @@ "test": "jest" }, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/tools/package.json b/packages/tools/package.json index a9fe5659f9b1..72f25887198a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -3,9 +3,9 @@ "version": "0.2.0-rc.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index b8bc90d9cb54..6ec3e38d358a 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -1,4 +1,5 @@ +export * from './normalizeLanguage'; export * from './pick'; -export * from './timezone'; export * from './stream'; +export * from './timezone'; export * from './wrapExceptions'; diff --git a/apps/meteor/client/lib/utils/filterLanguage.ts b/packages/tools/src/normalizeLanguage.ts similarity index 79% rename from apps/meteor/client/lib/utils/filterLanguage.ts rename to packages/tools/src/normalizeLanguage.ts index 0f6bc9b67d9a..9231d5c20da5 100644 --- a/apps/meteor/client/lib/utils/filterLanguage.ts +++ b/packages/tools/src/normalizeLanguage.ts @@ -1,4 +1,4 @@ -export const filterLanguage = (language: string): string => { +export const normalizeLanguage = (language: string): string => { // Fix browsers having all-lowercase language settings eg. pt-br, en-us const regex = /([a-z]{2,3})-([a-z]{2,4})/; const matches = regex.exec(language); diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index 485a3d153e10..713b0a7ee5ee 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/ui-client +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.3 + ## 3.0.0-rc.2 ### Patch Changes @@ -19,6 +49,24 @@ - Updated dependencies [7da1edf866] - @rocket.chat/ui-contexts@3.0.0-rc.0 +## 2.0.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 + ## 2.0.5 ### Patch Changes diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index a64c473e275a..3b7e7c246c25 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,9 +1,9 @@ { "name": "@rocket.chat/ui-client", - "version": "3.0.0-rc.2", + "version": "3.0.0-rc.7", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", + "@babel/core": "~7.22.20", "@rocket.chat/css-in-js": "next", "@rocket.chat/fuselage": "^0.37.1", "@rocket.chat/fuselage-hooks": "^0.32.1", @@ -20,21 +20,21 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@swc/jest": "^0.2.26", + "@swc/jest": "^0.2.29", "@testing-library/jest-dom": "~5.16.5", - "@testing-library/react": "^12.1.2", + "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", - "@types/babel__core": "~7.20.1", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", + "@types/babel__core": "~7.20.3", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", "eslint": "~8.45.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", - "eslint-plugin-testing-library": "~5.11.0", - "jest": "~29.6.1", + "eslint-plugin-storybook": "~0.6.15", + "eslint-plugin-testing-library": "~5.11.1", + "jest": "~29.6.4", "react": "^17.0.2", "react-dom": "^17.0.2", "react-hook-form": "~7.45.4", @@ -61,7 +61,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "3.0.0-rc.2", + "@rocket.chat/ui-contexts": "3.0.0-rc.7", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index 09e1270a3005..4551d06659cc 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", + "@babel/core": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/fuselage": "^0.37.1", "@rocket.chat/icons": "^0.32.0", @@ -14,13 +14,13 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@types/babel__core": "~7.20.1", - "@types/jest": "~29.5.3", + "@types/babel__core": "~7.20.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", - "jest": "~29.6.1", + "eslint-plugin-storybook": "~0.6.15", + "jest": "~29.6.4", "react-docgen-typescript-plugin": "~1.0.5", "ts-jest": "~29.0.5", "typescript": "~5.2.2" diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index baa753633148..f570d5e5c159 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,45 @@ # @rocket.chat/ui-contexts +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/ddp-client@0.2.6-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/ddp-client@0.2.6-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/ddp-client@0.2.6-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/ddp-client@0.2.6-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/ddp-client@0.2.6-rc.3 + ## 3.0.0-rc.2 ### Patch Changes @@ -33,6 +73,30 @@ - @rocket.chat/rest-typings@6.5.0-rc.0 - @rocket.chat/ddp-client@0.2.6-rc.0 +## 2.0.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/ddp-client@0.2.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/ddp-client@0.2.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/ddp-client@0.2.6 + ## 2.0.5 ### Patch Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 067375102049..b75a5449907a 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,19 +1,19 @@ { "name": "@rocket.chat/ui-contexts", - "version": "3.0.0-rc.2", + "version": "3.0.0-rc.7", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "next", "@rocket.chat/fuselage-hooks": "^0.32.1", "@rocket.chat/rest-typings": "workspace:^", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", - "@types/use-sync-external-store": "^0.0.3", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", + "@types/use-sync-external-store": "^0.0.5", "eslint": "~8.45.0", "eslint-plugin-react-hooks": "^4.6.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "mongodb": "^4.17.1", "react": "~17.0.2", "ts-jest": "~29.0.5", diff --git a/packages/ui-contexts/src/ActionManagerContext.ts b/packages/ui-contexts/src/ActionManagerContext.ts index fa6ff0a7659d..538e0332454b 100644 --- a/packages/ui-contexts/src/ActionManagerContext.ts +++ b/packages/ui-contexts/src/ActionManagerContext.ts @@ -1,11 +1,16 @@ import type { DistributiveOmit, UiKit } from '@rocket.chat/core-typings'; import { createContext } from 'react'; -type ActionManager = { +/** + * An action manager is responsible for handling interactions with the UiKit. + */ +export interface IActionManager { on(viewId: string, listener: (data: any) => void): void; on(eventName: 'busy', listener: ({ busy }: { busy: boolean }) => void): void; off(viewId: string, listener: (data: any) => any): void; off(eventName: 'busy', listener: ({ busy }: { busy: boolean }) => void): void; + notifyBusy(): void; + notifyIdle(): void; generateTriggerId(appId: string | undefined): string; emitInteraction(appId: string, userInteraction: DistributiveOmit): Promise; handleServerInteraction(interaction: UiKit.ServerInteraction): UiKit.ServerInteraction['type'] | undefined; @@ -18,6 +23,6 @@ type ActionManager = { openView(surface: 'banner', view: UiKit.BannerView): void; openView(surface: 'contextual_bar', view: UiKit.ContextualBarView): void; disposeView(viewId: UiKit.ModalView['id'] | UiKit.BannerView['viewId'] | UiKit.ContextualBarView['id']): void; -}; +} -export const ActionManagerContext = createContext(undefined); +export const ActionManagerContext = createContext(undefined); diff --git a/packages/ui-contexts/src/TranslationContext.ts b/packages/ui-contexts/src/TranslationContext.ts index d0f9bb6318c3..b73428932d8f 100644 --- a/packages/ui-contexts/src/TranslationContext.ts +++ b/packages/ui-contexts/src/TranslationContext.ts @@ -11,7 +11,7 @@ export type TranslationLanguage = { key: string; }; -export type TranslationKey = keyof typeof keys; +export type TranslationKey = keyof typeof keys | `app-${string}.${string}`; export type TranslationContextValue = { languages: TranslationLanguage[]; diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts index d404dc921579..4e35d9e02af8 100644 --- a/packages/ui-contexts/src/index.ts +++ b/packages/ui-contexts/src/index.ts @@ -14,7 +14,7 @@ export { TooltipContext, TooltipContextValue } from './TooltipContext'; export { TranslationContext, TranslationContextValue } from './TranslationContext'; export { UserContext, UserContextValue, LoginService } from './UserContext'; export { DeviceContext, Device, IExperimentalHTMLAudioElement, DeviceContextValue } from './DeviceContext'; -export { ActionManagerContext } from './ActionManagerContext'; +export { ActionManagerContext, IActionManager } from './ActionManagerContext'; export { useAbsoluteUrl } from './hooks/useAbsoluteUrl'; export { useAllPermissions } from './hooks/useAllPermissions'; diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index ead96347d8c4..400346f3835f 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,35 @@ # @rocket.chat/ui-video-conf +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.3 + ## 3.0.0-rc.2 ### Patch Changes @@ -19,6 +49,24 @@ - Updated dependencies [7da1edf866] - @rocket.chat/ui-contexts@3.0.0-rc.0 +## 2.0.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 + ## 2.0.5 ### Patch Changes diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 1793e5732a01..16293f9424d6 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,9 +1,9 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "3.0.0-rc.2", + "version": "3.0.0-rc.7", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", + "@babel/core": "~7.22.20", "@rocket.chat/css-in-js": "next", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/fuselage": "^0.37.1", @@ -18,13 +18,13 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@types/babel__core": "~7.20.1", - "@types/jest": "~29.5.3", + "@types/babel__core": "~7.20.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", - "jest": "~29.6.1", + "eslint-plugin-storybook": "~0.6.15", + "jest": "~29.6.4", "react-docgen-typescript-plugin": "~1.0.5", "ts-jest": "~29.0.5", "typescript": "~5.2.2" @@ -35,7 +35,7 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-contexts": "3.0.0-rc.2", + "@rocket.chat/ui-contexts": "3.0.0-rc.7", "react": "^17.0.2", "react-dom": "^17.0.2" }, diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index b5308c845ac4..fc591fd32c99 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,40 @@ # @rocket.chat/uikit-playground +## 0.2.6-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.7 + +## 0.2.6-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.6 + +## 0.2.6-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.5 + +## 0.2.6-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.4 + +## 0.2.6-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.3 + ## 0.2.6-rc.2 ### Patch Changes @@ -22,6 +57,27 @@ - @rocket.chat/ui-contexts@3.0.0-rc.0 - @rocket.chat/fuselage-ui-kit@3.0.0-rc.0 +## 0.2.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/fuselage-ui-kit@2.0.8 + +## 0.2.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/fuselage-ui-kit@2.0.7 + +## 0.2.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/fuselage-ui-kit@2.0.6 + ## 0.2.5 ### Patch Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index b9c0bd2b5f31..a02abbb30c9a 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.2.6-rc.2", + "version": "0.2.9-rc.0", "type": "module", "scripts": { "dev": "vite", @@ -36,16 +36,16 @@ "use-subscription": "^1.8.0" }, "devDependencies": { - "@types/react": "~17.0.62", - "@types/react-beautiful-dnd": "^13.1.4", - "@types/react-dom": "~17.0.20", - "@types/use-subscription": "^1.0.0", + "@types/react": "~17.0.69", + "@types/react-beautiful-dnd": "^13.1.6", + "@types/react-dom": "~17.0.22", + "@types/use-subscription": "^1.0.1", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "@vitejs/plugin-react": "^4.0.0", "eslint": "~8.45.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.1", + "eslint-plugin-react-refresh": "^0.4.4", "typescript": "~5.2.2", "vite": "^4.3.9" }, diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index c276b0949a1c..f1cbded5ded9 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,29 @@ # @rocket.chat/web-ui-registration +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 + ## 3.0.0-rc.2 ### Patch Changes @@ -20,6 +44,24 @@ - Updated dependencies [7da1edf866] - @rocket.chat/ui-contexts@3.0.0-rc.0 +## 2.0.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 + ## 2.0.5 ### Patch Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index 018f5672b9bc..ae313fe52f67 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "3.0.0-rc.2", + "version": "3.0.0-rc.6", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -17,13 +17,14 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput" }, "devDependencies": { - "@babel/core": "~7.22.10", - "@babel/preset-env": "~7.22.10", - "@babel/preset-react": "~7.22.5", - "@babel/preset-typescript": "~7.22.5", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-react": "~7.22.15", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/i18n": "workspace:~", "@rocket.chat/layout": "next", "@rocket.chat/mock-providers": "workspace:~", + "@rocket.chat/tools": "workspace:~", "@rocket.chat/ui-client": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", "@storybook/addon-actions": "~6.5.16", @@ -32,24 +33,25 @@ "@storybook/builder-webpack4": "~6.5.16", "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", - "@storybook/testing-library": "^0.2.0", + "@storybook/testing-library": "^0.2.2", "@tanstack/react-query": "^4.16.1", "@testing-library/react": "^13.3.0", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", "babel-loader": "~8.3.0", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "react": "~17.0.2", "react-hook-form": "~7.45.4", - "react-i18next": "~13.2.1", + "react-i18next": "~13.2.2", "storybook-dark-mode": "~3.0.1", "ts-jest": "~29.0.5", "typescript": "~5.2.2" }, "peerDependencies": { "@rocket.chat/layout": "*", - "@rocket.chat/ui-contexts": "3.0.0-rc.2", + "@rocket.chat/tools": "*", + "@rocket.chat/ui-contexts": "3.0.0-rc.7", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", diff --git a/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx b/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx index a14f48e754ca..889d7e53e7b9 100644 --- a/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx +++ b/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx @@ -14,7 +14,7 @@ export const RegisterSecretPageRouter = ({ origin, }: { setLoginRoute: DispatchLoginRouter; - origin: 'register' | 'secret-register'; + origin: 'register' | 'secret-register' | 'invite-register'; }): ReactElement => { const registrationMode = useSetting('Accounts_RegistrationForm'); @@ -26,7 +26,7 @@ export const RegisterSecretPageRouter = ({ return ; } - if (isPublicRegistration) { + if (isPublicRegistration || (origin === 'invite-register' && isRegistrationAllowedForSecret)) { return ( diff --git a/packages/web-ui-registration/src/RegistrationPageRouter.tsx b/packages/web-ui-registration/src/RegistrationPageRouter.tsx index 3c92f528fa9c..a8d2064b5769 100644 --- a/packages/web-ui-registration/src/RegistrationPageRouter.tsx +++ b/packages/web-ui-registration/src/RegistrationPageRouter.tsx @@ -1,3 +1,4 @@ +import { useSession } from '@rocket.chat/ui-contexts'; import type { ReactElement, ReactNode } from 'react'; import GuestForm from './GuestForm'; @@ -15,7 +16,8 @@ export const RegistrationPageRouter = ({ defaultRoute?: LoginRoutes; children?: ReactNode; }): ReactElement | null => { - const [route, setLoginRoute] = useLoginRouter(defaultRoute); + const defaultRouteSession = useSession('loginDefaultState') as LoginRoutes | undefined; + const [route, setLoginRoute] = useLoginRouter(defaultRouteSession || defaultRoute); if (route === 'guest') { return ( @@ -41,7 +43,7 @@ export const RegistrationPageRouter = ({ ); } - if (route === 'secret-register' || route === 'register') { + if (route === 'secret-register' || route === 'register' || route === 'invite-register') { return ; } diff --git a/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx b/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx index 17b45e9157cb..0d08fba8a3ac 100644 --- a/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx +++ b/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx @@ -1,21 +1,11 @@ import { Button } from '@rocket.chat/fuselage'; import { useLocalStorage } from '@rocket.chat/fuselage-hooks'; import { HorizontalWizardLayoutCaption } from '@rocket.chat/layout'; +import { normalizeLanguage } from '@rocket.chat/tools'; import { type TranslationLanguage, useSetting, useLoadLanguage, useLanguage, useLanguages } from '@rocket.chat/ui-contexts'; import { type ReactElement, type UIEvent, useMemo, useEffect } from 'react'; import { Trans, useTranslation } from 'react-i18next'; -const normalizeLanguage = (language: string): string => { - // Fix browsers having all-lowercase language settings eg. pt-br, en-us - const regex = /([a-z]{2,3})-([a-z]{2,4})/; - const matches = regex.exec(language); - if (matches) { - return `${matches[1]}-${matches[2].toUpperCase()}`; - } - - return language; -}; - const useSuggestedLanguages = ({ browserLanguage = normalizeLanguage(window.navigator.language ?? 'en'), }: { diff --git a/packages/web-ui-registration/src/hooks/useLoginRouter.ts b/packages/web-ui-registration/src/hooks/useLoginRouter.ts index 6c907e39a1c5..5a5b1e98223e 100644 --- a/packages/web-ui-registration/src/hooks/useLoginRouter.ts +++ b/packages/web-ui-registration/src/hooks/useLoginRouter.ts @@ -1,7 +1,15 @@ import type { Dispatch } from 'react'; import { useState } from 'react'; -export type LoginRoutes = 'login' | 'reset-password' | 'register' | 'register-invalid' | 'secret-register' | 'guest' | 'anonymous'; +export type LoginRoutes = + | 'login' + | 'reset-password' + | 'register' + | 'register-invalid' + | 'secret-register' + | 'invite-register' + | 'guest' + | 'anonymous'; export const useLoginRouter = (route: LoginRoutes): [LoginRoutes, DispatchLoginRouter] => useState(route); diff --git a/yarn.lock b/yarn.lock index 809d38dfd10c..6ac93c510c3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,13 +12,13 @@ __metadata: languageName: node linkType: hard -"@actions/core@npm:^1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" +"@actions/core@npm:^1.10.1": + version: 1.10.1 + resolution: "@actions/core@npm:1.10.1" dependencies: "@actions/http-client": ^2.0.1 uuid: ^8.3.2 - checksum: 0a75621e007ab20d887434cdd165f0b9036f14c22252a2faed33543d8b9d04ec95d823e69ca636a25245574e4585d73e1e9e47a845339553c664f9f2c9614669 + checksum: 96524c2725e70e3c3176b4e4d93a1358a86f3c5ca777db9a2f65eadfa672f00877db359bf60fffc416c33838ffb4743db93bcc5bf53e76199dd28bf7f7ff8e80 languageName: node linkType: hard @@ -975,17 +975,7 @@ __metadata: languageName: node linkType: hard -"@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.22.10, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": - version: 7.22.10 - resolution: "@babel/code-frame@npm:7.22.10" - dependencies: - "@babel/highlight": ^7.22.10 - chalk: ^2.4.2 - checksum: 89a06534ad19759da6203a71bad120b1d7b2ddc016c8e07d4c56b35dea25e7396c6da60a754e8532a86733092b131ae7f661dbe6ba5d165ea777555daa2ed3c9 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.22.13": +"@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.22.13, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": version: 7.22.13 resolution: "@babel/code-frame@npm:7.22.13" dependencies: @@ -995,14 +985,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/compat-data@npm:7.22.9" - checksum: bed77d9044ce948b4327b30dd0de0779fa9f3a7ed1f2d31638714ed00229fa71fc4d1617ae0eb1fad419338d3658d0e9a5a083297451e09e73e078d0347ff808 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.22.20": +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.20, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.22.20 resolution: "@babel/compat-data@npm:7.22.20" checksum: efedd1d18878c10fde95e4d82b1236a9aba41395ef798cbb651f58dbf5632dbff475736c507b8d13d4c8f44809d41c0eb2ef0d694283af9ba5dd8339b6dab451 @@ -1033,56 +1016,44 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.4, @babel/core@npm:^7.7.5, @babel/core@npm:~7.22.10, @babel/core@npm:~7.22.9": - version: 7.22.10 - resolution: "@babel/core@npm:7.22.10" +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.4, @babel/core@npm:^7.7.5, @babel/core@npm:~7.22.20": + version: 7.22.20 + resolution: "@babel/core@npm:7.22.20" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.22.10 - "@babel/generator": ^7.22.10 - "@babel/helper-compilation-targets": ^7.22.10 - "@babel/helper-module-transforms": ^7.22.9 - "@babel/helpers": ^7.22.10 - "@babel/parser": ^7.22.10 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.10 - "@babel/types": ^7.22.10 + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.22.15 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-module-transforms": ^7.22.20 + "@babel/helpers": ^7.22.15 + "@babel/parser": ^7.22.16 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.22.20 + "@babel/types": ^7.22.19 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.2 + json5: ^2.2.3 semver: ^6.3.1 - checksum: cc4efa09209fe1f733cf512e9e4bb50870b191ab2dee8014e34cd6e731f204e48476cc53b4bbd0825d4d342304d577ae43ff5fd8ab3896080673c343321acb32 + checksum: 73663a079194b5dc406b2e2e5e50db81977d443e4faf7ef2c27e5836cd9a359e81e551115193dc9b1a93471275351a972e54904f4d3aa6cb156f51e26abf6765 languageName: node linkType: hard -"@babel/eslint-parser@npm:~7.22.9": - version: 7.22.9 - resolution: "@babel/eslint-parser@npm:7.22.9" +"@babel/eslint-parser@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/eslint-parser@npm:7.22.15" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 semver: ^6.3.1 peerDependencies: - "@babel/core": ">=7.11.0" + "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 - checksum: 4f417796c803056aad2c8fa69b8a7a78a1fdacc307d95702f22894cab42b83554e47de7d0b3cfbee667f25014bca0179f859aa86ceb684b09803192e1200b48d - languageName: node - linkType: hard - -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.22.10, @babel/generator@npm:^7.7.2": - version: 7.22.10 - resolution: "@babel/generator@npm:7.22.10" - dependencies: - "@babel/types": ^7.22.10 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 59a79730abdff9070692834bd3af179e7a9413fa2ff7f83dff3eb888765aeaeb2bfc7b0238a49613ed56e1af05956eff303cc139f2407eda8df974813e486074 + checksum: efdc749164a40de1b68e3ed395f441dfb7864c85d0a2ee3e4bc4f06dd0b7f675acb9be97cdc9025b88b3e80d38749a2b30e392ce7f6a79313c3aaf82ba8ccd68 languageName: node linkType: hard -"@babel/generator@npm:^7.23.0": +"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.22.15, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.7.2": version: 7.23.0 resolution: "@babel/generator@npm:7.23.0" dependencies: @@ -1112,20 +1083,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.10, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.10 - resolution: "@babel/helper-compilation-targets@npm:7.22.10" - dependencies: - "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.15 - browserslist: ^4.21.9 - lru-cache: ^5.1.1 - semver: ^6.3.1 - checksum: f6f1896816392bcff671bbe6e277307729aee53befb4a66ea126e2a91eda78d819a70d06fa384c74ef46c1595544b94dca50bef6c78438d9ffd31776dafbd435 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.15": +"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: @@ -1247,7 +1205,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.22.9, @babel/helper-module-transforms@npm:^7.23.0": +"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.20, @babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-module-transforms@npm:7.23.0" dependencies: @@ -1352,14 +1310,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.16.7, @babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.22.5": +"@babel/helper-validator-option@npm:^7.16.7, @babel/helper-validator-option@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-validator-option@npm:7.22.15" checksum: 68da52b1e10002a543161494c4bc0f4d0398c8fdf361d5f7f4272e95c45d5b32d974896d44f6a0ea7378c9204988879d73613ca683e13bd1304e46d25ff67a8d @@ -1377,14 +1328,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.22.10": - version: 7.23.1 - resolution: "@babel/helpers@npm:7.23.1" +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.22.15": + version: 7.23.2 + resolution: "@babel/helpers@npm:7.23.2" dependencies: "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.0 + "@babel/traverse": ^7.23.2 "@babel/types": ^7.23.0 - checksum: acfc345102045c24ea2a4d60e00dcf8220e215af3add4520e2167700661338e6a80bd56baf44bb764af05ec6621101c9afc315dc107e18c61fa6da8acbdbb893 + checksum: aaf4828df75ec460eaa70e5c9f66e6dadc28dae3728ddb7f6c13187dbf38030e142194b83d81aa8a31bbc35a5529a5d7d3f3cf59d5d0b595f5dd7f9d8f1ced8e languageName: node linkType: hard @@ -1399,27 +1350,7 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/highlight@npm:7.22.10" - dependencies: - "@babel/helper-validator-identifier": ^7.22.5 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: f714a1e1a72dd9d72f6383f4f30fd342e21a8df32d984a4ea8f5eab691bb6ba6db2f8823d4b4cf135d98869e7a98925b81306aa32ee3c429f8cfa52c75889e1b - 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.20.7, @babel/parser@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/parser@npm:7.22.10" - bin: - parser: ./bin/babel-parser.js - checksum: af51567b7d3cdf523bc608eae057397486c7fa6c2e5753027c01fe5c36f0767b2d01ce3049b222841326cc5b8c7fda1d810ac1a01af0a97bb04679e2ef9f7049 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.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.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.16, @babel/parser@npm:^7.23.0": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" bin: @@ -2135,7 +2066,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.22.15, @babel/plugin-transform-modules-commonjs@npm:^7.22.5, @babel/plugin-transform-modules-commonjs@npm:^7.23.0": +"@babel/plugin-transform-modules-commonjs@npm:^7.22.15, @babel/plugin-transform-modules-commonjs@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" dependencies: @@ -2365,18 +2296,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.12.12, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" +"@babel/plugin-transform-react-jsx@npm:^7.12.12, @babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-jsx": ^7.22.5 - "@babel/types": ^7.22.5 + "@babel/types": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c8f93f29f32cf79683ca2b8958fd62f38155674846ef27a7d4b6fbeb8713c37257418391731b58ff8024ec37b888bed5960e615a3f552e28245d2082e7f2a2df + checksum: 3899054e89550c3a0ef041af7c47ee266e2e934f498ee80fefeda778a6aa177b48aa8b4d2a8bf5848de977fec564571699ab952d9fa089c4c19b45ddb121df09 languageName: node linkType: hard @@ -2471,7 +2402,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.22.15, @babel/plugin-transform-typescript@npm:^7.22.5": +"@babel/plugin-transform-typescript@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-typescript@npm:7.22.15" dependencies: @@ -2532,7 +2463,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:~7.22.10, @babel/preset-env@npm:~7.22.9": +"@babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:~7.22.20": version: 7.22.20 resolution: "@babel/preset-env@npm:7.22.20" dependencies: @@ -2648,19 +2579,19 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:~7.22.5": - version: 7.22.5 - resolution: "@babel/preset-react@npm:7.22.5" +"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/preset-react@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 "@babel/plugin-transform-react-display-name": ^7.22.5 - "@babel/plugin-transform-react-jsx": ^7.22.5 + "@babel/plugin-transform-react-jsx": ^7.22.15 "@babel/plugin-transform-react-jsx-development": ^7.22.5 "@babel/plugin-transform-react-pure-annotations": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b977c7ee83e93f62d77e61929ca3d97e5291e026e2f025a1b8b7ac9186486ed56c7d5bc36f0becabe0c24e8c42a4e4f2243a3cf841384cfafc3204c5d3e6c619 + checksum: c3ef99dfa2e9f57d2e08603e883aa20f47630a826c8e413888a93ae6e0084b5016871e463829be125329d40a1ba0a89f7c43d77b6dab52083c225cb43e63d10e languageName: node linkType: hard @@ -2679,24 +2610,24 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:~7.22.5": - version: 7.22.5 - resolution: "@babel/preset-typescript@npm:7.22.5" +"@babel/preset-typescript@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/preset-typescript@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 "@babel/plugin-syntax-jsx": ^7.22.5 - "@babel/plugin-transform-modules-commonjs": ^7.22.5 - "@babel/plugin-transform-typescript": ^7.22.5 + "@babel/plugin-transform-modules-commonjs": ^7.22.15 + "@babel/plugin-transform-typescript": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7be1670cb4404797d3a473bd72d66eb2b3e0f2f8a672a5e40bdb0812cc66085ec84bcd7b896709764cabf042fdc6b7f2d4755ac7cce10515eb596ff61dab5154 + checksum: 02ac4d5c812a52357c8f517f81584725f06f385d54ccfda89dd082e0ed89a94bd9f4d9b05fa1cbdcf426e3489c1921f04c93c5acc5deea83407a64c22ad2feb4 languageName: node linkType: hard -"@babel/register@npm:^7.12.1, @babel/register@npm:~7.22.5": - version: 7.22.5 - resolution: "@babel/register@npm:7.22.5" +"@babel/register@npm:^7.12.1, @babel/register@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/register@npm:7.22.15" dependencies: clone-deep: ^4.0.1 find-cache-dir: ^2.0.0 @@ -2705,7 +2636,7 @@ __metadata: source-map-support: ^0.5.16 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 723ce27fdad6faee5b3f51ef4f5154f7f285d61da665367de14de85abbe1c81ccbac11f699671cd0ed6b755dd430f28a62364fed5d49f2527625a9ea3bf40056 + checksum: 5497be6773608cd2d874210edd14499fce464ddbea170219da55955afe4c9173adb591164193458fd639e43b7d1314088a6186f4abf241476c59b3f0da6afd6f languageName: node linkType: hard @@ -2725,12 +2656,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2, @babel/runtime@npm:~7.22.6": - version: 7.22.10 - resolution: "@babel/runtime@npm:7.22.10" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2, @babel/runtime@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/runtime@npm:7.22.15" dependencies: regenerator-runtime: ^0.14.0 - checksum: 524d41517e68953dbc73a4f3616b8475e5813f64e28ba89ff5fca2c044d535c2ea1a3f310df1e5bb06162e1f0b401b5c4af73fe6e2519ca2450d9d8c44cf268d + checksum: 793296df1e41599a935a3d77ec01eb6088410d3fd4dbe4e92f06c6b7bb2f8355024e6d78621a3a35f44e0e23b0b59107f23d585384df4f3123256a1e1492040e languageName: node linkType: hard @@ -2754,9 +2685,9 @@ __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.22.10, @babel/traverse@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/traverse@npm:7.23.0" +"@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.22.20, @babel/traverse@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/traverse@npm:7.23.2" dependencies: "@babel/code-frame": ^7.22.13 "@babel/generator": ^7.23.0 @@ -2768,22 +2699,11 @@ __metadata: "@babel/types": ^7.23.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: 0b17fae53269e1af2cd3edba00892bc2975ad5df9eea7b84815dab07dfec2928c451066d51bc65b4be61d8499e77db7e547ce69ef2a7b0eca3f96269cb43a0b0 - 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.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.5, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.22.10 - resolution: "@babel/types@npm:7.22.10" - dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 - to-fast-properties: ^2.0.0 - checksum: 095c4f4b7503fa816e4094113f0ec2351ef96ff32012010b771693066ff628c7c664b21c6bd3fb93aeb46fe7c61f6b3a3c9e4ed0034d6a2481201c417371c8af + checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d languageName: node linkType: hard -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.23.0": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.7, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.23.0 resolution: "@babel/types@npm:7.23.0" dependencies: @@ -2897,12 +2817,12 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^6.1.3": - version: 6.1.3 - resolution: "@changesets/apply-release-plan@npm:6.1.3" +"@changesets/apply-release-plan@npm:^6.1.4": + version: 6.1.4 + resolution: "@changesets/apply-release-plan@npm:6.1.4" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/config": ^2.3.0 + "@changesets/config": ^2.3.1 "@changesets/get-version-range-type": ^0.3.2 "@changesets/git": ^2.0.0 "@changesets/types": ^5.2.1 @@ -2913,22 +2833,22 @@ __metadata: outdent: ^0.5.0 prettier: ^2.7.1 resolve-from: ^5.0.0 - semver: ^5.4.1 - checksum: 3772a6e0ede33abdac6fcc52359307f770d5fafa53295c83e0a11b81e5802b2fe5e74e4d672c0a082f5d73dc1a9ef56509870b81824111396f74de99ada9526b + semver: ^7.5.3 + checksum: d386aee70c5483c97d964c6fa1191878005b7050d34b2e1e4a1ad66d9ad44f8f20d1c884e01e770b954bd2d4364f935510e53ae896212669f67e5c37b2a610c7 languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^5.2.3": - version: 5.2.3 - resolution: "@changesets/assemble-release-plan@npm:5.2.3" +"@changesets/assemble-release-plan@npm:^5.2.4": + version: 5.2.4 + resolution: "@changesets/assemble-release-plan@npm:5.2.4" dependencies: "@babel/runtime": ^7.20.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-dependents-graph": ^1.3.6 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - semver: ^5.4.1 - checksum: 2c61894414736b12e9a26903d73c387b65f4caba398e280488b885f4d0f4bb307aaa6bae140dfd754c85de6557bd07645accda2af6b8794837ab43823ba6215c + semver: ^7.5.3 + checksum: 32f443a0afec3d5a4afc68c8de32e8ff88531ea24976b50583b1d6870d71cec2729f27952af82854eb54e2ad0a619872d211d654c596ee0eb42c83ab54ad15ae languageName: node linkType: hard @@ -2941,18 +2861,18 @@ __metadata: languageName: node linkType: hard -"@changesets/cli@npm:^2.26.1": - version: 2.26.1 - resolution: "@changesets/cli@npm:2.26.1" +"@changesets/cli@npm:^2.26.2": + version: 2.26.2 + resolution: "@changesets/cli@npm:2.26.2" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/apply-release-plan": ^6.1.3 - "@changesets/assemble-release-plan": ^5.2.3 + "@changesets/apply-release-plan": ^6.1.4 + "@changesets/assemble-release-plan": ^5.2.4 "@changesets/changelog-git": ^0.1.14 - "@changesets/config": ^2.3.0 + "@changesets/config": ^2.3.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 - "@changesets/get-release-plan": ^3.0.16 + "@changesets/get-dependents-graph": ^1.3.6 + "@changesets/get-release-plan": ^3.0.17 "@changesets/git": ^2.0.0 "@changesets/logger": ^0.0.5 "@changesets/pre": ^1.0.14 @@ -2961,7 +2881,7 @@ __metadata: "@changesets/write": ^0.2.3 "@manypkg/get-packages": ^1.1.3 "@types/is-ci": ^3.0.0 - "@types/semver": ^6.0.0 + "@types/semver": ^7.5.0 ansi-colors: ^4.1.3 chalk: ^2.1.0 enquirer: ^2.3.0 @@ -2974,28 +2894,28 @@ __metadata: p-limit: ^2.2.0 preferred-pm: ^3.0.0 resolve-from: ^5.0.0 - semver: ^5.4.1 + semver: ^7.5.3 spawndamnit: ^2.0.0 term-size: ^2.1.0 tty-table: ^4.1.5 bin: changeset: bin.js - checksum: d7d6445ebbc1b2718d97852a2275f59af32020e8a1e1efe666767819dd862c7794ce50627ad52f1f97ba4bc57c81bfc4750e92265757cc94ab2d44198d2afb10 + checksum: fc7b5bf319b19abed7a8d33a9fbd9ce49108af61c9c51920f609a49cb0c557f0b998711250d0cac149d0bed8a522f3109c4d8b0dda65b96ff2f823d16ca2f972 languageName: node linkType: hard -"@changesets/config@npm:^2.3.0": - version: 2.3.0 - resolution: "@changesets/config@npm:2.3.0" +"@changesets/config@npm:^2.3.1": + version: 2.3.1 + resolution: "@changesets/config@npm:2.3.1" dependencies: "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-dependents-graph": ^1.3.6 "@changesets/logger": ^0.0.5 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 fs-extra: ^7.0.1 micromatch: ^4.0.2 - checksum: 68a61437ffeda219f22f6d4d32bf8d428e6f284d7e0e191c0629f64f035a051b4068222b1ea3ff1866e5944a153004735dab82205404919f6806c97c546700b1 + checksum: 8af58e3add4751ac8ce2c01f026ac8843b8d1c07c9a3df6518496eaef67f56458a84cad310763c588f7eccbf6831afbf280df7e05e78b294027b6b847be3d0cc languageName: node linkType: hard @@ -3008,31 +2928,31 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^1.3.5": - version: 1.3.5 - resolution: "@changesets/get-dependents-graph@npm:1.3.5" +"@changesets/get-dependents-graph@npm:^1.3.6": + version: 1.3.6 + resolution: "@changesets/get-dependents-graph@npm:1.3.6" dependencies: "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 chalk: ^2.1.0 fs-extra: ^7.0.1 - semver: ^5.4.1 - checksum: d7abb1da21804fd66b1458e46be2f2aec741145a43500b0463a5acfbb420ac5ce776a7328fa660ad4e6e811f933bd6f36e7bbaf00fb3f591d46f0b8e7108fdcd + semver: ^7.5.3 + checksum: d2cbbc5041063b939899502d1b264a0d9edb655acefd7f6197883229156bb7cfd1ace642ae4a1f7f7b432f2c51429f5dc9851ff5a9ed47f1c0159916e66627a9 languageName: node linkType: hard -"@changesets/get-release-plan@npm:^3.0.16": - version: 3.0.16 - resolution: "@changesets/get-release-plan@npm:3.0.16" +"@changesets/get-release-plan@npm:^3.0.17": + version: 3.0.17 + resolution: "@changesets/get-release-plan@npm:3.0.17" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/assemble-release-plan": ^5.2.3 - "@changesets/config": ^2.3.0 + "@changesets/assemble-release-plan": ^5.2.4 + "@changesets/config": ^2.3.1 "@changesets/pre": ^1.0.14 "@changesets/read": ^0.5.9 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - checksum: ab8360c17f69437ad51edfd8910a2609ab8dc1e8cf006994b3938b2551b1eb08b7ab8043b8bf1e94916cbadd89e357a0c1148e20eab8bb5e3ae284384d239942 + checksum: 8a0e3794d0f1e6220d173dbec96352ad69b585d013c3183888ca598dfdfcaa8a5ac3f7f36d5c511575cdc3559c2ad6f8cecfaa16ba9c24380899a81daa7af924 languageName: node linkType: hard @@ -3920,50 +3840,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/console@npm:29.6.1" +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 slash: ^3.0.0 - checksum: d0ab23a00947bfb4bff8c0a7e5a7afd16519de16dde3fe7e77b9f13e794c6df7043ecf7fcdde66ac0d2b5fb3262e9cab3d92eaf61f89a12d3b8e3602e06a9902 + checksum: 0e3624e32c5a8e7361e889db70b170876401b7d70f509a2538c31d5cd50deb0c1ae4b92dc63fe18a0902e0a48c590c21d53787a0df41a52b34fa7cab96c384d6 languageName: node linkType: hard -"@jest/core@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/core@npm:29.6.1" +"@jest/core@npm:^29.6.4, @jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" dependencies: - "@jest/console": ^29.6.1 - "@jest/reporters": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/reporters": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^29.5.0 - jest-config: ^29.6.1 - jest-haste-map: ^29.6.1 - jest-message-util: ^29.6.1 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.1 - jest-resolve-dependencies: ^29.6.1 - jest-runner: ^29.6.1 - jest-runtime: ^29.6.1 - jest-snapshot: ^29.6.1 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 - jest-watcher: ^29.6.1 + jest-changed-files: ^29.7.0 + jest-config: ^29.7.0 + jest-haste-map: ^29.7.0 + jest-message-util: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-resolve-dependencies: ^29.7.0 + jest-runner: ^29.7.0 + jest-runtime: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 + jest-watcher: ^29.7.0 micromatch: ^4.0.4 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -3971,7 +3891,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 736dcc90c6c58dd9e1d2da122103b851187719ce3b3d4167689c63e68252632cd817712955b52ddaa648eba9c6f98f86cd58677325f0db4185f76899c64d7dac + checksum: af759c9781cfc914553320446ce4e47775ae42779e73621c438feb1e4231a5d4862f84b1d8565926f2d1aab29b3ec3dcfdc84db28608bdf5f29867124ebcfc0d languageName: node linkType: hard @@ -3984,72 +3904,72 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/environment@npm:29.6.1" +"@jest/environment@npm:^29.6.4, @jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" dependencies: - "@jest/fake-timers": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-mock: ^29.6.1 - checksum: fb671f91f27e7aa1ba04983ef87a83f0794a597aba0a57d08cbb1fcb484c2aedc2201e99f85fafe27aec9be78af6f2d1d7e6ea88267938992a1d0f9d4615f5b2 + jest-mock: ^29.7.0 + checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 languageName: node linkType: hard -"@jest/expect-utils@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/expect-utils@npm:29.6.1" +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" dependencies: - jest-get-type: ^29.4.3 - checksum: 037ee017eca62f7b45e1465fb5c6f9e92d5709a9ac716b8bff0bd294240a54de734e8f968fb69309cc4aef6c83b9552d5a821f3b18371af394bf04783859d706 + jest-get-type: ^29.6.3 + checksum: 75eb177f3d00b6331bcaa057e07c0ccb0733a1d0a1943e1d8db346779039cb7f103789f16e502f888a3096fb58c2300c38d1f3748b36a7fa762eb6f6d1b160ed languageName: node linkType: hard -"@jest/expect@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/expect@npm:29.6.1" +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" dependencies: - expect: ^29.6.1 - jest-snapshot: ^29.6.1 - checksum: 5c56977b3cc8489744d97d9dc2dcb196c1dfecc83a058a7ef0fd4f63d68cf120a23d27669272d1e1b184fb4337b85e4ac1fc7f886e3988fdf243d42d73973eac + expect: ^29.7.0 + jest-snapshot: ^29.7.0 + checksum: a01cb85fd9401bab3370618f4b9013b90c93536562222d920e702a0b575d239d74cecfe98010aaec7ad464f67cf534a353d92d181646a4b792acaa7e912ae55e languageName: node linkType: hard -"@jest/fake-timers@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/fake-timers@npm:29.6.1" +"@jest/fake-timers@npm:^29.6.4, @jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.6.1 - jest-mock: ^29.6.1 - jest-util: ^29.6.1 - checksum: 86991276944b7d6c2ada3703a272517f5f8f2f4e2af1fe26065f6db1dac4dc6299729a88c46bcb781dcc1b20504c1d4bbd8119fd8a0838ac81a9a4b5d2c8e429 + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 languageName: node linkType: hard -"@jest/globals@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/globals@npm:29.6.1" +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/expect": ^29.6.1 - "@jest/types": ^29.6.1 - jest-mock: ^29.6.1 - checksum: fcca0b970a8b4894a1cdff0f500a86b45609e72c0a4319875e9504237b839df1a46c44d2f1362c6d87fdc7a05928edcc4b5a3751c9e6648dd70a761cdab64c94 + "@jest/environment": ^29.7.0 + "@jest/expect": ^29.7.0 + "@jest/types": ^29.6.3 + jest-mock: ^29.7.0 + checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 languageName: node linkType: hard -"@jest/reporters@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/reporters@npm:29.6.1" +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@jridgewell/trace-mapping": ^0.3.18 "@types/node": "*" chalk: ^4.0.0 @@ -4058,13 +3978,13 @@ __metadata: glob: ^7.1.3 graceful-fs: ^4.2.9 istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^5.1.0 + istanbul-lib-instrument: ^6.0.0 istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 - jest-worker: ^29.6.1 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + jest-worker: ^29.7.0 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -4074,7 +3994,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: b7dae415f3f6342b4db2671261bbee29af20a829f42135316c3dd548b9ef85290c9bb64a0e3aec4a55486596be1257ac8216a0f8d9794acd43f8b8fb686fc7e3 + checksum: 7eadabd62cc344f629024b8a268ecc8367dba756152b761bdcb7b7e570a3864fc51b2a9810cd310d85e0a0173ef002ba4528d5ea0329fbf66ee2a3ada9c40455 languageName: node linkType: hard @@ -4087,47 +4007,47 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/schemas@npm:29.6.0" +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: "@sinclair/typebox": ^0.27.8 - checksum: c00511c69cf89138a7d974404d3a5060af375b5a52b9c87215d91873129b382ca11c1ff25bd6d605951404bb381ddce5f8091004a61e76457da35db1f5c51365 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 languageName: node linkType: hard -"@jest/source-map@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/source-map@npm:29.6.0" +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" dependencies: "@jridgewell/trace-mapping": ^0.3.18 callsites: ^3.0.0 graceful-fs: ^4.2.9 - checksum: 9c6c40387410bb70b2fae8124287fc28f6bdd1b2d7f24348e8611e1bb638b404518228a4ce64a582365b589c536ae8e7ebab0126cef59a87874b71061d19783b + checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb languageName: node linkType: hard -"@jest/test-result@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/test-result@npm:29.6.1" +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" dependencies: - "@jest/console": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/types": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 9397a3a3410c5df564e79297b1be4fe33807a6157a017a1f74b54a6ef14de1530f12b922299e822e66a82c53269da16661772bffde3d883a78c5eefd2cd6d1cc + checksum: 67b6317d526e335212e5da0e768e3b8ab8a53df110361b80761353ad23b6aea4432b7c5665bdeb87658ea373b90fb1afe02ed3611ef6c858c7fba377505057fa languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/test-sequencer@npm:29.6.1" +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" dependencies: - "@jest/test-result": ^29.6.1 + "@jest/test-result": ^29.7.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 + jest-haste-map: ^29.7.0 slash: ^3.0.0 - checksum: f3437178b5dca0401ed2e990d8b69161442351856d56f5725e009a487f5232b51039f8829673884b9bea61c861120d08a53a36432f4a4b8aab38915a68f7000d + checksum: 73f43599017946be85c0b6357993b038f875b796e2f0950487a82f4ebcb115fa12131932dd9904026b4ad8be131fe6e28bd8d0aa93b1563705185f9804bff8bd languageName: node linkType: hard @@ -4154,26 +4074,26 @@ __metadata: languageName: node linkType: hard -"@jest/transform@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/transform@npm:29.6.1" +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@jridgewell/trace-mapping": ^0.3.18 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 - jest-regex-util: ^29.4.3 - jest-util: ^29.6.1 + jest-haste-map: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-util: ^29.7.0 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.2 - checksum: 1635cd66e4b3dbba0689ecefabc6137301756c9c12d1d23e25124dd0dd9b4a6a38653d51e825e90f74faa022152ac1eaf200591fb50417aa7e1f7d1d1c2bc11d + checksum: 0f8ac9f413903b3cb6d240102db848f2a354f63971ab885833799a9964999dd51c388162106a807f810071f864302cdd8e3f0c241c29ce02d85a36f18f3f40ab languageName: node linkType: hard @@ -4203,17 +4123,17 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/types@npm:29.6.1" +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 89fc1ccf71a84fe0da643e0675b1cfe6a6f19ea72e935b2ab1dbdb56ec547e94433fb59b3536d3832a6e156c077865b7176fe9dae707dab9c3d2f9405ba6233c + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc languageName: node linkType: hard @@ -6674,47 +6594,47 @@ __metadata: languageName: node linkType: hard -"@react-pdf/font@npm:^2.3.6": - version: 2.3.6 - resolution: "@react-pdf/font@npm:2.3.6" +"@react-pdf/font@npm:^2.3.7": + version: 2.3.7 + resolution: "@react-pdf/font@npm:2.3.7" dependencies: "@babel/runtime": ^7.20.13 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 cross-fetch: ^3.1.5 fontkit: ^2.0.2 is-url: ^1.2.4 - checksum: 572e34d416ad645e609afcb582c6b8baabe4017019bbfa696b90dddfcb3931069a9dc71124f1bf9b75652063f8c434880c383b212edc659a66dd2be3879f4213 + checksum: bf3f774045294c3e4f2f7b3e86e631ee01dddfe8e8c11fb97264cfa1fbf21e4f3c4ed0684d4971c967c4c175bb918e56f7c1d0dbeac4aa1adf30c618f965f3c9 languageName: node linkType: hard -"@react-pdf/image@npm:^2.2.1": - version: 2.2.1 - resolution: "@react-pdf/image@npm:2.2.1" +"@react-pdf/image@npm:^2.2.2": + version: 2.2.2 + resolution: "@react-pdf/image@npm:2.2.2" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/png-js": ^2.2.0 cross-fetch: ^3.1.5 - checksum: d2b3c9e5b6a23c377724072c875eaeea6389fa513ae0e88ed442d7efb0eaa373b0f195e7c6b9404297ede802d063cf20109800f4d7b951087f66bb64f7c04f1a + checksum: f14c5595ba25f54a2274c1ec4b2d19b195108f05ac34960a0ec8c03499f2090faa9937428ed1d189597fb675733b4d68d092d98c18319e0ef6efa530d12c605b languageName: node linkType: hard -"@react-pdf/layout@npm:^3.6.2": - version: 3.6.2 - resolution: "@react-pdf/layout@npm:3.6.2" +"@react-pdf/layout@npm:^3.6.3": + version: 3.6.3 + resolution: "@react-pdf/layout@npm:3.6.3" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/fns": 2.0.1 - "@react-pdf/image": ^2.2.1 + "@react-pdf/image": ^2.2.2 "@react-pdf/pdfkit": ^3.0.2 "@react-pdf/primitives": ^3.0.0 - "@react-pdf/stylesheet": ^4.1.7 + "@react-pdf/stylesheet": ^4.1.8 "@react-pdf/textkit": ^4.2.0 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 "@react-pdf/yoga": ^4.1.2 cross-fetch: ^3.1.5 emoji-regex: ^10.2.1 queue: ^6.0.1 - checksum: 15816b14aa7ba8720ea5da88f3cf269070c189a2600959c61c92314aebf04e72c691df6947a1bda04d61a561ee68b046e1c8110960da121ffb63badb3d893d08 + checksum: 812b5f3c3f27fba2fc6a15c35a3e9191e4d6407ff4a23a96c2d99889842c26f15bf03531e67c607cc2114ed731739d03f02c934926db7bc05926ef29ed959dad languageName: node linkType: hard @@ -6748,35 +6668,35 @@ __metadata: languageName: node linkType: hard -"@react-pdf/render@npm:^3.2.6": - version: 3.2.6 - resolution: "@react-pdf/render@npm:3.2.6" +"@react-pdf/render@npm:^3.2.7": + version: 3.2.7 + resolution: "@react-pdf/render@npm:3.2.7" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/fns": 2.0.1 "@react-pdf/primitives": ^3.0.0 "@react-pdf/textkit": ^4.2.0 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 abs-svg-path: ^0.1.1 color-string: ^1.5.3 normalize-svg-path: ^1.1.0 parse-svg-path: ^0.1.2 svg-arc-to-cubic-bezier: ^3.2.0 - checksum: 9d0bde1e5042db8a251e474092415bd49ed4b01d7d1d404e50e6f7480d282cf59f51ed9fe08deed633aefcdcee424dd955bf4e659471905326e2911e672db925 + checksum: 74bb7190d006fee7b2df074bb28ade1f0bdf4a20a33998cdc2826974f4b4fc3622e660a598a4f4623046c12009bc3b663aa8701d9361a487334b84c7c2512de7 languageName: node linkType: hard -"@react-pdf/renderer@npm:^3.1.12": - version: 3.1.12 - resolution: "@react-pdf/renderer@npm:3.1.12" +"@react-pdf/renderer@npm:^3.1.14": + version: 3.1.14 + resolution: "@react-pdf/renderer@npm:3.1.14" dependencies: "@babel/runtime": ^7.20.13 - "@react-pdf/font": ^2.3.6 - "@react-pdf/layout": ^3.6.2 + "@react-pdf/font": ^2.3.7 + "@react-pdf/layout": ^3.6.3 "@react-pdf/pdfkit": ^3.0.2 "@react-pdf/primitives": ^3.0.0 - "@react-pdf/render": ^3.2.6 - "@react-pdf/types": ^2.3.3 + "@react-pdf/render": ^3.2.7 + "@react-pdf/types": ^2.3.4 events: ^3.3.0 object-assign: ^4.1.1 prop-types: ^15.6.2 @@ -6784,22 +6704,22 @@ __metadata: scheduler: ^0.17.0 peerDependencies: react: ^16.8.6 || ^17.0.0 || ^18.0.0 - checksum: 7fa9779c8594e8e650fc121de5b89a40268ccab62b89a87c32f110bb4ea97adacd1d0fb2893533e3834613478bed71de2c1161e88e42916862b1523d7f10367e + checksum: f0313c066b5e9f34e87940a86dd344d07347829781407ea9e7d24480213624b8d0457a8258c09b62c6cfe145120f4e06978ebf7d18e7272a2e8a7d21f02c6202 languageName: node linkType: hard -"@react-pdf/stylesheet@npm:^4.1.7": - version: 4.1.7 - resolution: "@react-pdf/stylesheet@npm:4.1.7" +"@react-pdf/stylesheet@npm:^4.1.8": + version: 4.1.8 + resolution: "@react-pdf/stylesheet@npm:4.1.8" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/fns": 2.0.1 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 color-string: ^1.5.3 hsl-to-hex: ^1.0.0 media-engine: ^1.0.3 postcss-value-parser: ^4.1.0 - checksum: f120ebe017fe48db6559105f080619b0f1f37931a87da9d1f3ac64ab75792c320ba08c4ee85e907040546b99e37d62e1571bc2de5e5cbbcf8891a6521b46bd3a + checksum: c5339fdb49ee0420a6633e0955632073440fb0d235f0153164dae17401c5880995cf835c8ca1cf81a23ba83e4377439584ee86d2ab695796f01030791ab4f31f languageName: node linkType: hard @@ -6815,10 +6735,10 @@ __metadata: languageName: node linkType: hard -"@react-pdf/types@npm:^2.3.3": - version: 2.3.3 - resolution: "@react-pdf/types@npm:2.3.3" - checksum: f4d9e5ba0b8481cb485d17922079f320de469500495f9bbd06161fca7e9deb127ea860c38c34f01d1339c519e032c0d9f63ea681c13eeedee2c8ef5cc0b79d19 +"@react-pdf/types@npm:^2.3.4": + version: 2.3.4 + resolution: "@react-pdf/types@npm:2.3.4" + checksum: 3aa1b00581c69b5078fbc946d7c86abc984c2bef6a1b4b51e236be6719efd6773f794d390356df6d8355aa3c1f5a3a4a4bdca1e2d3c31fe3d3bf55250e405b02 languageName: node linkType: hard @@ -7783,10 +7703,10 @@ __metadata: "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": next - "@types/bcrypt": ^5.0.0 - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/bcrypt": ^5.0.1 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 bcrypt: ^5.0.1 ejson: ^2.2.3 eslint: ~8.45.0 @@ -7795,14 +7715,14 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 typescript: ~5.2.2 - uuid: ^9.0.0 + uuid: ^9.0.1 languageName: unknown linkType: soft @@ -7810,9 +7730,9 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/account-utils@workspace:packages/account-utils" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -7822,14 +7742,14 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/agenda@workspace:packages/agenda" dependencies: - "@types/debug": ^4.1.8 - "@types/jest": ~29.5.3 + "@types/debug": ^4.1.10 + "@types/jest": ~29.5.7 cron: ~1.8.2 date.js: ~0.3.3 debug: ~4.1.1 eslint: ~8.45.0 human-interval: ^2.0.1 - jest: ~29.6.1 + jest: ~29.6.4 moment-timezone: ~0.5.43 mongodb: ^4.17.1 ts-jest: ~29.0.5 @@ -7843,13 +7763,13 @@ __metadata: dependencies: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 - "@types/jest": ~29.5.3 - "@types/strict-uri-encode": ^2.0.0 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 + "@types/jest": ~29.5.7 + "@types/strict-uri-encode": ^2.0.1 eslint: ~8.45.0 filter-obj: ^3.0.0 - jest: ~29.6.1 + jest: ~29.6.4 jest-fetch-mock: ^3.0.3 query-string: ^7.1.3 split-on-first: ^3.0.0 @@ -7907,9 +7827,9 @@ __metadata: "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": next - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 eslint: ~8.45.0 event-loop-stats: ^1.4.1 @@ -7917,7 +7837,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 @@ -7931,13 +7851,13 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/base64@workspace:packages/base64" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -7947,10 +7867,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/cas-validate@workspace:packages/cas-validate" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 cheerio: 1.0.0-rc.10 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -7960,9 +7880,9 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/core-services@workspace:packages/core-services" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 - "@babel/preset-typescript": ~7.22.5 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/apps-engine": 1.41.0-alpha.290 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" @@ -7971,14 +7891,14 @@ __metadata: "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/ui-kit": ^0.32.1 - "@types/babel__core": ^7 - "@types/babel__preset-env": ^7 - "@types/fibers": ^3.1.1 - "@types/jest": ~29.5.3 + "@types/babel__core": ^7.20.3 + "@types/babel__preset-env": ^7.9.4 + "@types/fibers": ^3.1.3 + "@types/jest": ~29.5.7 babel-jest: ^29.5.0 eslint: ~8.45.0 fibers: ^5.0.3 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 prettier: ~2.8.8 typescript: ~5.2.2 @@ -8009,9 +7929,9 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/random": "workspace:^" - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -8059,13 +7979,13 @@ __metadata: dependencies: "@rocket.chat/api-client": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 - "@types/jest": ~29.5.3 - "@types/ws": ^8.5.5 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 + "@types/jest": ~29.5.7 + "@types/ws": ^8.5.8 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 jest-websocket-mock: ^2.4.0 typescript: ~5.2.2 ws: ^8.13.0 @@ -8090,14 +8010,14 @@ __metadata: "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": next "@rocket.chat/ui-contexts": "workspace:^" - "@types/ejson": ^2.2.0 - "@types/gc-stats": ^1 - "@types/meteor": ^2.9.2 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/ejson": ^2.2.1 + "@types/gc-stats": ^1.4.2 + "@types/meteor": ^2.9.5 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 "@types/sharp": ^0.30.5 "@types/uuid": ^8.3.4 - "@types/ws": ^8.5.5 + "@types/ws": ^8.5.8 colorette: ^1.4.0 ejson: ^2.2.3 eslint: ~8.45.0 @@ -8107,13 +8027,13 @@ __metadata: gc-stats: ^1.4.0 jaeger-client: ^3.19.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 pino-pretty: ^7.6.1 polka: ^0.5.2 - sharp: ^0.30.7 + sharp: ^0.32.6 ts-node: ^10.9.1 typescript: ~5.2.2 underscore: ^1.13.6 @@ -8134,8 +8054,8 @@ __metadata: resolution: "@rocket.chat/eslint-config@workspace:packages/eslint-config" dependencies: "@babel/core": ^7.20.7 - "@babel/eslint-parser": ~7.22.9 - "@types/eslint": ~8.44.0 + "@babel/eslint-parser": ~7.22.15 + "@types/eslint": ~8.44.6 "@types/prettier": ^2.6.3 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 @@ -8143,7 +8063,7 @@ __metadata: eslint-config-prettier: ~8.8.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-import: ~2.26.0 - eslint-plugin-jest: ~27.2.2 + eslint-plugin-jest: ~27.2.3 eslint-plugin-prettier: ~4.2.1 prettier: ~2.8.8 languageName: unknown @@ -8184,31 +8104,7 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.2": - version: 0.6.0-beta.2 - resolution: "@rocket.chat/forked-matrix-bot-sdk@npm:0.6.0-beta.2" - dependencies: - "@rocket.chat/forked-matrix-sdk-crypto-nodejs": ^0.1.0-beta.12 - "@types/express": ^4.17.13 - another-json: ^0.2.0 - chalk: ^4 - express: ^4.17.2 - glob-to-regexp: ^0.4.1 - hash.js: ^1.1.7 - html-to-text: ^8.1.0 - htmlencode: ^0.0.4 - lowdb: ^1 - lru-cache: ^6.0.0 - mkdirp: ^1.0.4 - morgan: ^1.10.0 - request: ^2.88.2 - request-promise: ^4.2.6 - sanitize-html: ^2.6.1 - checksum: f2ce128ab6d93289d711161c217ad0d2c0b879ae37c8c5527b3aea7294845c19f713f69fccde65d260f07780777be80718b73e8bdc38a6c65cba94a94fd7d85d - languageName: node - linkType: hard - -"@rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.3": +"@rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.2, @rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.3": version: 0.6.0-beta.3 resolution: "@rocket.chat/forked-matrix-bot-sdk@npm:0.6.0-beta.3" dependencies: @@ -8293,10 +8189,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/fuselage-ui-kit@workspace:packages/fuselage-ui-kit" dependencies: - "@babel/core": ~7.22.10 - "@babel/preset-env": ~7.22.10 - "@babel/preset-react": ~7.22.5 - "@babel/preset-typescript": ~7.22.5 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-react": ~7.22.15 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/apps-engine": 1.41.0-alpha.290 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/fuselage": ^0.37.1 @@ -8317,10 +8213,10 @@ __metadata: "@storybook/source-loader": ~6.5.16 "@storybook/theming": ~6.5.16 "@tanstack/react-query": ^4.16.1 - "@types/babel__core": ^7 - "@types/babel__preset-env": ^7 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 + "@types/babel__core": ^7.20.3 + "@types/babel__preset-env": ^7.9.4 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 babel-loader: ~8.2.5 cross-env: ^7.0.3 eslint: ~8.45.0 @@ -8329,6 +8225,7 @@ __metadata: prettier: ~2.8.8 react-docgen-typescript-plugin: ~1.0.5 react-dom: ^17.0.2 + react-i18next: ~13.2.2 rimraf: ^3.0.2 storybook-dark-mode: ~3.0.1 tslib: ^2.5.3 @@ -8342,9 +8239,9 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-contexts": 2.0.5 + "@rocket.chat/ui-contexts": 3.0.0-rc.7 "@rocket.chat/ui-kit": "*" - "@rocket.chat/ui-video-conf": 2.0.5 + "@rocket.chat/ui-video-conf": 3.0.0-rc.7 "@tanstack/react-query": "*" react: "*" react-dom: "*" @@ -8379,7 +8276,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/gazzodown@workspace:packages/gazzodown" dependencies: - "@babel/core": ~7.22.9 + "@babel/core": ~7.22.20 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": next "@rocket.chat/fuselage": ^0.37.1 @@ -8397,15 +8294,15 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 "@testing-library/jest-dom": ^5.16.5 "@testing-library/react": ~12.1.5 - "@types/jest": ~29.5.3 - "@types/katex": ~0.16.0 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/testing-library__jest-dom": ~5.14.6 + "@types/jest": ~29.5.7 + "@types/katex": ~0.16.5 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/testing-library__jest-dom": ~5.14.9 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 babel-loader: ^8.3.0 @@ -8413,12 +8310,12 @@ __metadata: eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 + eslint-plugin-storybook: ~0.6.15 highlight.js: ^11.5.1 identity-obj-proxy: ^3.0.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 - katex: ~0.16.7 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 + katex: ~0.16.9 outdent: ^0.8.0 react-docgen-typescript-plugin: ~1.0.5 react-dom: ~17.0.2 @@ -8432,8 +8329,8 @@ __metadata: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 2.0.5 - "@rocket.chat/ui-contexts": 2.0.5 + "@rocket.chat/ui-client": 3.0.0-rc.7 + "@rocket.chat/ui-contexts": 3.0.0-rc.7 katex: "*" react: "*" languageName: unknown @@ -8443,11 +8340,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/i18n@workspace:packages/i18n" dependencies: - "@babel/core": ~7.22.10 - "@babel/preset-env": ~7.22.10 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 babel-jest: ^29.5.0 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 tsup: ^6.7.0 typescript: ~5.2.2 @@ -8478,9 +8375,9 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/jwt@workspace:packages/jwt" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 jose: ^4.14.4 ts-jest: ^29.1.1 typescript: ~5.2.2 @@ -8506,15 +8403,15 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/jwt": "workspace:^" "@rocket.chat/logger": "workspace:^" - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 - "@types/bcrypt": ^5.0.0 - "@types/jest": ~29.5.3 - "@types/ws": ^8.5.5 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 + "@types/bcrypt": ^5.0.1 + "@types/jest": ~29.5.7 + "@types/ws": ^8.5.8 bcrypt: ^5.0.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 jest-websocket-mock: ^2.4.0 ts-jest: ~29.0.5 typescript: ^5.2.2 @@ -8525,9 +8422,9 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/livechat@workspace:packages/livechat" dependencies: - "@babel/eslint-parser": ~7.22.9 - "@babel/preset-env": ~7.22.9 - "@babel/preset-typescript": ~7.22.5 + "@babel/eslint-parser": ~7.22.15 + "@babel/preset-env": ~7.22.20 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/ddp-client": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" @@ -8542,10 +8439,10 @@ __metadata: "@storybook/addon-postcss": ~2.0.0 "@storybook/preact": ~6.5.16 "@storybook/theming": ~6.5.16 - "@types/crypto-js": ~4.1.1 + "@types/crypto-js": ~4.1.3 "@types/mini-css-extract-plugin": ~1.4.3 "@types/webpack": ^5.28.4 - "@types/webpack-bundle-analyzer": ^4 + "@types/webpack-bundle-analyzer": ^4.6.2 "@types/webpack-dev-server": ~4.7.2 "@types/whatwg-fetch": ~0.0.33 "@typescript-eslint/eslint-plugin": ~5.60.1 @@ -8568,7 +8465,7 @@ __metadata: history: ~5.3.0 html-webpack-plugin: ^5.5.3 husky: ^4.3.8 - i18next: ~23.4.5 + i18next: ~23.4.9 if-env: ^1.0.4 image-webpack-loader: ~8.1.0 lorem-ipsum: ^2.0.8 @@ -8583,14 +8480,14 @@ __metadata: postcss-ie11-supports: ^0.1.3 postcss-loader: ^3.0.0 postcss-logical: ^4.0.2 - postcss-scss: ^4.0.6 + postcss-scss: ^4.0.9 postcss-selector-not: ^4.0.1 preact: 10.15.1 preact-router: ^3.2.1 query-string: ^7.1.3 react-dom: ~17.0.2 react-hook-form: ~7.45.4 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 rimraf: ^3.0.2 sass: ~1.62.1 sass-loader: ~10.4.1 @@ -8603,10 +8500,10 @@ __metadata: typescript: ~5.2.2 url-loader: ^4.1.1 webpack: ^5.89.0 - webpack-bundle-analyzer: ^4.9.0 + webpack-bundle-analyzer: ^4.9.1 webpack-cli: ^5.1.4 webpack-dev-server: ~4.13.3 - whatwg-fetch: ^3.6.2 + whatwg-fetch: ^3.6.19 peerDependencies: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/logo": "*" @@ -8618,12 +8515,12 @@ __metadata: resolution: "@rocket.chat/log-format@workspace:packages/log-format" dependencies: "@types/chalk": ^2.2.0 - "@types/ejson": ^2.2.0 - "@types/jest": ~29.5.3 + "@types/ejson": ^2.2.1 + "@types/jest": ~29.5.7 chalk: ^4.0.0 ejson: ^2.2.3 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -8634,9 +8531,9 @@ __metadata: resolution: "@rocket.chat/logger@workspace:packages/logger" dependencies: "@rocket.chat/emitter": next - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 pino: ^8.15.0 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -8684,14 +8581,14 @@ __metadata: resolution: "@rocket.chat/meteor@workspace:apps/meteor" dependencies: "@axe-core/playwright": ^4.7.3 - "@babel/core": ~7.22.9 - "@babel/eslint-parser": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/eslint-parser": ~7.22.15 "@babel/plugin-proposal-nullish-coalescing-operator": ~7.18.6 "@babel/plugin-proposal-optional-chaining": ~7.21.0 - "@babel/preset-env": ~7.22.9 - "@babel/preset-react": ~7.22.5 - "@babel/register": ~7.22.5 - "@babel/runtime": ~7.22.6 + "@babel/preset-env": ~7.22.20 + "@babel/preset-react": ~7.22.15 + "@babel/register": ~7.22.15 + "@babel/runtime": ~7.22.15 "@bugsnag/js": ~7.20.2 "@bugsnag/plugin-react": ~7.19.0 "@faker-js/faker": ~8.0.2 @@ -8704,7 +8601,7 @@ __metadata: "@nivo/pie": 0.80.0 "@playwright/test": ^1.37.1 "@react-aria/color": ^3.0.0-beta.15 - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/account-utils": "workspace:^" "@rocket.chat/agenda": "workspace:^" "@rocket.chat/api-client": "workspace:^" @@ -8773,89 +8670,89 @@ __metadata: "@storybook/addons": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": 0.0.13 - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 "@tanstack/react-query": ^4.16.1 "@tanstack/react-query-devtools": ^4.19.1 "@testing-library/react": ~12.1.5 "@testing-library/react-hooks": ^8.0.1 "@testing-library/user-event": ~13.5.0 - "@types/adm-zip": ^0.5.0 - "@types/archiver": ^5.3.2 - "@types/bad-words": ^3.0.1 - "@types/bcrypt": ^5.0.0 - "@types/body-parser": ^1.19.2 - "@types/busboy": ^1.5.0 - "@types/chai": ^4.3.5 - "@types/chai-as-promised": ^7.1.5 - "@types/chai-datetime": 0.0.37 - "@types/chai-dom": 0.0.13 - "@types/chai-spies": ~1.0.3 + "@types/adm-zip": ^0.5.3 + "@types/archiver": ^5.3.4 + "@types/bad-words": ^3.0.2 + "@types/bcrypt": ^5.0.1 + "@types/body-parser": ^1.19.4 + "@types/busboy": ^1.5.2 + "@types/chai": ^4.3.9 + "@types/chai-as-promised": ^7.1.7 + "@types/chai-datetime": 0.0.38 + "@types/chai-dom": 1.11.2 + "@types/chai-spies": ~1.0.5 "@types/clipboard": ^2.0.7 - "@types/codemirror": ^5.60.8 - "@types/cookie": ^0.5.1 - "@types/cookie-parser": ^1.4.3 - "@types/cors": ^2.8.13 - "@types/cssom": ^0.4.1 + "@types/codemirror": ^5.60.12 + "@types/cookie": ^0.5.3 + "@types/cookie-parser": ^1.4.5 + "@types/cors": ^2.8.15 + "@types/cssom": ^0.4.2 "@types/dompurify": ^2.3.3 - "@types/ejson": ^2.2.0 - "@types/express": ^4.17.17 + "@types/ejson": ^2.2.1 + "@types/express": ^4.17.20 "@types/express-rate-limit": ^5.1.3 - "@types/fibers": ^3.1.1 - "@types/google-libphonenumber": ^7.4.23 - "@types/gravatar": ^1.8.3 + "@types/fibers": ^3.1.3 + "@types/google-libphonenumber": ^7.4.29 + "@types/gravatar": ^1.8.5 "@types/he": ^1.1.2 - "@types/i18next-sprintf-postprocessor": ^0.2.0 - "@types/imap": ^0.8.37 + "@types/i18next-sprintf-postprocessor": ^0.2.2 + "@types/imap": ^0.8.39 "@types/jsdom": ^16.2.15 - "@types/jsdom-global": ^3.0.4 - "@types/jsrsasign": ^10.5.8 + "@types/jsdom-global": ^3.0.6 + "@types/jsrsasign": ^10.5.11 "@types/katex": ^0.14.0 - "@types/later": ^1.2.7 + "@types/later": ^1.2.8 "@types/ldapjs": ^2.2.5 - "@types/less": ~3.0.3 - "@types/lodash": ^4.14.195 - "@types/lodash.debounce": ^4.0.7 - "@types/lodash.get": ^4.4.7 - "@types/mailparser": ^3.4.0 + "@types/less": ~3.0.5 + "@types/lodash": ^4.14.200 + "@types/lodash.debounce": ^4.0.8 + "@types/lodash.get": ^4.4.8 + "@types/mailparser": ^3.4.3 "@types/marked": ^4.0.8 - "@types/meteor-collection-hooks": ^0.8.6 + "@types/meteor-collection-hooks": ^0.8.8 "@types/mkdirp": ^1.0.2 "@types/mocha": "github:whitecolor/mocha-types" "@types/moment-timezone": ^0.5.30 - "@types/node": ^14.18.51 - "@types/node-gcm": ^1.0.1 - "@types/node-rsa": ^1.1.1 - "@types/nodemailer": ^6.4.8 - "@types/oauth2-server": ^3.0.13 - "@types/object-path": ^0.11.1 - "@types/parseurl": ^1.3.1 - "@types/photoswipe": ^4.1.2 - "@types/prometheus-gc-stats": ^0.6.2 - "@types/proxy-from-env": ^1.0.1 - "@types/proxyquire": ^1.3.28 - "@types/psl": ^1.1.0 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/rewire": ^2.5.28 - "@types/sanitize-html": ^2.9.0 + "@types/node": ^14.18.63 + "@types/node-gcm": ^1.0.3 + "@types/node-rsa": ^1.1.3 + "@types/nodemailer": ^6.4.13 + "@types/oauth2-server": ^3.0.15 + "@types/object-path": ^0.11.3 + "@types/parseurl": ^1.3.2 + "@types/photoswipe": ^4.1.5 + "@types/prometheus-gc-stats": ^0.6.3 + "@types/proxy-from-env": ^1.0.3 + "@types/proxyquire": ^1.3.30 + "@types/psl": ^1.1.2 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/rewire": ^2.5.29 + "@types/sanitize-html": ^2.9.3 "@types/semver": ^7.3.10 "@types/sharp": ^0.30.5 - "@types/sinon": ^10.0.15 - "@types/speakeasy": ^2.0.7 - "@types/strict-uri-encode": ^2.0.0 + "@types/sinon": ^10.0.20 + "@types/speakeasy": ^2.0.9 + "@types/strict-uri-encode": ^2.0.1 "@types/string-strip-html": ^5.0.1 - "@types/supertest": ^2.0.12 - "@types/textarea-caret": ^3.0.1 - "@types/ua-parser-js": ^0.7.36 - "@types/use-subscription": ^1.0.0 - "@types/use-sync-external-store": ^0.0.3 + "@types/supertest": ^2.0.15 + "@types/textarea-caret": ^3.0.2 + "@types/ua-parser-js": ^0.7.38 + "@types/use-subscription": ^1.0.1 + "@types/use-sync-external-store": ^0.0.5 "@types/uuid": ^8.3.4 - "@types/xml-crypto": ~1.4.2 - "@types/xml-encryption": ~1.2.1 + "@types/xml-crypto": ~1.4.4 + "@types/xml-encryption": ~1.2.3 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 - "@xmldom/xmldom": ^0.8.8 + "@xmldom/xmldom": ^0.8.10 adm-zip: 0.5.10 ajv: ^8.11.0 ajv-formats: ~2.1.1 @@ -8875,7 +8772,7 @@ __metadata: bson: ^4.6.4 busboy: ^1.6.0 bytebuffer: 5.0.1 - chai: ^4.3.7 + chai: ^4.3.10 chai-as-promised: ^7.1.1 chai-datetime: ^1.8.0 chai-dom: ^1.11.0 @@ -8884,7 +8781,7 @@ __metadata: change-case: ^4.1.2 chart.js: ^3.8.0 clipboard: ^2.0.11 - codemirror: ^5.65.13 + codemirror: ^5.65.15 colorette: ^2.0.20 colors: ^1.4.0 connect: ^3.7.0 @@ -8909,11 +8806,11 @@ __metadata: eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-import: ~2.26.0 eslint-plugin-no-floating-promise: ~1.0.2 - eslint-plugin-playwright: ~0.15.0 + eslint-plugin-playwright: ~0.15.3 eslint-plugin-prettier: ~4.2.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-testing-library: ~5.11.0 + eslint-plugin-testing-library: ~5.11.1 eslint-plugin-you-dont-need-lodash-underscore: ~6.12.0 eventemitter3: ^4.0.7 exif-be-gone: ^1.3.2 @@ -8926,8 +8823,8 @@ __metadata: file-type: ^16.5.4 filenamify: ^4.3.0 filesize: 9.0.11 - generate-password: ^1.7.0 - google-libphonenumber: ^3.2.32 + generate-password: ^1.7.1 + google-libphonenumber: ^3.2.33 googleapis: ^104.0.0 gravatar: ^1.8.2 he: ^1.2.0 @@ -8935,7 +8832,7 @@ __metadata: hljs9: "npm:highlight.js@^9.18.5" http-proxy-agent: ^5.0.0 human-interval: ^2.0.1 - i18next: ~23.4.5 + i18next: ~23.4.9 i18next-http-backend: ^1.4.5 i18next-sprintf-postprocessor: ^0.2.2 iconv-lite: ^0.6.3 @@ -8944,14 +8841,14 @@ __metadata: ip-range-check: ^0.2.0 is-svg: ^4.3.2 isolated-vm: 4.4.2 - jest: ~29.6.1 + jest: ~29.6.4 jquery: ^3.6.0 jschardet: ^3.0.0 jsdom: ^16.7.0 jsdom-global: ^3.0.2 jsrsasign: ^10.5.24 juice: ^8.0.0 - katex: ^0.16.7 + katex: ~0.16.9 ldap-escape: ^2.0.6 ldapjs: ^2.3.3 limax: ^3.0.0 @@ -8967,7 +8864,7 @@ __metadata: mime-type: ^4.0.0 mkdirp: ^1.0.4 mocha: ^9.2.2 - moleculer: ^0.14.29 + moleculer: ^0.14.31 moment: ^2.29.4 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 @@ -8989,8 +8886,8 @@ __metadata: photoswipe: ^4.1.3 pino: ^8.15.0 pino-pretty: ^7.6.1 - playwright-qase-reporter: ^1.2.0-alpha.3 - postcss: ~8.4.24 + playwright-qase-reporter: ^1.2.1 + postcss: ~8.4.31 postcss-custom-properties: ^11.0.0 postcss-easy-import: ^3.0.0 postcss-load-config: ^3.1.4 @@ -9000,27 +8897,27 @@ __metadata: postis: ^2.2.0 prettier: ~2.8.8 prom-client: ^14.0.1 - prometheus-gc-stats: ^0.6.4 + prometheus-gc-stats: ^0.6.5 proxy-from-env: ^1.1.0 proxyquire: ^2.1.3 psl: ^1.8.0 query-string: ^7.1.3 queue-fifo: ^0.2.6 - rc-scrollbars: ^1.1.5 + rc-scrollbars: ^1.1.6 react: ~17.0.2 react-aria: ~3.23.1 react-docgen-typescript-plugin: ^1.0.5 react-dom: ~17.0.2 react-error-boundary: ^3.1.4 react-hook-form: ~7.45.4 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 react-keyed-flatten-children: ^1.3.0 react-virtuoso: ^1.11.1 redis: ^4.0.6 rewire: ^6.0.0 sanitize-html: ^2.7.2 semver: ^7.3.7 - sharp: ^0.30.7 + sharp: ^0.32.6 sinon: ^14.0.2 sip.js: ^0.20.1 sodium-native: ^3.3.0 @@ -9043,7 +8940,7 @@ __metadata: twilio: ^3.76.1 twit: ^2.2.11 typescript: ~5.2.2 - ua-parser-js: ^1.0.35 + ua-parser-js: ^1.0.37 underscore: ^1.13.6 universal-perf-hooks: ^1.0.1 url-polyfill: ^1.1.12 @@ -9051,7 +8948,7 @@ __metadata: use-sync-external-store: ^1.2.0 uuid: ^8.3.2 vm2: ^3.9.19 - webdav: ^4.11.2 + webdav: ^4.11.3 xml-crypto: ~3.1.0 xml-encryption: ~3.0.2 xml2js: ~0.5.0 @@ -9067,12 +8964,12 @@ __metadata: "@rocket.chat/ui-contexts": "workspace:*" "@storybook/react": ~6.5.16 "@tanstack/react-query": ^4.16.1 - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - i18next: ~23.4.5 - jest: ~29.6.1 + i18next: ~23.4.9 + jest: ~29.6.4 react: ~17.0.2 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 ts-jest: ~29.0.5 typescript: ~5.2.2 peerDependencies: @@ -9086,10 +8983,10 @@ __metadata: resolution: "@rocket.chat/model-typings@workspace:packages/model-typings" dependencies: "@rocket.chat/core-typings": "workspace:^" - "@types/jest": ~29.5.3 - "@types/node-rsa": ^1.1.1 + "@types/jest": ~29.5.7 + "@types/node-rsa": ^1.1.3 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -9101,9 +8998,9 @@ __metadata: resolution: "@rocket.chat/models@workspace:packages/models" dependencies: "@rocket.chat/model-typings": "workspace:^" - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -9133,14 +9030,14 @@ __metadata: "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": next "@rocket.chat/tools": "workspace:^" - "@types/jest": ~29.5.3 - "@types/node": ^14.18.51 + "@types/jest": ~29.5.7 + "@types/node": ^14.18.63 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 eventemitter3: ^4.0.7 fibers: ^5.0.3 - jest: ~29.6.1 + jest: ~29.6.4 mem: ^8.1.1 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 @@ -9155,7 +9052,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/omnichannel-transcript@workspace:ee/apps/omnichannel-transcript" dependencies: - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": next @@ -9167,9 +9064,9 @@ __metadata: "@rocket.chat/pdf-worker": "workspace:^" "@rocket.chat/tools": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 @@ -9178,7 +9075,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 mongodb: ^4.17.1 @@ -9215,11 +9112,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/password-policies@workspace:packages/password-policies" dependencies: - "@types/chai": ^4.3.5 - "@types/jest": ~29.5.3 - chai: ^4.3.7 + "@types/chai": ^4.3.9 + "@types/jest": ~29.5.7 + chai: ^4.3.10 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -9229,23 +9126,23 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/pdf-worker@workspace:ee/packages/pdf-worker" dependencies: - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/fuselage-tokens": ^0.32.0 "@storybook/addon-essentials": ~6.5.16 "@storybook/react": ~6.5.16 "@testing-library/jest-dom": ^5.16.5 "@testing-library/react": ~13.4.0 - "@types/emojione": ^2.2.6 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/testing-library__jest-dom": ~5.14.6 + "@types/emojione": ^2.2.8 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/testing-library__jest-dom": ~5.14.9 emoji-assets: ^7.0.1 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 moment: ^2.29.4 moment-timezone: ^0.5.43 react: ^18.2.0 @@ -9259,9 +9156,9 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/poplib@workspace:packages/node-poplib" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -9279,9 +9176,9 @@ __metadata: "@rocket.chat/models": "workspace:^" "@rocket.chat/presence": "workspace:^" "@rocket.chat/string-helpers": next - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 eslint: ~8.45.0 event-loop-stats: ^1.4.1 @@ -9289,7 +9186,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 @@ -9303,19 +9200,19 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/presence@workspace:ee/packages/presence" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 - "@babel/preset-typescript": ~7.22.5 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/apps-engine": 1.41.0-alpha.290 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@types/node": ^14.18.51 + "@types/node": ^14.18.63 babel-jest: ^29.0.3 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 typescript: ~5.2.2 languageName: unknown @@ -9334,7 +9231,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/queue-worker@workspace:ee/apps/queue-worker" dependencies: - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": next @@ -9343,9 +9240,9 @@ __metadata: "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/omnichannel-services": "workspace:^" - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 @@ -9354,7 +9251,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 mongodb: ^4.17.1 @@ -9370,14 +9267,14 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/random@workspace:packages/random" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -9387,12 +9284,12 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/release-action@workspace:packages/release-action" dependencies: - "@actions/core": ^1.10.0 + "@actions/core": ^1.10.1 "@actions/exec": ^1.1.1 "@actions/github": ^5.1.1 "@octokit/plugin-throttling": ^6.0.0 "@rocket.chat/eslint-config": "workspace:^" - "@types/node": ^16.18.36 + "@types/node": ^16.18.60 eslint: ~8.45.0 mdast-util-to-string: 2.0.0 remark-parse: 9.0.0 @@ -9413,12 +9310,12 @@ __metadata: "@rocket.chat/license": "workspace:^" "@rocket.chat/message-parser": next "@rocket.chat/ui-kit": ^0.32.1 - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 ajv: ^8.11.0 ajv-formats: ^2.1.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 mongodb: ^4.17.1 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -9443,9 +9340,9 @@ __metadata: resolution: "@rocket.chat/server-cloud-communication@workspace:packages/server-cloud-communication" dependencies: "@rocket.chat/license": "workspace:^" - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.1.6 languageName: unknown @@ -9455,12 +9352,12 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/server-fetch@workspace:packages/server-fetch" dependencies: - "@types/jest": ~29.5.3 - "@types/proxy-from-env": ^1.0.1 + "@types/jest": ~29.5.7 + "@types/proxy-from-env": ^1.0.3 eslint: ~8.45.0 http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.1 - jest: ~29.6.1 + jest: ~29.6.4 node-fetch: 2.3.0 proxy-from-env: ^1.1.0 ts-jest: ~29.0.5 @@ -9472,13 +9369,13 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/sha256@workspace:packages/sha256" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 ts-jest: ~29.0.5 typescript: ~5.2.2 languageName: unknown @@ -9497,10 +9394,10 @@ __metadata: "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": next - "@types/bcrypt": ^5.0.0 - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/bcrypt": ^5.0.1 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 eslint: ~8.45.0 event-loop-stats: ^1.4.1 @@ -9508,7 +9405,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 @@ -9554,13 +9451,13 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/tools@workspace:^, @rocket.chat/tools@workspace:packages/tools": +"@rocket.chat/tools@workspace:^, @rocket.chat/tools@workspace:packages/tools, @rocket.chat/tools@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/tools@workspace:packages/tools" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 moment-timezone: ^0.5.43 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -9571,7 +9468,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-client@workspace:packages/ui-client" dependencies: - "@babel/core": ~7.22.9 + "@babel/core": ~7.22.20 "@rocket.chat/css-in-js": next "@rocket.chat/fuselage": ^0.37.1 "@rocket.chat/fuselage-hooks": ^0.32.1 @@ -9588,21 +9485,21 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@swc/jest": ^0.2.26 + "@swc/jest": ^0.2.29 "@testing-library/jest-dom": ~5.16.5 - "@testing-library/react": ^12.1.2 + "@testing-library/react": ^12.1.5 "@testing-library/react-hooks": ^8.0.1 - "@types/babel__core": ~7.20.1 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 + "@types/babel__core": ~7.20.3 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 eslint: ~8.45.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 - eslint-plugin-testing-library: ~5.11.0 - jest: ~29.6.1 + eslint-plugin-storybook: ~0.6.15 + eslint-plugin-testing-library: ~5.11.1 + jest: ~29.6.4 react: ^17.0.2 react-dom: ^17.0.2 react-hook-form: ~7.45.4 @@ -9613,7 +9510,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 2.0.5 + "@rocket.chat/ui-contexts": 3.0.0-rc.7 react: ~17.0.2 languageName: unknown linkType: soft @@ -9622,7 +9519,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-composer@workspace:packages/ui-composer" dependencies: - "@babel/core": ~7.22.9 + "@babel/core": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/fuselage": ^0.37.1 "@rocket.chat/icons": ^0.32.0 @@ -9633,13 +9530,13 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@types/babel__core": ~7.20.1 - "@types/jest": ~29.5.3 + "@types/babel__core": ~7.20.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 - jest: ~29.6.1 + eslint-plugin-storybook: ~0.6.15 + jest: ~29.6.4 react-docgen-typescript-plugin: ~1.0.5 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -9660,13 +9557,13 @@ __metadata: "@rocket.chat/fuselage-hooks": ^0.32.1 "@rocket.chat/password-policies": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/use-sync-external-store": ^0.0.3 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/use-sync-external-store": ^0.0.5 eslint: ~8.45.0 eslint-plugin-react-hooks: ^4.6.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 react: ~17.0.2 ts-jest: ~29.0.5 @@ -9709,14 +9606,14 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 eslint: ~8.45.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-testing-library: ^5.11.0 - jest: ~29.6.1 + eslint-plugin-testing-library: ^5.11.1 + jest: ~29.6.4 react: ~17.0.2 react-docgen-typescript-plugin: ~1.0.5 ts-jest: ~29.0.5 @@ -9734,7 +9631,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-video-conf@workspace:packages/ui-video-conf" dependencies: - "@babel/core": ~7.22.9 + "@babel/core": ~7.22.20 "@rocket.chat/css-in-js": next "@rocket.chat/emitter": next "@rocket.chat/eslint-config": "workspace:^" @@ -9750,13 +9647,13 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@types/babel__core": ~7.20.1 - "@types/jest": ~29.5.3 + "@types/babel__core": ~7.20.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 - jest: ~29.6.1 + eslint-plugin-storybook: ~0.6.15 + jest: ~29.6.4 react-docgen-typescript-plugin: ~1.0.5 ts-jest: ~29.0.5 typescript: ~5.2.2 @@ -9766,7 +9663,7 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-contexts": 2.0.5 + "@rocket.chat/ui-contexts": 3.0.0-rc.7 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -9790,17 +9687,17 @@ __metadata: "@rocket.chat/logo": ^0.31.28 "@rocket.chat/styled": next "@rocket.chat/ui-contexts": "workspace:~" - "@types/react": ~17.0.62 - "@types/react-beautiful-dnd": ^13.1.4 - "@types/react-dom": ~17.0.20 - "@types/use-subscription": ^1.0.0 + "@types/react": ~17.0.69 + "@types/react-beautiful-dnd": ^13.1.6 + "@types/react-dom": ~17.0.22 + "@types/use-subscription": ^1.0.1 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 "@vitejs/plugin-react": ^4.0.0 codemirror: ^6.0.1 eslint: ~8.45.0 eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-react-refresh: ^0.4.1 + eslint-plugin-react-refresh: ^0.4.4 eslint4b-prebuilt: ^6.7.2 rc-scrollbars: ^1.1.6 react: ^17.0.2 @@ -9819,13 +9716,14 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/web-ui-registration@workspace:packages/web-ui-registration" dependencies: - "@babel/core": ~7.22.10 - "@babel/preset-env": ~7.22.10 - "@babel/preset-react": ~7.22.5 - "@babel/preset-typescript": ~7.22.5 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-react": ~7.22.15 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/i18n": "workspace:~" "@rocket.chat/layout": next "@rocket.chat/mock-providers": "workspace:~" + "@rocket.chat/tools": "workspace:~" "@rocket.chat/ui-client": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" "@storybook/addon-actions": ~6.5.16 @@ -9834,23 +9732,24 @@ __metadata: "@storybook/builder-webpack4": ~6.5.16 "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 - "@storybook/testing-library": ^0.2.0 + "@storybook/testing-library": ^0.2.2 "@tanstack/react-query": ^4.16.1 "@testing-library/react": ^13.3.0 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 babel-loader: ~8.3.0 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 react: ~17.0.2 react-hook-form: ~7.45.4 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 storybook-dark-mode: ~3.0.1 ts-jest: ~29.0.5 typescript: ~5.2.2 peerDependencies: "@rocket.chat/layout": "*" - "@rocket.chat/ui-contexts": 2.0.5 + "@rocket.chat/tools": "*" + "@rocket.chat/ui-contexts": 3.0.0-rc.7 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" @@ -11614,14 +11513,14 @@ __metadata: languageName: node linkType: hard -"@storybook/testing-library@npm:^0.2.0": - version: 0.2.0 - resolution: "@storybook/testing-library@npm:0.2.0" +"@storybook/testing-library@npm:^0.2.2": + version: 0.2.2 + resolution: "@storybook/testing-library@npm:0.2.2" dependencies: "@testing-library/dom": ^9.0.0 - "@testing-library/user-event": ^14.0.0 + "@testing-library/user-event": ^14.4.0 ts-dedent: ^2.2.0 - checksum: 1c1c16aea6f961de344f5d43bdfd2847bc5f44df1037c2e1383312bb6b842e2c17a805670fc9cfe1a8425f9e48e240fe5d025ab3d4802a198cfe9eb6ed8e7636 + checksum: 8ccdc1fbbb3472264c56b0aaf2f1c5d273f1ae9b230a53adf9cf82bf82c1a555550894f0e8869c206fa07b1fe8423da4d56590377756c58de3ec560b35a96c46 languageName: node linkType: hard @@ -11692,90 +11591,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-darwin-arm64@npm:1.3.66" +"@swc/core-darwin-arm64@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-darwin-arm64@npm:1.3.95" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-darwin-x64@npm:1.3.66" +"@swc/core-darwin-x64@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-darwin-x64@npm:1.3.95" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.66" +"@swc/core-linux-arm-gnueabihf@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.95" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.66" +"@swc/core-linux-arm64-gnu@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.95" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.66" +"@swc/core-linux-arm64-musl@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.95" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.66" +"@swc/core-linux-x64-gnu@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.95" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-x64-musl@npm:1.3.66" +"@swc/core-linux-x64-musl@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-x64-musl@npm:1.3.95" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.66" +"@swc/core-win32-arm64-msvc@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.95" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.66" +"@swc/core-win32-ia32-msvc@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.95" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.66" +"@swc/core-win32-x64-msvc@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.95" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.3.66": - version: 1.3.66 - resolution: "@swc/core@npm:1.3.66" +"@swc/core@npm:^1.3.95": + version: 1.3.95 + resolution: "@swc/core@npm:1.3.95" dependencies: - "@swc/core-darwin-arm64": 1.3.66 - "@swc/core-darwin-x64": 1.3.66 - "@swc/core-linux-arm-gnueabihf": 1.3.66 - "@swc/core-linux-arm64-gnu": 1.3.66 - "@swc/core-linux-arm64-musl": 1.3.66 - "@swc/core-linux-x64-gnu": 1.3.66 - "@swc/core-linux-x64-musl": 1.3.66 - "@swc/core-win32-arm64-msvc": 1.3.66 - "@swc/core-win32-ia32-msvc": 1.3.66 - "@swc/core-win32-x64-msvc": 1.3.66 + "@swc/core-darwin-arm64": 1.3.95 + "@swc/core-darwin-x64": 1.3.95 + "@swc/core-linux-arm-gnueabihf": 1.3.95 + "@swc/core-linux-arm64-gnu": 1.3.95 + "@swc/core-linux-arm64-musl": 1.3.95 + "@swc/core-linux-x64-gnu": 1.3.95 + "@swc/core-linux-x64-musl": 1.3.95 + "@swc/core-win32-arm64-msvc": 1.3.95 + "@swc/core-win32-ia32-msvc": 1.3.95 + "@swc/core-win32-x64-msvc": 1.3.95 + "@swc/counter": ^0.1.1 + "@swc/types": ^0.1.5 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -11802,7 +11703,14 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: e6029c648ba47c522bed51a9f2fee606f82de1f9233e2e89197e43b0a4867054174ca05e825e688cdc4de332221c0da2e12ba7ba875549e8b5432aa70fe19263 + checksum: 49856ad64fa16151f7f784956c8134060c5ed612c9b3fcb79e33676c77219f61fa3bb6b9e0dd15d78c7bff92cacc0c944d2b4e60849eb93caca917a8544b1c2c + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.1": + version: 0.1.2 + resolution: "@swc/counter@npm:0.1.2" + checksum: 8427c594f1f0cf44b83885e9c8fe1e370c9db44ae96e07a37c117a6260ee97797d0709483efbcc244e77bac578690215f45b23254c4cd8a70fb25ddbb50bf33e languageName: node linkType: hard @@ -11815,15 +11723,22 @@ __metadata: languageName: node linkType: hard -"@swc/jest@npm:^0.2.26": - version: 0.2.26 - resolution: "@swc/jest@npm:0.2.26" +"@swc/jest@npm:^0.2.29": + version: 0.2.29 + resolution: "@swc/jest@npm:0.2.29" dependencies: "@jest/create-cache-key-function": ^27.4.2 jsonc-parser: ^3.2.0 peerDependencies: "@swc/core": "*" - checksum: 771821ed08cf168ca0b6307dee7689253d0af0685acd08408ac431860a7c42ace892db2cb6bb6dcfe297edbdce0f2e22d44ed4ed72d1c621be9e841cffd408a0 + checksum: 9eaad322310f34e81f67d41411a7d60663341af1bd9fb65456faa914c936d849d6f643fa3b942a187d52e71e62c33097098c639d25c2047fa874f49bf51cec76 + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.5": + version: 0.1.5 + resolution: "@swc/types@npm:0.1.5" + checksum: 6aee11f62d3d805a64848e0bd5f0e0e615f958e327a9e1260056c368d7d28764d89e38bd8005a536c9bf18afbcd303edd84099d60df34a2975d62540f61df13b languageName: node linkType: hard @@ -11948,7 +11863,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^12.1.2, @testing-library/react@npm:~12.1.5": +"@testing-library/react@npm:^12.1.5, @testing-library/react@npm:~12.1.5": version: 12.1.5 resolution: "@testing-library/react@npm:12.1.5" dependencies: @@ -11987,12 +11902,12 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^14.0.0": - version: 14.4.3 - resolution: "@testing-library/user-event@npm:14.4.3" +"@testing-library/user-event@npm:^14.4.0": + version: 14.5.1 + resolution: "@testing-library/user-event@npm:14.5.1" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: 852c48ea6db1c9471b18276617c84fec4320771e466cd58339a732ca3fd73ad35e5a43ae14f51af51a8d0a150dcf60fcaab049ef367871207bea8f92c4b8195e + checksum: 3e6bc9fd53dfe2f3648190193ed2fd4bca2a1bfb47f68810df3b33f05412526e5fd5c4ef9dc5375635e0f4cdf1859916867b597eed22bda1321e04242ea6c519 languageName: node linkType: hard @@ -12052,21 +11967,21 @@ __metadata: languageName: node linkType: hard -"@types/adm-zip@npm:^0.5.0": - version: 0.5.0 - resolution: "@types/adm-zip@npm:0.5.0" +"@types/adm-zip@npm:^0.5.3": + version: 0.5.3 + resolution: "@types/adm-zip@npm:0.5.3" dependencies: "@types/node": "*" - checksum: 11dd013584e47d431bdf7c115b73cd3162c1a1eca0fbb911f691c9734e904cfe4a01ac1d2d3cbf76d0a952e01fcce8a01fd6fb1c150675a29d740a7fb15325b2 + checksum: 995e21441cc6fe180f12ebf4e722bc6dbde0f9c765e57353018a0969a27cf15542c3f5451bfa1a82b958d5ed5e371fb3cbe55f934076dae22d8bf6a259a536bf languageName: node linkType: hard -"@types/archiver@npm:^5.3.2": - version: 5.3.2 - resolution: "@types/archiver@npm:5.3.2" +"@types/archiver@npm:^5.3.4": + version: 5.3.4 + resolution: "@types/archiver@npm:5.3.4" dependencies: "@types/readdir-glob": "*" - checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c + checksum: 4ef27b99091ada9b8f13017d5b9e6d42a439e35a7858b30e040c408e081d98d8db6307b0762500288b5da38cab9823c4756b6abae1fdd2658d42bfb09eb7c5fb languageName: node linkType: hard @@ -12084,16 +11999,16 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7, @types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:~7.20.1": - version: 7.20.1 - resolution: "@types/babel__core@npm:7.20.1" +"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.3, @types/babel__core@npm:~7.20.3": + version: 7.20.3 + resolution: "@types/babel__core@npm:7.20.3" dependencies: "@babel/parser": ^7.20.7 "@babel/types": ^7.20.7 "@types/babel__generator": "*" "@types/babel__template": "*" "@types/babel__traverse": "*" - checksum: 9fcd9691a33074802d9057ff70b0e3ff3778f52470475b68698a0f6714fbe2ccb36c16b43dc924eb978cd8a81c1f845e5ff4699e7a47606043b539eb8c6331a8 + checksum: 8d14acc14d99b4b8bf36c00da368f6d597bd9ae3344aa7048f83f0f701b0463fa7c7bf2e50c3e4382fdbcfd1e4187b3452a0f0888b0f3ae8fad975591f7bdb94 languageName: node linkType: hard @@ -12106,10 +12021,10 @@ __metadata: languageName: node linkType: hard -"@types/babel__preset-env@npm:^7": - version: 7.9.2 - resolution: "@types/babel__preset-env@npm:7.9.2" - checksum: a905ed92a3f602384966153e74a94790425e98af54e392a7fcfb5c5ded2f2a58c49a9fa64a0cb506fbffb8169ad25b56ea87983c812a4fb880f0716668c8c085 +"@types/babel__preset-env@npm:^7.9.4": + version: 7.9.4 + resolution: "@types/babel__preset-env@npm:7.9.4" + checksum: a4580b541d4fe7bdf9ecb9695cb90827f96c75e5c807e6fcf6cbca3beeb9106019dc322b2d08de03025d57c6f3f1431d80eb3ea6d9416e90bc8ee15460efa27d languageName: node linkType: hard @@ -12132,29 +12047,29 @@ __metadata: languageName: node linkType: hard -"@types/bad-words@npm:^3.0.1": - version: 3.0.1 - resolution: "@types/bad-words@npm:3.0.1" - checksum: c700fadd2bafef153812137220466ca3148425228915ddb6e7e80bc339fa983d2ddef098cacf00196fbd7467181ae5b9747d8fd383fc5ed17f8bf5e62e89d425 +"@types/bad-words@npm:^3.0.2": + version: 3.0.2 + resolution: "@types/bad-words@npm:3.0.2" + checksum: aa40d10364b73deb5617c0b53d5a782841ddd173e6cc68bc41d48c2c95c63ac81d23e2cabeb3d686cb7d655512353ac1866135203305b820d4c60859635ba9d3 languageName: node linkType: hard -"@types/bcrypt@npm:^5.0.0": - version: 5.0.0 - resolution: "@types/bcrypt@npm:5.0.0" +"@types/bcrypt@npm:^5.0.1": + version: 5.0.1 + resolution: "@types/bcrypt@npm:5.0.1" dependencies: "@types/node": "*" - checksum: 063c32c7a519d64768dfc0169a319b8244d6a6cb50a355c93992b3c5fee1dbc236526a1111f0e7bb25abc8b0473e5f40a5edfeb8b33cad2a6ea35aa2d7d7db14 + checksum: 2419ad2e7601b2c306ce2bd8bd8d911770f1abdea780efd4e61e9329b757e47c80fbd73fc52a925a371de47247ce92f04d11bdf24b8b44754ea0ba18d06d2202 languageName: node linkType: hard -"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.2": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" +"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.4": + version: 1.19.4 + resolution: "@types/body-parser@npm:1.19.4" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 10accc30773319bd49af7d12d2cd5faf9a0293ea4764345297f26ba6ef31d5caa7609da7619584d6c61279e09b89d3ab13d28c5cb644807c5d9c722ae1454778 languageName: node linkType: hard @@ -12167,55 +12082,55 @@ __metadata: languageName: node linkType: hard -"@types/busboy@npm:^1.5.0": - version: 1.5.0 - resolution: "@types/busboy@npm:1.5.0" +"@types/busboy@npm:^1.5.2": + version: 1.5.2 + resolution: "@types/busboy@npm:1.5.2" dependencies: "@types/node": "*" - checksum: ffa7bf25c0395f6927526b7d97e70cd2df789e4ca0d231e41855fb08542fa236891ce457d83cc50cac6e5cef6be092ab80597070dcf1413f736462690a23e987 + checksum: d2cfa334e06ce0fbeb31bdac7b4ba051b85e508f4f46d016e55488a717c626e19285f0e2fae40d0183d0f676dd162ab9216613799f83d40430e1996fba4bfb2f languageName: node linkType: hard -"@types/chai-as-promised@npm:^7.1.5": - version: 7.1.5 - resolution: "@types/chai-as-promised@npm:7.1.5" +"@types/chai-as-promised@npm:^7.1.7": + version: 7.1.7 + resolution: "@types/chai-as-promised@npm:7.1.7" dependencies: "@types/chai": "*" - checksum: 7c1345c6e32513d52d8e562ec173c23161648d6b792046525f18803a9932d7b3ad3dca8f0181e3c529ec42b106099f174e34edeb184d61dc93e32c98b5132fd4 + checksum: 59199afbd91289588648e263d7f32f7d72fa9c0075f3c17b1e760e10fdc1a310c2170a392b0d17d96cfff2c51daca72839eed6d80142f9230c9784b8e08ba676 languageName: node linkType: hard -"@types/chai-datetime@npm:0.0.37": - version: 0.0.37 - resolution: "@types/chai-datetime@npm:0.0.37" +"@types/chai-datetime@npm:0.0.38": + version: 0.0.38 + resolution: "@types/chai-datetime@npm:0.0.38" dependencies: "@types/chai": "*" - checksum: c55cb13f7359f670849d0f313517d4c3f1f5ff4e82851b9643a0aeda426666e40a43b99518c02c877bc533c6180196f68fc48e077f37487e8b71f3a4b1855272 + checksum: 2c0269e91a282ef71fe5603a94b6df4c3b784e3ded25f380ed91c0d91c26d08ac33da6bde903bc9bddfec4636455378c26810947a989ef87fe37078213e350ca languageName: node linkType: hard -"@types/chai-dom@npm:0.0.13": - version: 0.0.13 - resolution: "@types/chai-dom@npm:0.0.13" +"@types/chai-dom@npm:1.11.2": + version: 1.11.2 + resolution: "@types/chai-dom@npm:1.11.2" dependencies: "@types/chai": "*" - checksum: 94820d5d086eb339af62c74c17f79640b86b1f70818e366bff943826b5d28400a4a97f1b8740ae7727f93ebe9887bc9b5a3ae4aab4a5be420f8cdb4bd5eaef0e + checksum: d59a90bf2b497797178d3a5bd17f242caaf6ee098563142fdc765a6c12786f94bc0a9b8e4023de37ef8c803198ce9562823651610b02c80f1e21a29f2ece80fd languageName: node linkType: hard -"@types/chai-spies@npm:~1.0.3": - version: 1.0.3 - resolution: "@types/chai-spies@npm:1.0.3" +"@types/chai-spies@npm:~1.0.5": + version: 1.0.5 + resolution: "@types/chai-spies@npm:1.0.5" dependencies: "@types/chai": "*" - checksum: f88b1a021c1f6c37259adf4268b00401431633027995725a49c44658b0fedf7ec09aa4e26e59fdf6564df0767a0b105b26a4a9c8a7c6acaf9ba417b06a4c9c70 + checksum: d8009e0e4bf78fdce4a6824d43a2e206ddc0c07e3869f5d55ed7a7476c5623f77d0a5f444148ce7a0b9d9f47592fe3f0c6652952e6a0f514d8603cbb2e587cd4 languageName: node linkType: hard -"@types/chai@npm:*, @types/chai@npm:^4.3.5": - version: 4.3.5 - resolution: "@types/chai@npm:4.3.5" - checksum: c8f26a88c6b5b53a3275c7f5ff8f107028e3cbb9ff26795fff5f3d9dea07106a54ce9e2dce5e40347f7c4cc35657900aaf0c83934a25a1ae12e61e0f5516e431 +"@types/chai@npm:*, @types/chai@npm:^4.3.9": + version: 4.3.9 + resolution: "@types/chai@npm:4.3.9" + checksum: 2300a2c7abd4cb590349927a759b3d0172211a69f363db06e585faf7874a47f125ef3b364cce4f6190e3668147587fc11164c791c9560cf9bce8478fb7019610 languageName: node linkType: hard @@ -12228,12 +12143,12 @@ __metadata: languageName: node linkType: hard -"@types/chart.js@npm:^2.9.37": - version: 2.9.37 - resolution: "@types/chart.js@npm:2.9.37" +"@types/chart.js@npm:^2.9.39": + version: 2.9.39 + resolution: "@types/chart.js@npm:2.9.39" dependencies: moment: ^2.10.2 - checksum: 5626a8cc3b410c9f2668ee7efd5b1b408f7de814608f83f9fdb349f59e3c7f5eb7199e73b41e6634c24b4ccb8d3846b290264df8d4224d184f63b095f82cfb94 + checksum: c19cab03143db9cabc9c7277b77a974634baa9a9554dc95a7d2996091ac88ca9d98718e701446932a4cf0b8f3c2862ad0d3f232e1deb6a9bdf72d9ef5342582d languageName: node linkType: hard @@ -12246,12 +12161,12 @@ __metadata: languageName: node linkType: hard -"@types/codemirror@npm:^5.60.8": - version: 5.60.8 - resolution: "@types/codemirror@npm:5.60.8" +"@types/codemirror@npm:^5.60.12": + version: 5.60.12 + resolution: "@types/codemirror@npm:5.60.12" dependencies: "@types/tern": "*" - checksum: bc3a63eab0308b3ef5ed2ca22afb7f1c0b8acde6477e1d569df7e93f3fe4f78754d28a3e081c72931259fe1bf906a319b54bcdeba74600b989e5558d32478496 + checksum: dff22f32ea42ccd3f9bfcf408631f94a11ffb4614ff4fa8cc55adf7da6e7ba96650533b8dd27d037242747bdaa85141e93520f84409db7bc394862a174a10e1e languageName: node linkType: hard @@ -12274,19 +12189,19 @@ __metadata: languageName: node linkType: hard -"@types/cookie-parser@npm:^1.4.3": - version: 1.4.3 - resolution: "@types/cookie-parser@npm:1.4.3" +"@types/cookie-parser@npm:^1.4.5": + version: 1.4.5 + resolution: "@types/cookie-parser@npm:1.4.5" dependencies: "@types/express": "*" - checksum: f390f3af1b1711190dee2c2ecd9af33af81fbde8d81ee820dadb6fe1e0d80c3faba40af37c6ed36fb88b04b64870f6a021f7e9edceecd17c42fe22abe0af5005 + checksum: 45855721706d6a57bb0441db11fb59db407414ea83a0000a0df80d19230447cc3bcc43c436397bfb8998ec78db222265fa8083456b00c5b5054a0c03d06f0086 languageName: node linkType: hard -"@types/cookie@npm:^0.5.1": - version: 0.5.1 - resolution: "@types/cookie@npm:0.5.1" - checksum: 9a8d60fc84797122bc399d6bd330fe5780dc7aab032321de705049ea925339f74658bfa418de483a625d51858770efef58df633ff2e20f1bdf7fbd74a52847e2 +"@types/cookie@npm:^0.5.3": + version: 0.5.3 + resolution: "@types/cookie@npm:0.5.3" + checksum: b785618f6b2fdceb6a20a17e1dfe99651b1e5c2c079f486de76dfb21b508f09d91913755e4a6dbdfe628882ea32466bb2e9318b114ce34efa5e624356494fcab languageName: node linkType: hard @@ -12297,35 +12212,35 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:^2.8.13": - version: 2.8.13 - resolution: "@types/cors@npm:2.8.13" +"@types/cors@npm:^2.8.15": + version: 2.8.15 + resolution: "@types/cors@npm:2.8.15" dependencies: "@types/node": "*" - checksum: 7ef197ea19d2e5bf1313b8416baa6f3fd6dd887fd70191da1f804f557395357dafd8bc8bed0ac60686923406489262a7c8a525b55748f7b2b8afa686700de907 + checksum: ef7b0aba4c6a4c1fe9d459bd471ebaa891a75319682c9248daa17720003d1d0d2c59de4bdb6868630596ade9b7c3c949e652d6141b14c6fe4387ffcc520d0f3f languageName: node linkType: hard -"@types/crypto-js@npm:~4.1.1": - version: 4.1.1 - resolution: "@types/crypto-js@npm:4.1.1" - checksum: ea3d6a67b69f88baeb6af96004395903d2367a41bd5cd86306da23a44dd96589749495da50974a9b01bb5163c500764c8a33706831eade036bddae016417e3ea +"@types/crypto-js@npm:~4.1.3": + version: 4.1.3 + resolution: "@types/crypto-js@npm:4.1.3" + checksum: 4489854579c1b90b77da881fc980e3f05ab1e9c68b18ae580fedbb7b0fb40d531fda7bdc05f1b3bd5d4218c1d97c2f821bbac57eb3d7d9e505ce5a2c5b034166 languageName: node linkType: hard -"@types/cssom@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cssom@npm:0.4.1" - checksum: 0f44f5ff27f5dfadfb89c8bd00f8d588dc1aaa77ec05ffa3ab732929683aef842f55a6c52c9a75586a28987f009b45f6ea5f63dbc34660f6bb98650eea7f59e9 +"@types/cssom@npm:^0.4.2": + version: 0.4.2 + resolution: "@types/cssom@npm:0.4.2" + checksum: 4bcc54245b8c09c832c21465f60af412a5c2446ae5c17ab1a874dd87a9488e43951f8027594cc0eaf99d4e9a7c061882f017552a13f0a94ac25db9ac92fea837 languageName: node linkType: hard -"@types/debug@npm:^4.1.8": - version: 4.1.8 - resolution: "@types/debug@npm:4.1.8" +"@types/debug@npm:^4.1.10": + version: 4.1.10 + resolution: "@types/debug@npm:4.1.10" dependencies: "@types/ms": "*" - checksum: a9a9bb40a199e9724aa944e139a7659173a9b274798ea7efbc277cb084bc37d32fc4c00877c3496fac4fed70a23243d284adb75c00b5fdabb38a22154d18e5df + checksum: 938f79c5b610f851da9c67ecd8641a09b33ce9cb38fe4c9f4d20ee743d6bccb5d8e9a833a4cd23e0684a316622af67a0634fa706baea5a01f5219961d1976314 languageName: node linkType: hard @@ -12338,17 +12253,17 @@ __metadata: languageName: node linkType: hard -"@types/ejson@npm:^2.2.0": - version: 2.2.0 - resolution: "@types/ejson@npm:2.2.0" - checksum: 0cbc610c58a60847822353782d133f7a3cf362223d58f6a2b6ce0ae6e1f22885dc8f2a6ca7676df2556ed631e74c5a4880575704b964fdef89d216dc69ac0ad6 +"@types/ejson@npm:^2.2.1": + version: 2.2.1 + resolution: "@types/ejson@npm:2.2.1" + checksum: 8a0e6e9d50a9b33cdb645e7fdaca5fccb5a0687be0918eaeb06c9c7f21bb8b5757881de77c9d19d84bf16e6949c10b23d098954990aef7bd26257d471f4c008f languageName: node linkType: hard -"@types/emojione@npm:^2.2.6": - version: 2.2.6 - resolution: "@types/emojione@npm:2.2.6" - checksum: 5a049b57ea99eb88359b257256cdb74f048f8cfddc58a7ea9a50ba5d937f9414025c0616205b67f63512fcbbba44471901209d8f3c7fb5a9741fb6d3038eb864 +"@types/emojione@npm:^2.2.8": + version: 2.2.8 + resolution: "@types/emojione@npm:2.2.8" + checksum: 3342fd3fbcbc7e7429c7a23330f559d0f41f4fcba5a699035fddb53efba8c7c5ed3af54024011643aa338792d8fd963768766877bc115e093bef193a391abb05 languageName: node linkType: hard @@ -12362,13 +12277,13 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:*, @types/eslint@npm:~8.44.0": - version: 8.44.0 - resolution: "@types/eslint@npm:8.44.0" +"@types/eslint@npm:*, @types/eslint@npm:~8.44.6": + version: 8.44.6 + resolution: "@types/eslint@npm:8.44.6" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 2655f409a4ecdd64bb9dd9eb6715e7a2ac30c0e7f902b414e10dbe9d6d497baa5a0f13105e1f7bd5ad7a913338e2ab4bed1faf192a7a0d27d1acd45ba79d3f69 + checksum: ed8de582ab3dbd7ec0bf97d41f4f3de28dd8a37fc48bc423e1c406bbb70d1fd8c4175ba17ad6495ef9ef99a43df71421277b7a2a0355097489c4c4cf6bb266ff languageName: node linkType: hard @@ -12407,41 +12322,31 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.17, @types/express@npm:^4.17.8, @types/express@npm:^4.7.0": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.33 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da - languageName: node - linkType: hard - -"@types/express@npm:^4.16.1": - version: 4.17.18 - resolution: "@types/express@npm:4.17.18" +"@types/express@npm:*, @types/express@npm:^4.16.1, @types/express@npm:^4.17.13, @types/express@npm:^4.17.20, @types/express@npm:^4.17.8, @types/express@npm:^4.7.0": + version: 4.17.20 + resolution: "@types/express@npm:4.17.20" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 8c178da4f0edff1f006d871fbdc3f849620986ff10bad252f3dfd45b57554e26aaa28c602285df028930d5216e257a06fbaf795070f8bb42f7d87e3b689cba50 + checksum: bf8a97d283128e5129f9ccabbeef728ff3f0484465e0ae74a304bd0588fa6cb715ae68845650caba9a641944b7791ba125d02ddbd47a7e62aaefdd036570c6c5 languageName: node linkType: hard -"@types/fibers@npm:^3.1.1": - version: 3.1.1 - resolution: "@types/fibers@npm:3.1.1" - checksum: 3bcc53c92dcaabf77cf31274c06ba615a59d21730bdb47214f64d7bf356ab31712f1d9c79707e50d2c9d2f8cda8cca4f7e4c20ddf272b07397d20fb196dbc400 +"@types/fibers@npm:^3.1.3": + version: 3.1.3 + resolution: "@types/fibers@npm:3.1.3" + checksum: c4511eecea1c4e73a4b4310ff5152bb43477dfbd7c19ea8614de5ce6d604c6bd629b4552bdbc06fbd593215c684d06aee4e6d8e6681b4ab019f2b8a03838de79 languageName: node linkType: hard -"@types/gc-stats@npm:^1": - version: 1.4.1 - resolution: "@types/gc-stats@npm:1.4.1" - checksum: 07c08e5452f96e3afbaba259ec0f684f1172b0e1bdb466d8606bc9af0428399bf334b57944ef2762d61be122892619aabab11ff63cd07f2dfc7dd436118d04b6 +"@types/gc-stats@npm:^1.4.2": + version: 1.4.2 + resolution: "@types/gc-stats@npm:1.4.2" + dependencies: + "@types/node": "*" + checksum: 4039f699b497595c3ac30f221f72d798e12a764093ab5df05cec25cd501fe806005daec10c25737d2b08449772bc318ac720f01fe73d13fdb33168429e25483f languageName: node linkType: hard @@ -12455,10 +12360,10 @@ __metadata: languageName: node linkType: hard -"@types/google-libphonenumber@npm:^7.4.23": - version: 7.4.23 - resolution: "@types/google-libphonenumber@npm:7.4.23" - checksum: 6c46f980fcff49befbddc165dea466cd2b444bf12a2a110767c6a656164cbfc09cbc84e1d2142b275def443246704115eddaf040668caee623676b1e37bb90bc +"@types/google-libphonenumber@npm:^7.4.29": + version: 7.4.29 + resolution: "@types/google-libphonenumber@npm:7.4.29" + checksum: 63b1d03ab6dcd877c1249251d73c54777f6b6cbd13f6b3107c8fcef70d19f8e3a768555942735318da86fa6c50ea0dcfc82d521d4defc9e9dfc1e67b4746ab96 languageName: node linkType: hard @@ -12471,10 +12376,10 @@ __metadata: languageName: node linkType: hard -"@types/gravatar@npm:^1.8.3": - version: 1.8.3 - resolution: "@types/gravatar@npm:1.8.3" - checksum: 7d05ab0b0fae62c6932bbb952b863e67a96385dd428a4cef161518e5e5176788194db34ca0815ce28a41779e472ea3d6ca21fedd0f00d77e62b016b59117bf81 +"@types/gravatar@npm:^1.8.5": + version: 1.8.5 + resolution: "@types/gravatar@npm:1.8.5" + checksum: a4a5e9010e5f2caff27f360cd4e0acf4e3276be3fdf8cc4a38baed8b9ca14d187b6b5c1d30d4d3abe326b0aecf30d1b47111ea543c8f6caf8bce9a8bb147c090 languageName: node linkType: hard @@ -12527,21 +12432,21 @@ __metadata: languageName: node linkType: hard -"@types/i18next-sprintf-postprocessor@npm:^0.2.0": - version: 0.2.0 - resolution: "@types/i18next-sprintf-postprocessor@npm:0.2.0" +"@types/i18next-sprintf-postprocessor@npm:^0.2.2": + version: 0.2.2 + resolution: "@types/i18next-sprintf-postprocessor@npm:0.2.2" dependencies: i18next: ">=17.0.11" - checksum: be1203358724c253a402f08043ba5900661849ee0ae103c5a9928f07b17e0ff1558fe22219a10d1a28a915af5564337135ee91572c6ae7f2a427bb67291e6800 + checksum: 1029c5f896e453534a128013f9ee8a0873a2e03b82a18a530842d06618c3dd1b1f3adf0491efa3f7efd86d19c61b23af60df5c0f36306ed298a20d6d895db95e languageName: node linkType: hard -"@types/imap@npm:^0.8.37": - version: 0.8.37 - resolution: "@types/imap@npm:0.8.37" +"@types/imap@npm:^0.8.39": + version: 0.8.39 + resolution: "@types/imap@npm:0.8.39" dependencies: "@types/node": "*" - checksum: 39af91e5ed0fe3b6f261a735f5af29de2ac325bddefbaa0067fcd1f51c9aa6d9d7c50eb0843091bca1faf14158085709c16315acddd6222d56e4557519abfba6 + checksum: 403a0810dc24f035d1762d9ebc1cf548448bdbe565ab6062d2a1d1be2afd4f8ef1483723d4077c0e0e2312a39a27f393a513a40515589149c0617aa984946ae5 languageName: node linkType: hard @@ -12595,13 +12500,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*, @types/jest@npm:~29.5.3": - version: 29.5.3 - resolution: "@types/jest@npm:29.5.3" +"@types/jest@npm:*, @types/jest@npm:~29.5.7": + version: 29.5.7 + resolution: "@types/jest@npm:29.5.7" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: e36bb92e0b9e5ea7d6f8832baa42f087fc1697f6cd30ec309a07ea4c268e06ec460f1f0cfd2581daf5eff5763475190ec1ad8ac6520c49ccfe4f5c0a48bfa676 + checksum: e28624ccb0ef1255a03fbbb4b5bc3e5cbcdc450d39e0739985ff679b124198f808c38c8c3e67859c6efc0e848196deeb8cfed028e12a821c511dfc1112a2d6e9 languageName: node linkType: hard @@ -12614,19 +12519,19 @@ __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 +"@types/js-yaml@npm:^4.0.8": + version: 4.0.8 + resolution: "@types/js-yaml@npm:4.0.8" + checksum: a5a77a5a1eac7e7fb667156c251c2b947ca4ddfdda570726369dd50bd5b2b1d0da2d0fb4273d1b10aa1782406d7b3da8923d957df4fb89dbfa1db06f43297de2 languageName: node linkType: hard -"@types/jsdom-global@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/jsdom-global@npm:3.0.4" +"@types/jsdom-global@npm:^3.0.6": + version: 3.0.6 + resolution: "@types/jsdom-global@npm:3.0.6" dependencies: "@types/jsdom": "*" - checksum: c4da8432609686961a4336b8adfe882cd844a5c8cb0213d12c8d2a69d8602a73ef0f175e9ed7d45ab75b833c8551147eb21015efe1b9505872326f1ea9d7ec91 + checksum: cb216d588d6abc583615706bbc8beab6265d7afec8e51cadea06f84dd5ba4508e583c500556b2c273d7569c80af9cd68dce19ab6042cd881567aa0fe10261cd1 languageName: node linkType: hard @@ -12675,10 +12580,10 @@ __metadata: languageName: node linkType: hard -"@types/jsrsasign@npm:^10.5.8": - version: 10.5.8 - resolution: "@types/jsrsasign@npm:10.5.8" - checksum: ef53cee635ab31ae60b41d050266e16949be84b9b6781eb7585acc9094bc6e1f8c9aff4f19221ee1c587ecf3134a6b551800989d2add6f28f9176a248c89a57d +"@types/jsrsasign@npm:^10.5.11": + version: 10.5.11 + resolution: "@types/jsrsasign@npm:10.5.11" + checksum: c18b52af99ffb831fd84738356a49e94407e732f0a88f0f6db1e1fd55c06a47d2bab23a9e17b3b21af50fbf5f4d115e13fbe2796357204b18072929bd7b4bd5c languageName: node linkType: hard @@ -12689,10 +12594,10 @@ __metadata: languageName: node linkType: hard -"@types/katex@npm:~0.16.0": - version: 0.16.0 - resolution: "@types/katex@npm:0.16.0" - checksum: f93ceb2496621d18a28252264c0b7f5b0bdf125f9dc92d1adfbd9bf00942cd2918de336fae628d3929e615aaf84b7adb1781711c4e4605664be0827b1013ec14 +"@types/katex@npm:~0.16.5": + version: 0.16.5 + resolution: "@types/katex@npm:0.16.5" + checksum: a1ce22cd87acd9b32891931f2bc4355c3540cc0a423e161a2e5b040d3e50812cb85ce1fd09f23d42324b19f9da30ded6b1807114f215624f670d79bb46c47cc8 languageName: node linkType: hard @@ -12705,10 +12610,10 @@ __metadata: languageName: node linkType: hard -"@types/later@npm:^1.2.7": - version: 1.2.7 - resolution: "@types/later@npm:1.2.7" - checksum: 247f10e3e39bf50d78cdeb95f854e73b8378fdb2de542a0b632d892377098b438c2596dd99657d2ca0ca9370b07a2c112b29e5fbde636c91e4292f9a82b04572 +"@types/later@npm:^1.2.8": + version: 1.2.8 + resolution: "@types/later@npm:1.2.8" + checksum: b89b391e6dc6721955b04c01b81a3e38b4ac3d4f40ebcf35bc34d694c46a81c387c028760b3fc1441b9852c46298dfd562708f61504aba65983d2484b99d6420 languageName: node linkType: hard @@ -12721,45 +12626,45 @@ __metadata: languageName: node linkType: hard -"@types/less@npm:~3.0.3": - version: 3.0.3 - resolution: "@types/less@npm:3.0.3" - checksum: 389ce4c843fb88484ffbe4e3b63da0db1cea3e594c57086a5e642431f031f569819b4a210ae4ca109207d2307daa7e48e0e00315892fa7582748e0f434e62881 +"@types/less@npm:~3.0.5": + version: 3.0.5 + resolution: "@types/less@npm:3.0.5" + checksum: 72d04c7877a63ef8a49e22a2aaf2e595aec41b4fcbbb48603e4d3a3d1e2d903edea6654db00bba52148ea4101a904e866b410599088b41935aa4c0733d25ef3c languageName: node linkType: hard -"@types/lodash.debounce@npm:^4.0.7": - version: 4.0.7 - resolution: "@types/lodash.debounce@npm:4.0.7" +"@types/lodash.debounce@npm:^4.0.8": + version: 4.0.8 + resolution: "@types/lodash.debounce@npm:4.0.8" dependencies: "@types/lodash": "*" - checksum: e873b2d77f89010876baba3437ef826b17221b98948e00b5590828334a481dea1c8f9d28543210e564adc53199584f42c3cb171f8b6c3614fefc0b4e0888679c + checksum: 63f195cb053ca390135a9aca62bb60fa149ca81838519871506b60760ff4113333709becb8e4147707eaa3d916dab7eff66b0588caf4ce508cabda9bee9c5b60 languageName: node linkType: hard -"@types/lodash.get@npm:^4.4.7": - version: 4.4.7 - resolution: "@types/lodash.get@npm:4.4.7" +"@types/lodash.get@npm:^4.4.8": + version: 4.4.8 + resolution: "@types/lodash.get@npm:4.4.8" dependencies: "@types/lodash": "*" - checksum: 0dbf1960606e4707c34e8ffbe97ffaad0e47fc5df7a6e24ea6e4fe5838d2468aa13360f38815c77b06e3c9932631ae15662b4139036a69ee16aeb54827a21405 + checksum: fea09c12f098e5cbdc16510e8319a7f0dd4d0af49a5e6622ae4f0dcd4893f1b2c44a5d22f452d73443f50b85c8461f3fe2370c19b8d9051686265bbb0aae0ffa languageName: node linkType: hard -"@types/lodash@npm:*, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.195": - version: 4.14.195 - resolution: "@types/lodash@npm:4.14.195" - checksum: 39b75ca635b3fa943d17d3d3aabc750babe4c8212485a4df166fe0516e39288e14b0c60afc6e21913cc0e5a84734633c71e617e2bd14eaa1cf51b8d7799c432e +"@types/lodash@npm:*, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.200": + version: 4.14.200 + resolution: "@types/lodash@npm:4.14.200" + checksum: 6471f8bb5da692a6ecf03a8da4935bfbc341e67ee9bcb4f5730bfacff0c367232548f0a01e8ac5ea18c6fe78fb085d502494e33ccb47a7ee87cbdee03b47d00d languageName: node linkType: hard -"@types/mailparser@npm:^3.4.0": - version: 3.4.0 - resolution: "@types/mailparser@npm:3.4.0" +"@types/mailparser@npm:^3.4.3": + version: 3.4.3 + resolution: "@types/mailparser@npm:3.4.3" dependencies: "@types/node": "*" iconv-lite: ^0.6.3 - checksum: 05232ba3579b09224e5335848da27817a4cac8cc0eb622202904b62851fd61bbab7b5ca90016531e40098641351d84c2355f10cd9c9fa718da4ea2cb0e637bd0 + checksum: 9374b713311b523b66429a7b509e90229dd001029e87d901ab6c756e1856eb2a8427012c016ad70ac45b39056eba1334e568f85ce9f329f5dd147986a897b691 languageName: node linkType: hard @@ -12779,26 +12684,27 @@ __metadata: languageName: node linkType: hard -"@types/meteor-collection-hooks@npm:^0.8.6": - version: 0.8.6 - resolution: "@types/meteor-collection-hooks@npm:0.8.6" +"@types/meteor-collection-hooks@npm:^0.8.8": + version: 0.8.8 + resolution: "@types/meteor-collection-hooks@npm:0.8.8" dependencies: meteor-typings: ^1.3.1 - checksum: 620f6315dba4457dcacb0656ebdabfe2997b39be8757b87cd883e11aa77a573c27abbb0682b75c5d284ccc2be372b377d17c22a09d465ba2d59e3e62ca298ccf + checksum: bf0afc8531c836f3f7ead4aa0f8be3f69257af7a62397924a50533a20837b21b16c307777bb4fe52dc2e26753ba7269d0df6133ba6f1dad27d4075fea38a05f9 languageName: node linkType: hard -"@types/meteor@npm:^2.9.2": - version: 2.9.2 - resolution: "@types/meteor@npm:2.9.2" +"@types/meteor@npm:^2.9.5": + version: 2.9.5 + resolution: "@types/meteor@npm:2.9.5" dependencies: "@types/connect": "*" "@types/jquery": "*" + "@types/node": "*" "@types/nodemailer": "*" "@types/react": "*" "@types/underscore": "*" mongodb: ^4.3.1 - checksum: 6395578e5d5f139aad8dfd0f70cb489dd70984b78ed2ab791bfabc59c70f94196cdb3cfc40659da0498ae1962f135782067579e5c320341c9a1a331553329f56 + checksum: e16d072fe0f0ddaf2a8ac6b442580126c6d38e9e2ac36d72551d401a9a86c1dfa42e17b28ac28842b43ed0106b1c47126348332b3fcca3c86ef0d266c1201da9 languageName: node linkType: hard @@ -12883,30 +12789,23 @@ __metadata: languageName: node linkType: hard -"@types/node-gcm@npm:^1.0.1": - version: 1.0.1 - resolution: "@types/node-gcm@npm:1.0.1" - checksum: feaf8952ae0029075fef79b5a6397fbccb19caa6580bc9e15ab20f47fa122f4be2241dde72bb5884ec87b4a8a5d33a4e9e4c219a6e83cf906bf7d93f373f4f0e +"@types/node-gcm@npm:^1.0.3": + version: 1.0.3 + resolution: "@types/node-gcm@npm:1.0.3" + checksum: 232e3d401f381fe9312343efb920892a7aa2f63457e00608ff2c3f0d1bff4a3707affe9a9e484ffead39272cfba0d1791901b7e937420233455dd047d63a4587 languageName: node linkType: hard -"@types/node-rsa@npm:^1.1.1": - version: 1.1.1 - resolution: "@types/node-rsa@npm:1.1.1" +"@types/node-rsa@npm:^1.1.3": + version: 1.1.3 + resolution: "@types/node-rsa@npm:1.1.3" dependencies: "@types/node": "*" - checksum: dee0c318618991f115b6e757c54980324c3b2f7dfec8137dcb31e8e88955e7c048d5e89e1e3a572148697783f323dbf9af5738ac5bbe9069666663ad3737284d + checksum: 03606729a96722623e316b1728d45ba452e008e01e886127d1d964221119dd4196be724ec062fc81be5beb28ce8e5fcc9c55109275cdae60545ddc293b89e77d languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.0.0, @types/node@npm:>=8.9.0": - version: 17.0.40 - resolution: "@types/node@npm:17.0.40" - checksum: e3b2fe876672fbe4be84ce17773944eb2f5eaba50e2c6c0536bdf6d4972ed6488581580581f154183fdc8f2d56fa42a42e3d6e83b9b71ee25adea16a84765e92 - languageName: node - linkType: hard - -"@types/node@npm:>=12, @types/node@npm:>=18.0.0": +"@types/node@npm:*, @types/node@npm:>=12, @types/node@npm:>=12.0.0, @types/node@npm:>=18.0.0, @types/node@npm:>=8.9.0": version: 20.8.4 resolution: "@types/node@npm:20.8.4" dependencies: @@ -12922,26 +12821,26 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^14.0.10 || ^16.0.0, @types/node@npm:^14.14.20 || ^16.0.0, @types/node@npm:^16.18.36": - version: 16.18.36 - resolution: "@types/node@npm:16.18.36" - checksum: a9d138fa1269079c60daad6984713dc0b713983f8b34a83edbc6d7957b2e38beab9b2598c9fe99f19d073e20bc212a18aaf82eabdc23ef64dce7d2089a9aab2a +"@types/node@npm:^14.0.10 || ^16.0.0, @types/node@npm:^14.14.20 || ^16.0.0, @types/node@npm:^16.18.60": + version: 16.18.60 + resolution: "@types/node@npm:16.18.60" + checksum: aa0c81c3f20e663584bf17a5968e54c419277af7982ef41f9d83edd1b7ab4c8af2583a3c8a9e1cf659c6307e6f787e1be20522855121371f5a46d1d54f8a70e3 languageName: node linkType: hard -"@types/node@npm:^14.0.26, @types/node@npm:^14.14.37, @types/node@npm:^14.18.51": - version: 14.18.51 - resolution: "@types/node@npm:14.18.51" - checksum: 0960a31d2ac605763fe79c8edcee3cb48257d345ce417c019d84ff5d8cd92dd0937674814ab3f169346b4259c29f640556006bcb2c54cfb3e63fa0cf728d320e +"@types/node@npm:^14.0.26, @types/node@npm:^14.14.37, @types/node@npm:^14.18.63": + version: 14.18.63 + resolution: "@types/node@npm:14.18.63" + checksum: be909061a54931778c71c49dc562586c32f909c4b6197e3d71e6dac726d8bd9fccb9f599c0df99f52742b68153712b5097c0f00cac4e279fa894b0ea6719a8fd languageName: node linkType: hard -"@types/nodemailer@npm:*, @types/nodemailer@npm:^6.4.8": - version: 6.4.8 - resolution: "@types/nodemailer@npm:6.4.8" +"@types/nodemailer@npm:*, @types/nodemailer@npm:^6.4.13": + version: 6.4.13 + resolution: "@types/nodemailer@npm:6.4.13" dependencies: "@types/node": "*" - checksum: 3cc9b6a0e54f25a1b36124df413964ff5a69e8dc4558c5dfc06818917313a50f4dbfe31fc9190e4270d07a0f8678474da24a2eae42f907933ea81d983b4772d4 + checksum: fd27d57d5801aaa7594d3bab748aedb1addc0c3a8ff9a21ea7675eec0e7e99cc477d05264b757b97691612fcfab37e52ded6c0725a700a90ad24fc7829dcc641 languageName: node linkType: hard @@ -12959,19 +12858,19 @@ __metadata: languageName: node linkType: hard -"@types/oauth2-server@npm:^3.0.13": - version: 3.0.13 - resolution: "@types/oauth2-server@npm:3.0.13" +"@types/oauth2-server@npm:^3.0.15": + version: 3.0.15 + resolution: "@types/oauth2-server@npm:3.0.15" dependencies: "@types/express": "*" - checksum: 126ce8a99a50b515801891212c20a928bd447ea634956aef0073ff704ac19b79ed8800567f3aa433f234bf2ee54b498211e3e23e864c34d211c76ea0662fa3e0 + checksum: b6c73ec0ba3a83e7a9cc1bf0e75fd640a76bcf57742642775abf950d851478a686e3f54ad8e24a09772e1dd89ed953742418c76ebb7df12b97b68f1cb94dae80 languageName: node linkType: hard -"@types/object-path@npm:^0.11.1": - version: 0.11.1 - resolution: "@types/object-path@npm:0.11.1" - checksum: 007e819d1d9dc830491b60023b1502ef1e421416d9953d6fefcda7d06eb91548eef8ee30073a9cfb6a834ac977042f6e1a761cde2d6a7973b06ddca753be91e3 +"@types/object-path@npm:^0.11.3": + version: 0.11.3 + resolution: "@types/object-path@npm:0.11.3" + checksum: 9c2f1ec11d9d15df1682ab1483c0f51cac3ff8c3a951662a50d15fd48824fc43a052041503d0761790a29a4100e33989eb519889948c3592d0bf6bde59d3ec79 languageName: node linkType: hard @@ -13003,35 +12902,35 @@ __metadata: languageName: node linkType: hard -"@types/parseurl@npm:^1.3.1": - version: 1.3.1 - resolution: "@types/parseurl@npm:1.3.1" +"@types/parseurl@npm:^1.3.2": + version: 1.3.2 + resolution: "@types/parseurl@npm:1.3.2" dependencies: "@types/node": "*" - checksum: e2d6fd6ad3259a70239cee48de496bc5e5d074a2c52199227e7414d889b8df05c039d2cbde8198e05493f8d64fffb7de1fa98e7228ed3e3d149f6f51d31c8e9e + checksum: bfe0ad3222a957a1d8d21a5378a61a3ce21f0ce45ddfdd98fc727207b4bd3caf590d2a448c39d08774949e485a5f5f08429f6025a6b0123456a8a7fb9270ddb2 languageName: node linkType: hard -"@types/photoswipe@npm:^4.1.2": - version: 4.1.2 - resolution: "@types/photoswipe@npm:4.1.2" - checksum: 58f9b85171b5d24a70dea8b7cd68eaaef29159f05130f2284320ef438874c538f00e81763d4025d79fb03366180cff12e01c4a40d04a0c823ca4df656ee8b912 +"@types/photoswipe@npm:^4.1.5": + version: 4.1.5 + resolution: "@types/photoswipe@npm:4.1.5" + checksum: a6b5fd6b029b8e84bc43f680549abf33dbc02e551e8dd176e29ca82e80edf66d0b62777fd42fe415d9e52b7a570718cac684aaea544f8dc084d1cb8bcc422f0f languageName: node linkType: hard -"@types/polka@npm:^0.5.4": - version: 0.5.4 - resolution: "@types/polka@npm:0.5.4" +"@types/polka@npm:^0.5.6": + version: 0.5.6 + resolution: "@types/polka@npm:0.5.6" dependencies: "@types/express": "*" "@types/express-serve-static-core": "*" "@types/node": "*" "@types/trouter": "*" - checksum: 8027a6cf6989d63ad01346c031698885586f3b800746bc35c84ab66f981e452cc58f8770fec703509cacf615f450c7010eb5221cef47a75e9494cdc42df8f8b3 + checksum: e956629526782b722fe134a93e159774d13d58a66796f5b6f763b04cd5c426439a8556962e1da8e8a61574ed1ad6239ffbef28cd8c03b4f8828a9a4b03189dde languageName: node linkType: hard -"@types/prettier@npm:^2.1.5, @types/prettier@npm:^2.6.3": +"@types/prettier@npm:^2.6.3": version: 2.6.3 resolution: "@types/prettier@npm:2.6.3" checksum: e1836699ca189fff6d2a73dc22e028b6a6f693ed1180d5998ac29fa197caf8f85aa92cb38db642e4a370e616b451cb5722ad2395dab11c78e025a1455f37d1f0 @@ -13045,10 +12944,10 @@ __metadata: languageName: node linkType: hard -"@types/prometheus-gc-stats@npm:^0.6.2": - version: 0.6.2 - resolution: "@types/prometheus-gc-stats@npm:0.6.2" - checksum: 403b3dbd792b83e592376e2002260cf57fb18f98c8b8528a24dc65e545cb8d0e9bf9941dc28edfa397b670b9a7336913da991005ef0278611209dde9b51406db +"@types/prometheus-gc-stats@npm:^0.6.3": + version: 0.6.3 + resolution: "@types/prometheus-gc-stats@npm:0.6.3" + checksum: b8ad00f21c2d7f19819b0d82b778f4919847e44f1f74a570fb52386fa7c5250af3a5e2eef5b8aa69cbf7fd8cc68f31f91bd7a002ce5b3722bb971da31af543a0 languageName: node linkType: hard @@ -13066,26 +12965,26 @@ __metadata: languageName: node linkType: hard -"@types/proxy-from-env@npm:^1.0.1": - version: 1.0.1 - resolution: "@types/proxy-from-env@npm:1.0.1" +"@types/proxy-from-env@npm:^1.0.3": + version: 1.0.3 + resolution: "@types/proxy-from-env@npm:1.0.3" dependencies: "@types/node": "*" - checksum: 72d04675fc7107d4a1d4a2ca56773d0caf23bdd48fa45b96b72b199f33f54854164b994c45f549214c51227f8bb9ae4e189e48d74a4a46b668fd4210bf97f8c0 + checksum: 3661687ae4bd90b9c41e504d3e3124b1ccd7d39d5877a7930fc3630989e37bde4e6b9055ea719d4b85c400a872bee02336ee5e187380f075cec021a4aebced44 languageName: node linkType: hard -"@types/proxyquire@npm:^1.3.28": - version: 1.3.28 - resolution: "@types/proxyquire@npm:1.3.28" - checksum: 9f0267b4516c2686a2e99a6d4dbd2ed660133180aad775a4000f3e103d8b2fe6b1bfe5b36003edf7adfb02542aed6c2fa6049fc217daea73ebced2942a762f27 +"@types/proxyquire@npm:^1.3.30": + version: 1.3.30 + resolution: "@types/proxyquire@npm:1.3.30" + checksum: e247d0afdb59aae942313112ca6429b0cbe410b0a858796c63e16ea945b3a7686f0660a03c685d79f10ed807051f645a763e13aa72d3725aeea74fd40901fdad languageName: node linkType: hard -"@types/psl@npm:^1.1.0": - version: 1.1.0 - resolution: "@types/psl@npm:1.1.0" - checksum: 648a4a40827fb101a05616b9c448b04d40c467db9f09e08099274759fd5e032e7d276013296679765c7d7359f43f0479094c1d8b6a56a8f9445b84b5a9af1263 +"@types/psl@npm:^1.1.2": + version: 1.1.2 + resolution: "@types/psl@npm:1.1.2" + checksum: fc0a7ae56ca53157035226d964f5a37749187804c07787d25a3f8e0235130c277b52d027139d1a7058d7826014a8019d68d46e2719b0404ac8545d39d41fc43a languageName: node linkType: hard @@ -13110,21 +13009,21 @@ __metadata: languageName: node linkType: hard -"@types/react-beautiful-dnd@npm:^13.1.4": - version: 13.1.4 - resolution: "@types/react-beautiful-dnd@npm:13.1.4" +"@types/react-beautiful-dnd@npm:^13.1.6": + version: 13.1.6 + resolution: "@types/react-beautiful-dnd@npm:13.1.6" dependencies: "@types/react": "*" - checksum: 76220f1031721e73f712cf0021de6a3cf4049260ec29996cd587876ebd6ed01b9c31d8efb5cf230eb4d2b6259525ffe0f3054667732d30c79df37e49f9398c5e + checksum: 437c315cac4455fd0085150d5d163330e523e965193f642f45edf34eb56098e68a6f956d90ecb11abfcb03ce34177e5445c1489da46353ee5a6a6306414fb936 languageName: node linkType: hard -"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:~17.0.20": - version: 17.0.20 - resolution: "@types/react-dom@npm:17.0.20" +"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:~17.0.22": + version: 17.0.22 + resolution: "@types/react-dom@npm:17.0.22" dependencies: "@types/react": ^17 - checksum: 525439fb14a033fc5dbe74711ecc50ec82273a528df9656594066a6219401e975101dafffd15d9a1a57a9442d52ea0c92eaacae09554dde27cd792e773f67467 + checksum: 3c24331c0a2211370968befaad107598ee4f796c08e9b0de0b0126ee598a7c51f7bf4e0e7d9a76522a3b60d91f091d46131d136bcbe49aeb6ec3b8480dff03f9 languageName: node linkType: hard @@ -13149,14 +13048,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^17, @types/react@npm:~17.0.62": - version: 17.0.62 - resolution: "@types/react@npm:17.0.62" +"@types/react@npm:*, @types/react@npm:^17, @types/react@npm:~17.0.69": + version: 17.0.69 + resolution: "@types/react@npm:17.0.69" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 428a5aff44824ef504e9a9259b5894fe44a5db1c344b536990f07e132900ff5b34cbef0be77a84f30f37be1f88fc8b56dce328f568de8d65de3bfe414c05b2e1 + checksum: b83d4ec968b712b2b1a444c614b1ef3e59879c6911bc4001158de5de49b80b6a20fc4859353244f0171b94845d4c85a6379071445242ff23bbbc9b0ff24577d7 languageName: node linkType: hard @@ -13185,19 +13084,19 @@ __metadata: languageName: node linkType: hard -"@types/rewire@npm:^2.5.28": - version: 2.5.28 - resolution: "@types/rewire@npm:2.5.28" - checksum: c416a0f30b68c3d7aa7d67fa1297506d7ae890f831363f5e7a2ca704e0d3e2ec564efe1ce1f20a31f4f6408b3dc76a0f6ed79048ef4b7cc38905db31aeaf55df +"@types/rewire@npm:^2.5.29": + version: 2.5.29 + resolution: "@types/rewire@npm:2.5.29" + checksum: 2ad2f1134fe7c350fc88f0a9cc17eb49377f1a61776cde10b62bae0f5956dedd97adbb8da0e3ca8ddfb7034699a89fe2f9dc31af35f11727c4b38c8a089877c3 languageName: node linkType: hard -"@types/sanitize-html@npm:^2.9.0": - version: 2.9.0 - resolution: "@types/sanitize-html@npm:2.9.0" +"@types/sanitize-html@npm:^2.9.3": + version: 2.9.3 + resolution: "@types/sanitize-html@npm:2.9.3" dependencies: htmlparser2: ^8.0.0 - checksum: b60f42b740bbfb1b1434ce8b43925a38ecc608b60aa654fd009d2e22e33f324b61d370768c55bd2fd98e03de08518ffa8911d61606c483526fb931bb8b59d1b0 + checksum: 882a39ec767e0c5fd4402108db4b8e4f85ff555cf490ad8c7340d9c58c57c3ffefa33c0d248d5e67047df6f744ca60e125da5485efc18ac450783f3900178373 languageName: node linkType: hard @@ -13208,17 +13107,10 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^6.0.0": - version: 6.2.3 - resolution: "@types/semver@npm:6.2.3" - checksum: 83c86d7005b229df9c4c0d6d13825b839a01932895504596140aea19e2b88f63ac27ab1575347451b50eedb63f72309e845ce1a0ca78360c4f719bbb38371594 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.10, @types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 +"@types/semver@npm:^7.3.10, @types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": + version: 7.5.4 + resolution: "@types/semver@npm:7.5.4" + checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf languageName: node linkType: hard @@ -13260,12 +13152,12 @@ __metadata: languageName: node linkType: hard -"@types/sinon@npm:^10.0.15": - version: 10.0.15 - resolution: "@types/sinon@npm:10.0.15" +"@types/sinon@npm:^10.0.20": + version: 10.0.20 + resolution: "@types/sinon@npm:10.0.20" dependencies: "@types/sinonjs__fake-timers": "*" - checksum: cec6d7d9d5582ca3ac851b029d5d90451bfe6d376164253792a6eb6ddcd609a0411a7fac9ed92e1879e7d3ec091d2ea2e8dbb4f6140a1065439b81dc20cafa7c + checksum: 7322771345c202b90057f8112e0d34b7339e5ae1827fb1bfe385fc9e38ed6a2f18b4c66e88d27d98c775f7f74fb1167c0c14f61ca64155786534541e6c6eb05f languageName: node linkType: hard @@ -13299,12 +13191,12 @@ __metadata: languageName: node linkType: hard -"@types/speakeasy@npm:^2.0.7": - version: 2.0.7 - resolution: "@types/speakeasy@npm:2.0.7" +"@types/speakeasy@npm:^2.0.9": + version: 2.0.9 + resolution: "@types/speakeasy@npm:2.0.9" dependencies: "@types/node": "*" - checksum: 30152d950ea23654060ef596ea459935a9ea80ba4d9803b13fc9b02c7a27a7b5c96742f2cb00db51b19ba0e13ef9a16c1fd977042f61c9019b10c4191e2f1b97 + checksum: 4f3d2217f96625c481f9220a5d16a776c7003d9025fafe728f91f07ba815ac2233db4df85cf4a721b5e042a478f793eee6e4e54c397288f3a39e3f04aa8375ac languageName: node linkType: hard @@ -13324,10 +13216,10 @@ __metadata: languageName: node linkType: hard -"@types/strict-uri-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "@types/strict-uri-encode@npm:2.0.0" - checksum: e37b6e39fc1440d30bb5f114b3c56a4ecc5db1b7bb1f705bcf607d0eb9e8798953ccaa3792b35c97e74fe61fcc0ff80982d963c22bba056a0745098d4a5c6699 +"@types/strict-uri-encode@npm:^2.0.1": + version: 2.0.1 + resolution: "@types/strict-uri-encode@npm:2.0.1" + checksum: 63d62f43d20583428d112f6a9de5a444f31f8e314a8c57b9a59523f99ae3152e41e2e39ff0fb0404171135402d2226aba21a5db64de0d0d385ec8c11d5a0f4ce languageName: node linkType: hard @@ -13350,12 +13242,12 @@ __metadata: languageName: node linkType: hard -"@types/supertest@npm:^2.0.12": - version: 2.0.12 - resolution: "@types/supertest@npm:2.0.12" +"@types/supertest@npm:^2.0.15": + version: 2.0.15 + resolution: "@types/supertest@npm:2.0.15" dependencies: "@types/superagent": "*" - checksum: f0e2b44f86bec2f708d6a3d0cb209055b487922040773049b0f8c6b557af52d4b5fa904e17dfaa4ce6e610172206bbec7b62420d158fa57b6ffc2de37b1730d3 + checksum: 89c1983662f0ab20969b3a6c44344397fd222d0f78b282619aabbe817f7c88a64210fd2b8b8f075ea22a27084e30ebc287bc5105619cbbf9af7f008e77f6eb93 languageName: node linkType: hard @@ -13375,19 +13267,19 @@ __metadata: languageName: node linkType: hard -"@types/testing-library__jest-dom@npm:^5.9.1, @types/testing-library__jest-dom@npm:~5.14.6": - version: 5.14.6 - resolution: "@types/testing-library__jest-dom@npm:5.14.6" +"@types/testing-library__jest-dom@npm:^5.9.1, @types/testing-library__jest-dom@npm:~5.14.9": + version: 5.14.9 + resolution: "@types/testing-library__jest-dom@npm:5.14.9" dependencies: "@types/jest": "*" - checksum: 92f81cefeacba3b5c06d4b3fbea0341fe2bcaa6e425c026ae262de39f1148c2588cf3003112aa4ac0880c3972ffb77641a863f3be71518d1d8080402c944e326 + checksum: d364494fc2545316292e88861146146af1e3818792ca63b62a63758b2f737669b687f4aaddfcfbcb7d0e1ed7890a9bd05de23ff97f277d5e68de574497a9ee72 languageName: node linkType: hard -"@types/textarea-caret@npm:^3.0.1": - version: 3.0.1 - resolution: "@types/textarea-caret@npm:3.0.1" - checksum: 18ff4275f0411187aebf4f475e318f5c62a87c056d3ff280b86e18fca6bf2c9bfab9ea885135f210131df230fc761b9f560b66dd8d3d2ebb161610f4ffbf3541 +"@types/textarea-caret@npm:^3.0.2": + version: 3.0.2 + resolution: "@types/textarea-caret@npm:3.0.2" + checksum: 6989477fa7be544cb84ffbb3302d5c4c2632e7900e0fcc12adf9bd78f4d0ebbf38db9392cb39c8fa791aba935013e1b14aeb1c222f328a67de6202f945331e73 languageName: node linkType: hard @@ -13419,10 +13311,10 @@ __metadata: languageName: node linkType: hard -"@types/ua-parser-js@npm:^0.7.36": - version: 0.7.36 - resolution: "@types/ua-parser-js@npm:0.7.36" - checksum: 8c24d4dc12ed1b8b98195838093391c358c81bf75e9cae0ecec8f7824b441e069daaa17b974a3e257172caddb671439f0c0b44bf43bfcf409b7a574a25aab948 +"@types/ua-parser-js@npm:^0.7.38": + version: 0.7.38 + resolution: "@types/ua-parser-js@npm:0.7.38" + checksum: 8a44887f7c782ed4c59c4d9cb254674f2ff41d8f653da0c2bd6d4ace79cc3de1ce5648b77f906e337fb97328e1114583e54c3b8882d194e1b8cb281f407a1ef7 languageName: node linkType: hard @@ -13449,17 +13341,17 @@ __metadata: languageName: node linkType: hard -"@types/use-subscription@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/use-subscription@npm:1.0.0" - checksum: 47fff868682692ecda7110bd04ba4c5b1324854c0bcccc765606a42d4bd9be475207413c8829a883b98e7edd801100df53876da0ff89ac21a8f964e440636ef2 +"@types/use-subscription@npm:^1.0.1": + version: 1.0.1 + resolution: "@types/use-subscription@npm:1.0.1" + checksum: f9e3535d40dbcd606e7ef306120c52a78b9da7a94ebe0b56af8f8326984588b2db12fbc841e2b2d719728810816afa9c7d64b40a849048186a4308e2f3ff0339 languageName: node linkType: hard -"@types/use-sync-external-store@npm:^0.0.3": - version: 0.0.3 - resolution: "@types/use-sync-external-store@npm:0.0.3" - checksum: 161ddb8eec5dbe7279ac971531217e9af6b99f7783213566d2b502e2e2378ea19cf5e5ea4595039d730aa79d3d35c6567d48599f69773a02ffcff1776ec2a44e +"@types/use-sync-external-store@npm:^0.0.5": + version: 0.0.5 + resolution: "@types/use-sync-external-store@npm:0.0.5" + checksum: 96a22fa059d8a6d0fe0b03e5157eb22f599ab1cc58b9441617dec4be6d8586260fcf9041912ab90e92d9c6ea6dfec5c758bae6418552aa687fc7e0bb904e68bc languageName: node linkType: hard @@ -13477,14 +13369,14 @@ __metadata: languageName: node linkType: hard -"@types/webpack-bundle-analyzer@npm:^4": - version: 4.6.0 - resolution: "@types/webpack-bundle-analyzer@npm:4.6.0" +"@types/webpack-bundle-analyzer@npm:^4.6.2": + version: 4.6.2 + resolution: "@types/webpack-bundle-analyzer@npm:4.6.2" dependencies: "@types/node": "*" tapable: ^2.2.0 webpack: ^5 - checksum: 1cd5baa621a1dbe820bacf981d6e48f3423b733fb5e33c1356347e73d5e3e880ae6ebacf8f43d9e47e135d3ed2653ec5e40e12c6ce187f2eb3f548d9c949f6aa + checksum: 2f798e0c6a4aac9da84f56c4600c8fafbac7cc2316b0a0b3e35cab46f5b0d045c29b8c9803c64f03756faa941ff7344920e16b45fe46a322ae3be52f4c8dee76 languageName: node linkType: hard @@ -13575,31 +13467,31 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.1, @types/ws@npm:^8.5.5": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" +"@types/ws@npm:^8.5.1, @types/ws@npm:^8.5.5, @types/ws@npm:^8.5.8": + version: 8.5.8 + resolution: "@types/ws@npm:8.5.8" dependencies: "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a + checksum: 4ad30de842834d4dd8e6e1476470752709d4165352a3a36780f23f4fdb686d4ac8ca5e16a0e0622940ddace910b856ff8a0baa2e24e41d204fb7a6a02ab2172b languageName: node linkType: hard -"@types/xml-crypto@npm:~1.4.2": - version: 1.4.2 - resolution: "@types/xml-crypto@npm:1.4.2" +"@types/xml-crypto@npm:~1.4.4": + version: 1.4.4 + resolution: "@types/xml-crypto@npm:1.4.4" dependencies: "@types/node": "*" xpath: 0.0.27 - checksum: 8fe8fc709ba070c46249800105301a533eb95e1a7a696986e4ac753aed1d238a826bce2b1e0d2548559e03f4e57bee27e26df69417766814bc0dd6a9bf2a1763 + checksum: c19616b531b26d7f3fafee6165d7be42969bfa2ef7184f501c489c80515d483425fb97e55ae816d91cf2f92e765e81f0a7cfc97c5dedb46f829edb677b154a55 languageName: node linkType: hard -"@types/xml-encryption@npm:~1.2.1": - version: 1.2.1 - resolution: "@types/xml-encryption@npm:1.2.1" +"@types/xml-encryption@npm:~1.2.3": + version: 1.2.3 + resolution: "@types/xml-encryption@npm:1.2.3" dependencies: "@types/node": "*" - checksum: abfc6d779e1674c268258296e9c03b307cb80383c5d598c0cda1ad75dc901b8d4104b5818990086b08bac199dbe7374706913a29c58cf614a741847f912854f1 + checksum: 1f678c5cb7378702dd1bfbbe1ec3b4dd62d7b8350c225866df109d60c8c7c4e39b20d32193ead175b1c68944ce22ffcae470685371e6257bf0bfe45f7f366aec languageName: node linkType: hard @@ -14169,10 +14061,10 @@ __metadata: languageName: node linkType: hard -"@xmldom/xmldom@npm:^0.8.5, @xmldom/xmldom@npm:^0.8.8": - version: 0.8.8 - resolution: "@xmldom/xmldom@npm:0.8.8" - checksum: 5f5fc0482fcc599f62e3009516932a265e00f1bb2093fe2c76f3f8d9bfebdd13246f48d4132c9b301c7a573f0fa8712e56aa747dce75b179c2b73f1dde7b5f42 +"@xmldom/xmldom@npm:^0.8.10, @xmldom/xmldom@npm:^0.8.5": + version: 0.8.10 + resolution: "@xmldom/xmldom@npm:0.8.10" + checksum: 4c136aec31fb3b49aaa53b6fcbfe524d02a1dc0d8e17ee35bd3bf35e9ce1344560481cd1efd086ad1a4821541482528672306d5e37cdbd187f33d7fadd3e2cf0 languageName: node linkType: hard @@ -14886,7 +14778,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.1.3": +"aria-query@npm:5.1.3, aria-query@npm:^5.0.0": version: 5.1.3 resolution: "aria-query@npm:5.1.3" dependencies: @@ -14895,13 +14787,6 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.0.0": - version: 5.0.0 - resolution: "aria-query@npm:5.0.0" - checksum: c41f98866c5a304561ee8cae55856711cddad6f3f85d8cb43cc5f79667078d9b8979ce32d244c1ff364e6463a4d0b6865804a33ccc717fed701b281cf7dc6296 - languageName: node - linkType: hard - "arr-diff@npm:^4.0.0": version: 4.0.0 resolution: "arr-diff@npm:4.0.0" @@ -15028,19 +14913,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.map@npm:^1.0.4": - version: 1.0.4 - resolution: "array.prototype.map@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - es-array-method-boxes-properly: ^1.0.0 - is-string: ^1.0.7 - checksum: 08c8065ae9e60585c1262e54556da2340cd140dc799d790843c1f4ad3a3f458e9866d147c8ff0308741e8316904313f682803ca15c179f65cb2f5b993fa71a82 - languageName: node - linkType: hard - "array.prototype.map@npm:^1.0.5": version: 1.0.6 resolution: "array.prototype.map@npm:1.0.6" @@ -15432,20 +15304,27 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.0.3, babel-jest@npm:^29.5.0, babel-jest@npm:^29.6.1": - version: 29.6.1 - resolution: "babel-jest@npm:29.6.1" +"b4a@npm:^1.6.4": + version: 1.6.4 + resolution: "b4a@npm:1.6.4" + checksum: 81b086f9af1f8845fbef4476307236bda3d660c158c201db976f19cdce05f41f93110ab6b12fd7a2696602a490cc43d5410ee36a56d6eef93afb0d6ca69ac3b2 + languageName: node + linkType: hard + +"babel-jest@npm:^29.0.3, babel-jest@npm:^29.5.0, babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" dependencies: - "@jest/transform": ^29.6.1 + "@jest/transform": ^29.7.0 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.5.0 + babel-preset-jest: ^29.6.3 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: bc46cfba468edde91f34a8292501d4448a39fab72d80d7d95f4349feb114fa21becb01def007d6166de7933ab9633bf5b5e1b72ba6ffeaa991f7abf014a2f61d + checksum: ee6f8e0495afee07cac5e4ee167be705c711a8cc8a737e05a587a131fdae2b3c8f9aa55dfd4d9c03009ac2d27f2de63d8ba96d3e8460da4d00e8af19ef9a83f7 languageName: node linkType: hard @@ -15527,15 +15406,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-plugin-jest-hoist@npm:29.5.0" +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + checksum: 51250f22815a7318f17214a9d44650ba89551e6d4f47a2dc259128428324b52f5a73979d010cefd921fd5a720d8c1d55ad74ff601cd94c7bd44d5f6292fde2d1 languageName: node linkType: hard @@ -15649,15 +15528,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-preset-jest@npm:29.5.0" +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" dependencies: - babel-plugin-jest-hoist: ^29.5.0 + babel-plugin-jest-hoist: ^29.6.3 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb languageName: node linkType: hard @@ -16035,24 +15914,6 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.19.2": - version: 1.19.2 - resolution: "body-parser@npm:1.19.2" - dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: ~1.1.2 - http-errors: 1.8.1 - iconv-lite: 0.4.24 - on-finished: ~2.3.0 - qs: 6.9.7 - raw-body: 2.4.3 - type-is: ~1.6.18 - checksum: 7f777ea65670e2622ca4a785b5dcb2a68451b3bb8d4d0f41091d307d56b640dba588a9ae04d85dda2cdd5e42788266a783528d5417e5643720fd611fd52522e7 - languageName: node - linkType: hard - "body-parser@npm:1.20.1": version: 1.20.1 resolution: "body-parser@npm:1.20.1" @@ -16953,18 +16814,18 @@ __metadata: languageName: node linkType: hard -"chai@npm:>1.9.0, chai@npm:^4.3.7": - version: 4.3.7 - resolution: "chai@npm:4.3.7" +"chai@npm:>1.9.0, chai@npm:^4.3.10": + version: 4.3.10 + resolution: "chai@npm:4.3.10" dependencies: assertion-error: ^1.1.0 - check-error: ^1.0.2 - deep-eql: ^4.1.2 - get-func-name: ^2.0.0 - loupe: ^2.3.1 + check-error: ^1.0.3 + deep-eql: ^4.1.3 + get-func-name: ^2.0.2 + loupe: ^2.3.6 pathval: ^1.1.1 - type-detect: ^4.0.5 - checksum: 0bba7d267848015246a66995f044ce3f0ebc35e530da3cbdf171db744e14cbe301ab913a8d07caf7952b430257ccbb1a4a983c570a7c5748dc537897e5131f7c + type-detect: ^4.0.8 + checksum: 536668c60a0d985a0fbd94418028e388d243a925d7c5e858c7443e334753511614a3b6a124bac9ca077dfc4c37acc367d62f8c294960f440749536dc181dfc6d languageName: node linkType: hard @@ -17125,10 +16986,12 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.2": - version: 1.0.2 - resolution: "check-error@npm:1.0.2" - checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e +"check-error@npm:^1.0.2, check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: ^2.0.2 + checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 languageName: node linkType: hard @@ -17524,10 +17387,10 @@ __metadata: languageName: node linkType: hard -"codemirror@npm:^5.65.13": - version: 5.65.13 - resolution: "codemirror@npm:5.65.13" - checksum: 47060461edaebecd03b3fba4e73a30cdccc0c51ce3a3a05bafae3c9cafd682101383e94d77d54081eaf1ae18da5b74343e98343c637c52cea409956469039098 +"codemirror@npm:^5.65.15": + version: 5.65.15 + resolution: "codemirror@npm:5.65.15" + checksum: 30e0cff9bfb2265b94fa6766e13975cb71db228e114d6d8cdcc160b495e32b0ff921ac09959715e3fef30a48c5a9d0655ffd0ff6c5fe7024656add438bb2b058 languageName: node linkType: hard @@ -17997,13 +17860,6 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.4.2": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b - languageName: node - linkType: hard - "cookie@npm:0.5.0, cookie@npm:^0.5.0": version: 0.5.0 resolution: "cookie@npm:0.5.0" @@ -18234,6 +18090,23 @@ __metadata: languageName: node linkType: hard +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-config: ^29.7.0 + jest-util: ^29.7.0 + prompts: ^2.0.1 + bin: + create-jest: bin/create-jest.js + checksum: 1427d49458adcd88547ef6fa39041e1fe9033a661293aa8d2c3aa1b4967cb5bf4f0c00436c7a61816558f28ba2ba81a94d5c962e8022ea9a883978fc8e1f2945 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -19174,7 +19047,19 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.1.2": +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + languageName: node + linkType: hard + +"deep-eql@npm:^4.1.3": version: 4.1.3 resolution: "deep-eql@npm:4.1.3" dependencies: @@ -19411,13 +19296,6 @@ __metadata: languageName: node linkType: hard -"destroy@npm:~1.0.4": - version: 1.0.4 - resolution: "destroy@npm:1.0.4" - checksum: da9ab4961dc61677c709da0c25ef01733042614453924d65636a7db37308fef8a24cd1e07172e61173d471ca175371295fbc984b0af5b2b4ff47cd57bd784c03 - languageName: node - linkType: hard - "desvg-loader@npm:^0.1.0": version: 0.1.0 resolution: "desvg-loader@npm:0.1.0" @@ -19452,13 +19330,20 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": +"detect-libc@npm:^2.0.0": version: 2.0.1 resolution: "detect-libc@npm:2.0.1" checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 languageName: node linkType: hard +"detect-libc@npm:^2.0.2": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -19526,10 +19411,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.4.3": - version: 29.4.3 - resolution: "diff-sequences@npm:29.4.3" - checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa languageName: node linkType: hard @@ -20292,39 +20177,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.4": - version: 1.20.4 - resolution: "es-abstract@npm:1.20.4" - 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.3 - 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.7 - 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.2 - object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 - safe-regex-test: ^1.0.0 - string.prototype.trimend: ^1.0.5 - string.prototype.trimstart: ^1.0.5 - unbox-primitive: ^1.0.2 - checksum: 89297cc785c31aedf961a603d5a07ed16471e435d3a1b6d070b54f157cf48454b95cda2ac55e4b86ff4fe3276e835fcffd2771578e6fa634337da49b26826141 - languageName: node - linkType: hard - -"es-abstract@npm:^1.22.1": +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1": version: 1.22.2 resolution: "es-abstract@npm:1.22.2" dependencies: @@ -20684,13 +20537,13 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:~27.2.2": - version: 27.2.2 - resolution: "eslint-plugin-jest@npm:27.2.2" +"eslint-plugin-jest@npm:~27.2.3": + version: 27.2.3 + resolution: "eslint-plugin-jest@npm:27.2.3" dependencies: "@typescript-eslint/utils": ^5.10.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 + "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 eslint: ^7.0.0 || ^8.0.0 jest: "*" peerDependenciesMeta: @@ -20698,7 +20551,7 @@ __metadata: optional: true jest: optional: true - checksum: 98b63252d985f5dedf36ce9587dd4a0d24daf71ca8a997258343402c0d33ddd5070502378dafd9ac7fc0ef2e0d557b5c77f18e09ad73c71a52de8061db88293f + checksum: 4c7e07f52f17749ac6fd0ff5fcd5ce30b88983ba31eeee322e4d48859f55eaa112f06172e586ad2031c00ff28bb2dfdc3d35c83895251b9c0e860fa47dfc5ff4 languageName: node linkType: hard @@ -20711,16 +20564,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-playwright@npm:~0.15.0": - version: 0.15.0 - resolution: "eslint-plugin-playwright@npm:0.15.0" +"eslint-plugin-playwright@npm:~0.15.3": + version: 0.15.3 + resolution: "eslint-plugin-playwright@npm:0.15.3" peerDependencies: eslint: ">=7" eslint-plugin-jest: ">=25" peerDependenciesMeta: eslint-plugin-jest: optional: true - checksum: fe772ee1f611802f70310cd02d2048f64b244644fcb00b47e935aac8cfab800612b122fe50deb3e1ea6bde1d1d635a745f3574cc316fcccbeaaa278be9c2e20f + checksum: 5dff7f1d8346dac41980197ce24f2629f09acc44b612c38a6859cb31d5dc29caa4d9a09fec0b10443bae7ebc4b79d4c926dca284707bae729469016ce9f1dbfc languageName: node linkType: hard @@ -20748,12 +20601,12 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-refresh@npm:^0.4.1": - version: 0.4.1 - resolution: "eslint-plugin-react-refresh@npm:0.4.1" +"eslint-plugin-react-refresh@npm:^0.4.4": + version: 0.4.4 + resolution: "eslint-plugin-react-refresh@npm:0.4.4" peerDependencies: eslint: ">=7" - checksum: 932f982797ef54a87e20039c32739c1a6df8355165d17ba851620b4690632432f511605e20c30e6abdb4c58d2bd926e96347f9253db724dcf3dae92bd1258d1d + checksum: 6b93f43cef5f69c18751db3267ce6cc7cb88f07061df28fc12401be56d93f37134f2a794c760f51cd5f84c5e81d81b003ef761ca76e7674646808b82884aa356 languageName: node linkType: hard @@ -20782,9 +20635,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:~0.6.12": - version: 0.6.12 - resolution: "eslint-plugin-storybook@npm:0.6.12" +"eslint-plugin-storybook@npm:~0.6.15": + version: 0.6.15 + resolution: "eslint-plugin-storybook@npm:0.6.15" dependencies: "@storybook/csf": ^0.0.1 "@typescript-eslint/utils": ^5.45.0 @@ -20792,18 +20645,18 @@ __metadata: ts-dedent: ^2.2.0 peerDependencies: eslint: ">=6" - checksum: 8e0e160c71216019c291a5a03b797b5359076067d16ea03b3dec63594093d45398f028d15c47eb89f2ddb6e8db18cc7e376b02d921dacc4fb31bbc8da46363c8 + checksum: e2c4d7be3e695c88d7194c363fba8ac644b36583bf9d608aa59dcd53cc5e422f7828611ee49c7934639ce827c0206d33fa94b3ea452ffbd2c8e7254ed90bc412 languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^5.11.0, eslint-plugin-testing-library@npm:~5.11.0": - version: 5.11.0 - resolution: "eslint-plugin-testing-library@npm:5.11.0" +"eslint-plugin-testing-library@npm:^5.11.1, eslint-plugin-testing-library@npm:~5.11.1": + version: 5.11.1 + resolution: "eslint-plugin-testing-library@npm:5.11.1" dependencies: "@typescript-eslint/utils": ^5.58.0 peerDependencies: eslint: ^7.5.0 || ^8.0.0 - checksum: 7f19d3dedd7788b411ca3d9045de682feb26025b9c26d97d4e2f0bf62f5eaa276147d946bd5d0cd967b822e546a954330fdb7ef80485301264f646143f011a02 + checksum: 9f3fc68ef9f13016a4381b33ab5dbffcc189e5de3eaeba184bcf7d2771faa7f54e59c04b652162fb1c0f83fb52428dd909db5450a25508b94be59eba69fcc990 languageName: node linkType: hard @@ -21318,17 +21171,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.6.1": - version: 29.6.1 - resolution: "expect@npm:29.6.1" +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" dependencies: - "@jest/expect-utils": ^29.6.1 - "@types/node": "*" - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.6.1 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 - checksum: 4e712e52c90f6c54e748fd2876be33c43ada6a59088ddf6a1acb08b18b3b97b3a672124684abe32599986d2f2a438d5afad148837ee06ea386d2a4bf0348de78 + "@jest/expect-utils": ^29.7.0 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + checksum: 9257f10288e149b81254a0fda8ffe8d54a7061cd61d7515779998b012579d2b8c22354b0eb901daf0145f347403da582f75f359f4810c007182ad3fb318b5c0c languageName: node linkType: hard @@ -21355,7 +21207,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.16.4": +"express@npm:^4.16.4, express@npm:^4.17.1, express@npm:^4.17.2, express@npm:^4.17.3": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: @@ -21394,44 +21246,6 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.2, express@npm:^4.17.3": - version: 4.17.3 - resolution: "express@npm:4.17.3" - dependencies: - accepts: ~1.3.8 - array-flatten: 1.1.1 - body-parser: 1.19.2 - content-disposition: 0.5.4 - content-type: ~1.0.4 - cookie: 0.4.2 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: ~1.1.2 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - finalhandler: ~1.1.2 - fresh: 0.5.2 - merge-descriptors: 1.0.1 - methods: ~1.1.2 - on-finished: ~2.3.0 - parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.7 - qs: 6.9.7 - range-parser: ~1.2.1 - safe-buffer: 5.2.1 - send: 0.17.2 - serve-static: 1.14.2 - setprototypeof: 1.2.0 - statuses: ~1.5.0 - type-is: ~1.6.18 - utils-merge: 1.0.1 - vary: ~1.1.2 - checksum: 967e53b74a37eafdf9789b9938c8df86102928b4985b1ad5e385c709deeab405a364de95ca744bc2cc5d05b5d9cc1efc69ae2ae17688a462038648d5a924bfad - languageName: node - linkType: hard - "ext-list@npm:^2.0.0": version: 2.2.2 resolution: "ext-list@npm:2.2.2" @@ -21546,6 +21360,13 @@ __metadata: languageName: node linkType: hard +"fast-fifo@npm:^1.1.0, fast-fifo@npm:^1.2.0": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 + languageName: node + linkType: hard + "fast-glob@npm:^2.2.6": version: 2.2.7 resolution: "fast-glob@npm:2.2.7" @@ -21653,6 +21474,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:^4.2.4": + version: 4.3.2 + resolution: "fast-xml-parser@npm:4.3.2" + dependencies: + strnum: ^1.0.5 + bin: + fxparser: src/cli/cli.js + checksum: d507ce2efa5fd13d0a5ba28bd76dd68f2fc30ad8748357c37b70f360d19417866d79e35a688af067d5bceaaa796033fa985206aef9692f7a421e1326b6e73309 + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.12": version: 1.0.12 resolution: "fastest-levenshtein@npm:1.0.12" @@ -21660,7 +21492,7 @@ __metadata: languageName: node linkType: hard -"fastest-validator@npm:^1.16.0": +"fastest-validator@npm:^1.17.0": version: 1.17.0 resolution: "fastest-validator@npm:1.17.0" checksum: 0a6240f6dc7b544b3aadf9367410ecd64590dbfe505e6a24c339df954dd216f3a714d64a224abeef531d0a40dc348efe6cdbf59372d28954ac450cc0b212e0ec @@ -21962,7 +21794,7 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.1.2, finalhandler@npm:~1.1.2": +"finalhandler@npm:1.1.2": version: 1.1.2 resolution: "finalhandler@npm:1.1.2" dependencies: @@ -22529,19 +22361,7 @@ __metadata: languageName: node linkType: hard -"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: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.6": +"function.prototype.name@npm:^1.1.0, function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" dependencies: @@ -22560,7 +22380,7 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -22679,10 +22499,10 @@ __metadata: languageName: node linkType: hard -"generate-password@npm:^1.7.0": - version: 1.7.0 - resolution: "generate-password@npm:1.7.0" - checksum: c0d13e9a9c72d84adc4365a0c0dbd28463f2da1975b4ec83f34a126b95122551274755db641418e5aa11c8d94c1d216c8da8314f38e56e05378e1a43792f4614 +"generate-password@npm:^1.7.1": + version: 1.7.1 + resolution: "generate-password@npm:1.7.1" + checksum: 76ab72dcf13ae174e4e069b32b94d7c2613c6e83db1c00ffad17a480a80875b28c4ed8f0767b143f7103b0742afb45a10549e6ef2f72c0a994979e77b8e95b86 languageName: node linkType: hard @@ -22714,10 +22534,10 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.0": - version: 2.0.0 - resolution: "get-func-name@npm:2.0.0" - checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b languageName: node linkType: hard @@ -23087,16 +22907,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.0": - version: 1.0.2 - resolution: "globalthis@npm:1.0.2" - dependencies: - define-properties: ^1.1.3 - checksum: 5a5f3c7ab94708260a98106b35946b74bb57f6b2013e39668dc9e8770b80a3418103b63a2b4aa01c31af15fdf6a2940398ffc0a408573c34c2304f928895adff - languageName: node - linkType: hard - -"globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.0, globalthis@npm:^1.0.3": version: 1.0.3 resolution: "globalthis@npm:1.0.3" dependencies: @@ -23211,10 +23022,10 @@ __metadata: languageName: node linkType: hard -"google-libphonenumber@npm:^3.2.32": - version: 3.2.32 - resolution: "google-libphonenumber@npm:3.2.32" - checksum: 6f6e033df053759758c37a3ca76e83d2026933d900ffb24349040767561f81e4c2faa88a01b023019528f4f560d4a878c2c635b6e604c9d3111f801eb514c959 +"google-libphonenumber@npm:^3.2.33": + version: 3.2.33 + resolution: "google-libphonenumber@npm:3.2.33" + checksum: d029c19c7278ac9acb446028c2e304df16341732905a0cf8a105ab595cb19c01456fd57d76e48a3220038044d8ce361edc539eea2bfd924ea36fb28178cf7dbe languageName: node linkType: hard @@ -24089,19 +23900,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:1.8.1": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: ~1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.1 - checksum: d3c7e7e776fd51c0a812baff570bdf06fe49a5dc448b700ab6171b1250e4cf7db8b8f4c0b133e4bfe2451022a5790c1ca6c2cae4094dedd6ac8304a1267f91d2 - languageName: node - linkType: hard - "http-errors@npm:2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -24280,15 +24078,6 @@ __metadata: languageName: node linkType: hard -"husky@npm:^7.0.4": - version: 7.0.4 - resolution: "husky@npm:7.0.4" - bin: - husky: lib/bin.js - checksum: c6ec4af63da2c9522da8674a20ad9b48362cc92704896cc8a58c6a2a39d797feb2b806f93fbd83a6d653fbdceb2c3b6e0b602c6b2e8565206ffc2882ef7db9e9 - languageName: node - linkType: hard - "hyperquest@npm:~2.0.0": version: 2.0.0 resolution: "hyperquest@npm:2.0.0" @@ -24322,12 +24111,12 @@ __metadata: languageName: node linkType: hard -"i18next@npm:>=17.0.11, i18next@npm:~23.4.5": - version: 23.4.5 - resolution: "i18next@npm:23.4.5" +"i18next@npm:>=17.0.11, i18next@npm:~23.4.9": + version: 23.4.9 + resolution: "i18next@npm:23.4.9" dependencies: "@babel/runtime": ^7.22.5 - checksum: b39a1edc19fc6fb34df4fd95581e2b86dd5d8c8345e3409a3366df606a72b62f25ee31a82fb9b0e22161cd856408989c91b74ee737b0cce00d547e6d371a14f5 + checksum: 46ac2415dc817c0e25e1c5e64332249825cd63b5fb9a5d42e3a2329d4ecd098c0f15a243f56b53e03db02e2e9931ca9bb4447370b2436f9ad6556de40ce981cf languageName: node linkType: hard @@ -24905,10 +24694,10 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.0.1": - version: 2.0.1 - resolution: "ipaddr.js@npm:2.0.1" - checksum: dd194a394a843d470f88d17191b0948f383ed1c8e320813f850c336a0fcb5e9215d97ec26ca35ab4fbbd31392c8b3467f3e8344628029ed3710b2ff6b5d1034e +"ipaddr.js@npm:^2.0.1, ipaddr.js@npm:^2.1.0": + version: 2.1.0 + resolution: "ipaddr.js@npm:2.1.0" + checksum: 807a054f2bd720c4d97ee479d6c9e865c233bea21f139fb8dabd5a35c4226d2621c42e07b4ad94ff3f82add926a607d8d9d37c625ad0319f0e08f9f2bd1968e2 languageName: node linkType: hard @@ -25871,7 +25660,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": +"istanbul-lib-instrument@npm:^5.0.4": version: 5.1.0 resolution: "istanbul-lib-instrument@npm:5.1.0" dependencies: @@ -25884,6 +25673,19 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.1 + resolution: "istanbul-lib-instrument@npm:6.0.1" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^7.5.4 + checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 + languageName: node + linkType: hard + "istanbul-lib-processinfo@npm:^2.0.2": version: 2.0.3 resolution: "istanbul-lib-processinfo@npm:2.0.3" @@ -25970,59 +25772,59 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-changed-files@npm:29.5.0" +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" dependencies: execa: ^5.0.0 + jest-util: ^29.7.0 p-limit: ^3.1.0 - checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + checksum: 963e203893c396c5dfc75e00a49426688efea7361b0f0e040035809cecd2d46b3c01c02be2d9e8d38b1138357d2de7719ea5b5be21f66c10f2e9685a5a73bb99 languageName: node linkType: hard -"jest-circus@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-circus@npm:29.6.1" +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/expect": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.7.0 + "@jest/expect": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 - dedent: ^0.7.0 + dedent: ^1.0.0 is-generator-fn: ^2.0.0 - jest-each: ^29.6.1 - jest-matcher-utils: ^29.6.1 - jest-message-util: ^29.6.1 - jest-runtime: ^29.6.1 - jest-snapshot: ^29.6.1 - jest-util: ^29.6.1 + jest-each: ^29.7.0 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-runtime: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 p-limit: ^3.1.0 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 pure-rand: ^6.0.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: f3e39a74b601929448df92037f0599978d4d7a4b8f636f64e8020533d2d2b2f669d6729c80c6efed69341ca26753e5061e9787a0acd6c70af2127a94375ebb76 + checksum: 349437148924a5a109c9b8aad6d393a9591b4dac1918fc97d81b7fc515bc905af9918495055071404af1fab4e48e4b04ac3593477b1d5dcf48c4e71b527c70a7 languageName: node linkType: hard -"jest-cli@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-cli@npm:29.6.1" +"jest-cli@npm:^29.6.4": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" dependencies: - "@jest/core": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/core": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/types": ^29.6.3 chalk: ^4.0.0 + create-jest: ^29.7.0 exit: ^0.1.2 - graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.6.1 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 - prompts: ^2.0.1 + jest-config: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 yargs: ^17.3.1 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -26031,34 +25833,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: f5854ffea977b9a12520ea71f8d0cc8a626cbb93d7e1e6eea18a2a1f2b25f70f1b6b08a89f11b4dc7dd36a1776a9ac2cf8ec5c7998086f913ee690c06c07c949 + checksum: 664901277a3f5007ea4870632ed6e7889db9da35b2434e7cb488443e6bf5513889b344b7fddf15112135495b9875892b156faeb2d7391ddb9e2a849dcb7b6c36 languageName: node linkType: hard -"jest-config@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-config@npm:29.6.1" +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.6.1 - "@jest/types": ^29.6.1 - babel-jest: ^29.6.1 + "@jest/test-sequencer": ^29.7.0 + "@jest/types": ^29.6.3 + babel-jest: ^29.7.0 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.6.1 - jest-environment-node: ^29.6.1 - jest-get-type: ^29.4.3 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.1 - jest-runner: ^29.6.1 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 + jest-circus: ^29.7.0 + jest-environment-node: ^29.7.0 + jest-get-type: ^29.6.3 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-runner: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -26069,7 +25871,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 3a30afeb28cc5658ef9cd95f2551ab8a29641bb6d377eb239cba8e7522eb4611c9a98cdcf173d87f5ad7b5e1ad242c3cd5434a260107bd3c7e8305d05023e05c + checksum: 4cabf8f894c180cac80b7df1038912a3fc88f96f2622de33832f4b3314f83e22b08fb751da570c0ab2b7988f21604bdabade95e3c0c041068ac578c085cf7dff languageName: node linkType: hard @@ -26085,72 +25887,72 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.6.1": - version: 29.6.2 - resolution: "jest-diff@npm:29.6.2" +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" dependencies: chalk: ^4.0.0 - diff-sequences: ^29.4.3 - jest-get-type: ^29.4.3 - pretty-format: ^29.6.2 - checksum: 0effd66a0c23f8c139ebf7ca99ed30b479b86fff66f19ad4869f130aaf7ae6a24ca1533f697b7e4930cbe2ddffc85387723fcca673501c653fb77a38f538e959 + diff-sequences: ^29.6.3 + jest-get-type: ^29.6.3 + pretty-format: ^29.7.0 + checksum: 08e24a9dd43bfba1ef07a6374e5af138f53137b79ec3d5cc71a2303515335898888fa5409959172e1e05de966c9e714368d15e8994b0af7441f0721ee8e1bb77 languageName: node linkType: hard -"jest-docblock@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-docblock@npm:29.4.3" +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" dependencies: detect-newline: ^3.0.0 - checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + checksum: 66390c3e9451f8d96c5da62f577a1dad701180cfa9b071c5025acab2f94d7a3efc2515cfa1654ebe707213241541ce9c5530232cdc8017c91ed64eea1bd3b192 languageName: node linkType: hard -"jest-each@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-each@npm:29.6.1" +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 chalk: ^4.0.0 - jest-get-type: ^29.4.3 - jest-util: ^29.6.1 - pretty-format: ^29.6.1 - checksum: 9d2ea7ed5326ee8c22523b22c66c85fe73754ea39f9b389881956508ee441392c61072a5fbf673e39beddd31d011bb94acae3edc77053ba4f9aa5c060114a5c8 + jest-get-type: ^29.6.3 + jest-util: ^29.7.0 + pretty-format: ^29.7.0 + checksum: e88f99f0184000fc8813f2a0aa79e29deeb63700a3b9b7928b8a418d7d93cd24933608591dbbdea732b473eb2021c72991b5cc51a17966842841c6e28e6f691c languageName: node linkType: hard -"jest-environment-jsdom@npm:~29.6.1": - version: 29.6.1 - resolution: "jest-environment-jsdom@npm:29.6.1" +"jest-environment-jsdom@npm:~29.6.4": + version: 29.6.4 + resolution: "jest-environment-jsdom@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.1 - "@jest/fake-timers": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.6.4 + "@jest/fake-timers": ^29.6.4 + "@jest/types": ^29.6.3 "@types/jsdom": ^20.0.0 "@types/node": "*" - jest-mock: ^29.6.1 - jest-util: ^29.6.1 + jest-mock: ^29.6.3 + jest-util: ^29.6.3 jsdom: ^20.0.0 peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - checksum: e8a9bff00a011235b004699f34bc85b18fdac82049513410cbf2dc1c2dd332bc1b4f108976412df1d29f2fa8bf0360aaf84eb0f5b4db1db2fb7fc7155dc14be7 + checksum: 2afe105f12d7d93ca56e2e6f67ab07ada3dd3da0516d1198f254930683ab9feb2b8c14417baaca53544eed88fd7fb5744f0dbce2e100269746187317ce0347df languageName: node linkType: hard -"jest-environment-node@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-environment-node@npm:29.6.1" +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/fake-timers": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-mock: ^29.6.1 - jest-util: ^29.6.1 - checksum: a50287e1ff29d131646bd09acc3222ac6ea0ad61e86bf73851d318ef2be0633a421b8558c4a15ddc67e0ffcfc32da7f6a0d8a2ddbfa85453837899dec88d256c + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: 501a9966292cbe0ca3f40057a37587cb6def25e1e0c5e39ac6c650fe78d3c70a2428304341d084ac0cced5041483acef41c477abac47e9a290d5545fd2f15646 languageName: node linkType: hard @@ -26171,10 +25973,10 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-get-type@npm:29.4.3" - checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 languageName: node linkType: hard @@ -26203,65 +26005,65 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-haste-map@npm:29.6.1" +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 fb-watchman: ^2.0.0 fsevents: ^2.3.2 graceful-fs: ^4.2.9 - jest-regex-util: ^29.4.3 - jest-util: ^29.6.1 - jest-worker: ^29.6.1 + jest-regex-util: ^29.6.3 + jest-util: ^29.7.0 + jest-worker: ^29.7.0 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: 7c74d5a0f6aafa9f4e60fae7949d4774770c0243fb529c24f2f4c81229db479fa318dc8b81e8d226865aef1d600af10bd8404dd208e802318434b46f75d5d869 + checksum: c2c8f2d3e792a963940fbdfa563ce14ef9e14d4d86da645b96d3cd346b8d35c5ce0b992ee08593939b5f718cf0a1f5a90011a056548a1dbf58397d4356786f01 languageName: node linkType: hard -"jest-leak-detector@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-leak-detector@npm:29.6.1" +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" dependencies: - jest-get-type: ^29.4.3 - pretty-format: ^29.6.1 - checksum: 5122d40c248effaede4c9ee3a99046a3f30088fef7bfc4af534678b432455161399357af46deb6423de7e05c6597920d6ee8cd570e26048886a90d541334f8c8 + jest-get-type: ^29.6.3 + pretty-format: ^29.7.0 + checksum: e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 languageName: node linkType: hard -"jest-matcher-utils@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-matcher-utils@npm:29.6.1" +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" dependencies: chalk: ^4.0.0 - jest-diff: ^29.6.1 - jest-get-type: ^29.4.3 - pretty-format: ^29.6.1 - checksum: d2efa6aed6e4820758b732b9fefd315c7fa4508ee690da656e1c5ac4c1a0f4cee5b04c9719ee1fda9aeb883b4209186c145089ced521e715b9fa70afdfa4a9c6 + jest-diff: ^29.7.0 + jest-get-type: ^29.6.3 + pretty-format: ^29.7.0 + checksum: d7259e5f995d915e8a37a8fd494cb7d6af24cd2a287b200f831717ba0d015190375f9f5dc35393b8ba2aae9b2ebd60984635269c7f8cff7d85b077543b7744cd languageName: node linkType: hard -"jest-message-util@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-message-util@npm:29.6.1" +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 3e7cb2ff087fe72255292e151d24e4fbb4cd6134885c0a67a4b302f233fe4110bf7580b176f427f05ad7550eb878ed94237209785d09d659a7d171ffa59c068f + checksum: a9d025b1c6726a2ff17d54cc694de088b0489456c69106be6b615db7a51b7beb66788bea7a59991a019d924fbf20f67d085a445aedb9a4d6760363f4d7d09930 languageName: node linkType: hard @@ -26275,14 +26077,14 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-mock@npm:29.6.1" +"jest-mock@npm:^29.6.3, jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-util: ^29.6.1 - checksum: 5e902f1a7eba1eb1a64eb6c19947fe1316834359d9869d0e2644d8979b9cad0465885dc4c9909c471888cddeea835c938cec6263d386d3d1aad720fc74e52ea1 + jest-util: ^29.7.0 + checksum: 81ba9b68689a60be1482212878973700347cb72833c5e5af09895882b9eb5c4e02843a1bbdf23f94c52d42708bab53a30c45a3482952c9eec173d1eaac5b86c5 languageName: node linkType: hard @@ -26305,96 +26107,96 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-regex-util@npm:29.4.3" - checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-resolve-dependencies@npm:29.6.1" +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" dependencies: - jest-regex-util: ^29.4.3 - jest-snapshot: ^29.6.1 - checksum: cee0a0fe53fd4531492a526b6ccd32377baad1eff6e6c124f04e9dc920219fd23fd39be88bb9551ee68d5fe92a3af627b423c9bc65a2aa0ac8a223c0e74dbbbb + jest-regex-util: ^29.6.3 + jest-snapshot: ^29.7.0 + checksum: aeb75d8150aaae60ca2bb345a0d198f23496494677cd6aefa26fc005faf354061f073982175daaf32b4b9d86b26ca928586344516e3e6969aa614cb13b883984 languageName: node linkType: hard -"jest-resolve@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-resolve@npm:29.6.1" +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 + jest-haste-map: ^29.7.0 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 resolve: ^1.20.0 resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: 9ce979a0f4a751bea58caea76415112df2a3f4d58e294019872244728aadd001f0ec20c873a3c805dd8f7c762143b3c14d00f87d124ed87c9981fbf8723090ef + checksum: 0ca218e10731aa17920526ec39deaec59ab9b966237905ffc4545444481112cd422f01581230eceb7e82d86f44a543d520a71391ec66e1b4ef1a578bd5c73487 languageName: node linkType: hard -"jest-runner@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-runner@npm:29.6.1" +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" dependencies: - "@jest/console": ^29.6.1 - "@jest/environment": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/environment": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 - jest-docblock: ^29.4.3 - jest-environment-node: ^29.6.1 - jest-haste-map: ^29.6.1 - jest-leak-detector: ^29.6.1 - jest-message-util: ^29.6.1 - jest-resolve: ^29.6.1 - jest-runtime: ^29.6.1 - jest-util: ^29.6.1 - jest-watcher: ^29.6.1 - jest-worker: ^29.6.1 + jest-docblock: ^29.7.0 + jest-environment-node: ^29.7.0 + jest-haste-map: ^29.7.0 + jest-leak-detector: ^29.7.0 + jest-message-util: ^29.7.0 + jest-resolve: ^29.7.0 + jest-runtime: ^29.7.0 + jest-util: ^29.7.0 + jest-watcher: ^29.7.0 + jest-worker: ^29.7.0 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 0e4dbda26669ae31fee32f8a62b3119bba510f2d17a098d6157b48a73ed2fc9842405bf893f3045c12b3632c7c0e3399fb22684b18ab5566aff4905b26c79a9a + checksum: f0405778ea64812bf9b5c50b598850d94ccf95d7ba21f090c64827b41decd680ee19fcbb494007cdd7f5d0d8906bfc9eceddd8fa583e753e736ecd462d4682fb languageName: node linkType: hard -"jest-runtime@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-runtime@npm:29.6.1" +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/fake-timers": ^29.6.1 - "@jest/globals": ^29.6.1 - "@jest/source-map": ^29.6.0 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/globals": ^29.7.0 + "@jest/source-map": ^29.6.3 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 - jest-message-util: ^29.6.1 - jest-mock: ^29.6.1 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.1 - jest-snapshot: ^29.6.1 - jest-util: ^29.6.1 + jest-haste-map: ^29.7.0 + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 7c360c9694467d996f3d6d914fefa0e7bda554adda8c2b9fba31546dba663d71a64eda103ff68120a2422f3c16db8f0bc2c445923fe8fb934f37e53ef74fb429 + checksum: d19f113d013e80691e07047f68e1e3448ef024ff2c6b586ce4f90cd7d4c62a2cd1d460110491019719f3c59bfebe16f0e201ed005ef9f80e2cf798c374eed54e languageName: node linkType: hard @@ -26408,32 +26210,31 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-snapshot@npm:29.6.1" +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 "@babel/plugin-syntax-jsx": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 - "@types/prettier": ^2.1.5 + "@jest/expect-utils": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.6.1 + expect: ^29.7.0 graceful-fs: ^4.2.9 - jest-diff: ^29.6.1 - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.6.1 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 + jest-diff: ^29.7.0 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 natural-compare: ^1.4.0 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 semver: ^7.5.3 - checksum: e8f69d1fd4a29d354d4dca9eb2a22674b300f8ef509e4f1e75337c880414a00d2bdc9d3849a6855dbb5a76bfbe74603f33435378a3877e69f0838e4cc2244350 + checksum: 86821c3ad0b6899521ce75ee1ae7b01b17e6dfeff9166f2cf17f012e0c5d8c798f30f9e4f8f7f5bed01ea7b55a6bc159f5eda778311162cbfa48785447c237ad languageName: node linkType: hard @@ -26451,47 +26252,47 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.0.0, jest-util@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-util@npm:29.6.1" +"jest-util@npm:^29.0.0, jest-util@npm:^29.6.3, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: fc553556c1350c443449cadaba5fb9d604628e8b5ceb6ceaf4e7e08975b24277d0a14bf2e0f956024e03c23e556fcb074659423422a06fbedf2ab52978697ac7 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca languageName: node linkType: hard -"jest-validate@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-validate@npm:29.6.1" +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 camelcase: ^6.2.0 chalk: ^4.0.0 - jest-get-type: ^29.4.3 + jest-get-type: ^29.6.3 leven: ^3.1.0 - pretty-format: ^29.6.1 - checksum: d2491f3f33d9bbc2dcaaa6acbff26f257b59c5eeceb65a52a9c1cec2f679b836ec2a4658b7004c0ef9d90cd0d9bd664e41d5ed6900f932bea742dd8e6b85e7f1 + pretty-format: ^29.7.0 + checksum: 191fcdc980f8a0de4dbdd879fa276435d00eb157a48683af7b3b1b98b0f7d9de7ffe12689b617779097ff1ed77601b9f7126b0871bba4f776e222c40f62e9dae languageName: node linkType: hard -"jest-watcher@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-watcher@npm:29.6.1" +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" dependencies: - "@jest/test-result": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/test-result": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.6.1 + jest-util: ^29.7.0 string-length: ^4.0.1 - checksum: 69bd5a602284fdce6eba5486c5c57aca6b511d91cb0907c34c104d6dd931e18ce67baa7f8e280fa473e5d81ea3e7b9e7d94f712c37ab0b3b8cc2aec30676955d + checksum: 67e6e7fe695416deff96b93a14a561a6db69389a0667e9489f24485bb85e5b54e12f3b2ba511ec0b777eca1e727235b073e3ebcdd473d68888650489f88df92f languageName: node linkType: hard @@ -26527,26 +26328,26 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-worker@npm:29.6.1" +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" dependencies: "@types/node": "*" - jest-util: ^29.6.1 + jest-util: ^29.7.0 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 0af309ea4db17c4c47e84a9246f907960a15577683c005fdeafc8f3c06bc455136f95a6f28fa2a3e924b767eb4dacd9b40915a7707305f88586f099af3ac27a8 + checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 languageName: node linkType: hard -"jest@npm:~29.6.1": - version: 29.6.1 - resolution: "jest@npm:29.6.1" +"jest@npm:~29.6.4": + version: 29.6.4 + resolution: "jest@npm:29.6.4" dependencies: - "@jest/core": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/core": ^29.6.4 + "@jest/types": ^29.6.3 import-local: ^3.0.2 - jest-cli: ^29.6.1 + jest-cli: ^29.6.4 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -26554,7 +26355,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 7b8c0ca72f483e00ec19dcf9549f9a9af8ae468ab62925b148d714b58eb52d5fea9a082625193bc833d2d9b64cf65a11f3d37857636c5551af05c10aec4ce71b + checksum: ba28ca7a86d029bcd742bb254c0c8d0119c1e002ddae128ff6409ebabc0b29c36f69dbf3fdd326aff16e7b2500c9a918bbc6a9a5db4d966e035127242239439f languageName: node linkType: hard @@ -26864,7 +26665,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -27076,14 +26877,14 @@ __metadata: languageName: node linkType: hard -"katex@npm:^0.16.7, katex@npm:~0.16.7": - version: 0.16.7 - resolution: "katex@npm:0.16.7" +"katex@npm:~0.16.9": + version: 0.16.9 + resolution: "katex@npm:0.16.9" dependencies: commander: ^8.3.0 bin: katex: cli.js - checksum: 6c3f61e28820ecba074a149d17be6d731d8a950cdd7826851e16f2b0f3627c4119acd8c6e4fb86950063c4e99a6e478720ea6cca3dc82e59bbca81001ee00b70 + checksum: 861194dfd4d86505e657f688fb73048d46ac498edafce71199502a35b03c0ecc35ba930c631be79c4a09d90a0d23476673cd52f6bc367c7a161854d64005fa95 languageName: node linkType: hard @@ -27561,6 +27362,13 @@ __metadata: languageName: node linkType: hard +"lodash.escape@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.escape@npm:4.0.1" + checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f + languageName: node + linkType: hard + "lodash.flatten@npm:^4.4.0": version: 4.4.0 resolution: "lodash.flatten@npm:4.4.0" @@ -27589,6 +27397,13 @@ __metadata: languageName: node linkType: hard +"lodash.invokemap@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.invokemap@npm:4.6.0" + checksum: 646ceebbefbcb6da301f8c2868254680fd0bcdc6ada470495d9ae49c9c32938829c1b38a38c95d0258409a9655f85db404b16e648381c7450b7ed3d9c52d8808 + languageName: node + linkType: hard + "lodash.isboolean@npm:^3.0.3": version: 3.0.3 resolution: "lodash.isboolean@npm:3.0.3" @@ -27652,6 +27467,13 @@ __metadata: languageName: node linkType: hard +"lodash.pullall@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.pullall@npm:4.2.0" + checksum: 7a5fbaedf186ec197ce1e0b9ba1d88a89773ebaf6a8291c7d273838cac59cb3b339cf36ef00e94172862ee84d2304c38face161846f08f5581d0553dcbdcd090 + languageName: node + linkType: hard + "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" @@ -27694,6 +27516,13 @@ __metadata: languageName: node linkType: hard +"lodash.uniqby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.uniqby@npm:4.7.0" + checksum: 659264545a95726d1493123345aad8cbf56e17810fa9a0b029852c6d42bc80517696af09d99b23bef1845d10d95e01b8b4a1da578f22aeba7a30d3e0022a4938 + languageName: node + linkType: hard + "lodash.without@npm:^4.4.0": version: 4.4.0 resolution: "lodash.without@npm:4.4.0" @@ -27805,12 +27634,12 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^2.3.1": - version: 2.3.4 - resolution: "loupe@npm:2.3.4" +"loupe@npm:^2.3.6": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" dependencies: - get-func-name: ^2.0.0 - checksum: 5af91db61aa18530f1749a64735ee194ac263e65e9f4d1562bf3036c591f1baa948289c193e0e34c7b5e2c1b75d3c1dc4fce87f5edb3cee10b0c0df46bc9ffb3 + get-func-name: ^2.0.1 + checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b languageName: node linkType: hard @@ -29041,15 +28870,15 @@ __metadata: languageName: node linkType: hard -"moleculer@npm:^0.14.29": - version: 0.14.29 - resolution: "moleculer@npm:0.14.29" +"moleculer@npm:^0.14.31": + version: 0.14.31 + resolution: "moleculer@npm:0.14.31" dependencies: args: ^5.0.3 eventemitter2: ^6.4.9 - fastest-validator: ^1.16.0 + fastest-validator: ^1.17.0 glob: ^7.2.0 - ipaddr.js: ^2.0.1 + ipaddr.js: ^2.1.0 kleur: ^4.1.5 lodash: ^4.17.21 lru-cache: ^6.0.0 @@ -29126,7 +28955,7 @@ __metadata: bin: moleculer-runner: bin/moleculer-runner.js moleculer-runner-esm: bin/moleculer-runner.mjs - checksum: b04d1012dcf86136e1bfc1930a0acfde028295cc5220ae0ed8f4d23236cf63fa3417f01f1f82cd11d1661aebd32d4834bffe052dbe6d89d514acde1d9a107eff + checksum: 4d6d05f98e2174b708de8c946901a4a3a1de411505f43909216a9d2ff93820e6eec7edd44b45c99ab04c6c312304a63a346288e181fead48558763fb4ec69c24 languageName: node linkType: hard @@ -29567,12 +29396,12 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^5.0.0": - version: 5.0.0 - resolution: "node-addon-api@npm:5.0.0" +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" dependencies: node-gyp: latest - checksum: 7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334 + checksum: 3a539510e677cfa3a833aca5397300e36141aca064cdc487554f2017110709a03a95da937e98c2a14ec3c626af7b2d1b6dabe629a481f9883143d0d5bff07bf2 languageName: node linkType: hard @@ -30182,14 +30011,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 - languageName: node - linkType: hard - -"object-inspect@npm:^1.12.3": +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db @@ -31485,13 +31307,14 @@ __metadata: languageName: node linkType: hard -"playwright-qase-reporter@npm:^1.2.0-alpha.3": - version: 1.2.0-alpha.3 - resolution: "playwright-qase-reporter@npm:1.2.0-alpha.3" +"playwright-qase-reporter@npm:^1.2.1": + version: 1.2.1 + resolution: "playwright-qase-reporter@npm:1.2.1" dependencies: + chalk: ^4.1.0 form-data: ^3.0.0 - qaseio: ^2.0.1 - checksum: 6c1960dbb49928c9d5b77eeb955c2a674cf28d97141d7406354b908688f0983c8da0c7d0b2d620bb39411a99663803055a5359812726982ad4e53c7c54fd8c84 + qaseio: ^2.0.2 + checksum: 8b4d2f5902a8d655b781e9dd6898d5d2f25739033f1fda2b600b07ac3fc7680f9a1ee917a969b7315f4f05211e36f1a6699155f9ead05a435afa695932bde9fa languageName: node linkType: hard @@ -32218,12 +32041,12 @@ __metadata: languageName: node linkType: hard -"postcss-scss@npm:^4.0.6": - version: 4.0.6 - resolution: "postcss-scss@npm:4.0.6" +"postcss-scss@npm:^4.0.9": + version: 4.0.9 + resolution: "postcss-scss@npm:4.0.9" peerDependencies: - postcss: ^8.4.19 - checksum: 133a1cba31e2e167f4e841e66ec6a798eaf44c7911f9182ade0b5b1e71a8198814aa390b8c9d5db6b01358115232e5b15b1a4f8c5198acfccfb1f3fdbd328cdf + postcss: ^8.4.29 + checksum: dc358bafc23d52ed3a9a29333808825deba213042be74ece6eae7a61c692f67d0e6691fa7005367b013c01c79562fbb9ef2fe4c0485075233931bd90715f5132 languageName: node linkType: hard @@ -32360,14 +32183,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.23, postcss@npm:~8.4.24": - version: 8.4.24 - resolution: "postcss@npm:8.4.24" +"postcss@npm:^8.2.15, postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.23, postcss@npm:~8.4.31": + version: 8.4.31 + resolution: "postcss@npm:8.4.31" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d + checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea languageName: node linkType: hard @@ -32547,14 +32370,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.1, pretty-format@npm:^29.6.2": - version: 29.6.2 - resolution: "pretty-format@npm:29.6.2" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: a0f972a44f959023c0df9cdfe9eed7540264d7f7ddf74667db8a5294444d5aa153fd47d20327df10ae86964e2ceec10e46ea06b1a5c9c12e02348b78c952c9fc + checksum: 032c1602383e71e9c0c02a01bbd25d6759d60e9c7cf21937dde8357aa753da348fcec5def5d1002c9678a8524d5fe099ad98861286550ef44de8808cc61e43b6 languageName: node linkType: hard @@ -32635,18 +32458,18 @@ __metadata: languageName: node linkType: hard -"prometheus-gc-stats@npm:^0.6.4": - version: 0.6.4 - resolution: "prometheus-gc-stats@npm:0.6.4" +"prometheus-gc-stats@npm:^0.6.5": + version: 0.6.5 + resolution: "prometheus-gc-stats@npm:0.6.5" dependencies: gc-stats: ^1.4.0 optional: ^0.1.3 peerDependencies: - prom-client: ">= 10 <= 12" + prom-client: ">= 10 <= 14" dependenciesMeta: gc-stats: optional: true - checksum: 1e632cd0b9ad893b5ee1c3df0b5a3af27a69f2b0c821714d793dcf30de04489c9e207ad5e2ee062b61fc76681a1dbeab268cf31388fc55575501052115d0c410 + checksum: a0a83745937b581e6c5afbe95e6aaef6ca004cf25d35d05f7300e6db26bf37486802b14f972e02f7b332fcf3bcfe4c792d05383d004985d480b8b9450e04f8b8 languageName: node linkType: hard @@ -32674,21 +32497,7 @@ __metadata: languageName: node linkType: hard -"promise.allsettled@npm:^1.0.0": - version: 1.0.5 - resolution: "promise.allsettled@npm:1.0.5" - dependencies: - array.prototype.map: ^1.0.4 - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - get-intrinsic: ^1.1.1 - iterate-value: ^1.0.2 - checksum: 92775552d3a3487ed924852e5de00a217a202cefc833e8cc169283fe4f7dbe09953505b0c7471b2681e09aa7d064bdbd07b978d44ff536f712e4dcd7c9faba35 - languageName: node - linkType: hard - -"promise.allsettled@npm:^1.0.2": +"promise.allsettled@npm:^1.0.0, promise.allsettled@npm:^1.0.2": version: 1.0.7 resolution: "promise.allsettled@npm:1.0.7" dependencies: @@ -32937,13 +32746,13 @@ __metadata: languageName: node linkType: hard -"qaseio@npm:^2.0.1": - version: 2.0.1 - resolution: "qaseio@npm:2.0.1" +"qaseio@npm:^2.0.2": + version: 2.0.2 + resolution: "qaseio@npm:2.0.2" dependencies: axios: ^0.25.0 form-data: ^3.0.0 - checksum: 3542f968c05294615a42bc1f57c92a4d7073055466bc2588876de09d6bcd7f7af8b4180db2c04ef01cc4e9c3326c7405c78500e6c83de9d3bb23b12f95246d79 + checksum: 33a0307f2daaf614d719c7c049e50b3aabf1cb783c93355e42ece5a254fac3e68741b4decf9dca0553a48decf8967610cabe058ea135ea8d7bf93f160a6e3902 languageName: node linkType: hard @@ -32963,13 +32772,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.9.7": - version: 6.9.7 - resolution: "qs@npm:6.9.7" - checksum: 5bbd263332ccf320a1f36d04a2019a5834dc20bcb736431eaccde2a39dcba03fb26d2fd00174f5d7bc26aaad1cad86124b18440883ac042ea2a0fca6170c1bf1 - languageName: node - linkType: hard - "qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" @@ -33044,6 +32846,13 @@ __metadata: languageName: node linkType: hard +"queue-tick@npm:^1.0.1": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 57c3292814b297f87f792fbeb99ce982813e4e54d7a8bdff65cf53d5c084113913289d4a48ec8bbc964927a74b847554f9f4579df43c969a6c8e0f026457ad01 + languageName: node + linkType: hard + "queue@npm:6.0.2, queue@npm:^6.0.1": version: 6.0.2 resolution: "queue@npm:6.0.2" @@ -33227,18 +33036,6 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.4.3": - version: 2.4.3 - resolution: "raw-body@npm:2.4.3" - dependencies: - bytes: 3.1.2 - http-errors: 1.8.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: d2961fa3c71c9c22dc2c3fd60ff377bf36dfed7d7a748f2b25d585934a3e9df565bb9aa5bc2e3a716ea941f4bc2a6ddc795c8b0cf7219fb071029b59b1985394 - languageName: node - linkType: hard - "raw-body@npm:2.5.1": version: 2.5.1 resolution: "raw-body@npm:2.5.1" @@ -33275,7 +33072,7 @@ __metadata: languageName: node linkType: hard -"rc-scrollbars@npm:^1.1.5, rc-scrollbars@npm:^1.1.6": +"rc-scrollbars@npm:^1.1.6": version: 1.1.6 resolution: "rc-scrollbars@npm:1.1.6" dependencies: @@ -33494,9 +33291,9 @@ __metadata: languageName: node linkType: hard -"react-i18next@npm:~13.2.1": - version: 13.2.1 - resolution: "react-i18next@npm:13.2.1" +"react-i18next@npm:~13.2.2": + version: 13.2.2 + resolution: "react-i18next@npm:13.2.2" dependencies: "@babel/runtime": ^7.22.5 html-parse-stringify: ^3.0.1 @@ -33508,7 +33305,7 @@ __metadata: optional: true react-native: optional: true - checksum: aa3bd7b0f9f3d794e756a7fe087471c20c13dc2fbf5e53400403a356973d87a1b76f0204720081914bd06cb94d92bf987ebbf33c3de3c67a0cc9b32dde8972f1 + checksum: 2b85bfb347af1a00add1c02901025706f7d2037fade4e8aa08159287ddf012e8cf35626eb9f5c578b9d1c24c065c69f2ad4b5a3087fb5cdbea540f8bc18c0f59 languageName: node linkType: hard @@ -34163,18 +33960,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0": - version: 1.5.0 - resolution: "regexp.prototype.flags@npm:1.5.0" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - functions-have-names: ^1.2.3 - checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.1": +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": version: 1.5.1 resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: @@ -34769,10 +34555,9 @@ __metadata: version: 0.0.0-use.local resolution: "rocket.chat@workspace:." dependencies: - "@changesets/cli": ^2.26.1 - "@types/chart.js": ^2.9.37 - "@types/js-yaml": ^4.0.5 - husky: ^7.0.4 + "@changesets/cli": ^2.26.2 + "@types/chart.js": ^2.9.39 + "@types/js-yaml": ^4.0.8 node-gyp: ^9.4.1 turbo: ~1.10.16 languageName: unknown @@ -34793,13 +34578,13 @@ __metadata: "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": next "@rocket.chat/ui-kit": ^0.32.1 - "@types/cookie": ^0.5.1 - "@types/cookie-parser": ^1.4.3 - "@types/ejson": ^2.2.0 - "@types/express": ^4.17.17 - "@types/fibers": ^3.1.1 - "@types/node": ^14.18.51 - "@types/ws": ^8.5.5 + "@types/cookie": ^0.5.3 + "@types/cookie-parser": ^1.4.5 + "@types/ejson": ^2.2.1 + "@types/express": ^4.17.20 + "@types/fibers": ^3.1.3 + "@types/node": ^14.18.63 + "@types/ws": ^8.5.8 ajv: ^8.11.0 bcrypt: ^5.0.1 body-parser: ^1.20.2 @@ -34812,7 +34597,7 @@ __metadata: fibers: ^5.0.3 jaeger-client: ^3.19.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.6.1 npm-run-all: ^4.1.5 @@ -35277,14 +35062,14 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.x, semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3": - version: 7.5.3 - resolution: "semver@npm:7.5.3" +"semver@npm:7.x, semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard @@ -35297,17 +35082,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - "semver@npm:~5.3.0": version: 5.3.0 resolution: "semver@npm:5.3.0" @@ -35326,27 +35100,6 @@ __metadata: languageName: node linkType: hard -"send@npm:0.17.2": - version: 0.17.2 - resolution: "send@npm:0.17.2" - dependencies: - debug: 2.6.9 - depd: ~1.1.2 - destroy: ~1.0.4 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 1.8.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: ~2.3.0 - range-parser: ~1.2.1 - statuses: ~1.5.0 - checksum: c28f36deb4ccba9b8d6e6a1e472b8e7c40a1f51575bdf8f67303568cc9e71131faa3adc36fdb72611616ccad1584358bbe4c3ebf419e663ecc5de868ad3d3f03 - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -35459,18 +35212,6 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.14.2": - version: 1.14.2 - resolution: "serve-static@npm:1.14.2" - dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.3 - send: 0.17.2 - checksum: d97f3183b1dfcd8ce9c0e37e18e87fd31147ed6c8ee0b2c3a089d795e44ee851ca5061db01574f806d54f4e4b70bc694d9ca64578653514e04a28cbc97a1de05 - languageName: node - linkType: hard - "serve-static@npm:1.15.0": version: 1.15.0 resolution: "serve-static@npm:1.15.0" @@ -35581,20 +35322,20 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.30.7": - version: 0.30.7 - resolution: "sharp@npm:0.30.7" +"sharp@npm:^0.32.6": + version: 0.32.6 + resolution: "sharp@npm:0.32.6" dependencies: color: ^4.2.3 - detect-libc: ^2.0.1 - node-addon-api: ^5.0.0 + detect-libc: ^2.0.2 + node-addon-api: ^6.1.0 node-gyp: latest prebuild-install: ^7.1.1 - semver: ^7.3.7 + semver: ^7.5.4 simple-get: ^4.0.1 - tar-fs: ^2.1.1 + tar-fs: ^3.0.4 tunnel-agent: ^0.6.0 - checksum: bbc63ca3c7ea8a5bff32cd77022cfea30e25a03f5bd031e935924bf6cf0e11e3388e8b0e22b3137bf8816aa73407f1e4fbeb190f3a35605c27ffca9f32b91601 + checksum: 0cca1d16b1920800c0e22d27bc6305f4c67c9ebe44f67daceb30bf645ae39e7fb7dfbd7f5d6cd9f9eebfddd87ac3f7e2695f4eb906d19b7a775286238e6a29fc languageName: node linkType: hard @@ -35732,14 +35473,14 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^1.0.7": - version: 1.0.19 - resolution: "sirv@npm:1.0.19" +"sirv@npm:^2.0.3": + version: 2.0.3 + resolution: "sirv@npm:2.0.3" dependencies: "@polka/url": ^1.0.0-next.20 mrmime: ^1.0.0 - totalist: ^1.0.0 - checksum: c943cfc61baf85f05f125451796212ec35d4377af4da90ae8ec1fa23e6d7b0b4d9c74a8fbf65af83c94e669e88a09dc6451ba99154235eead4393c10dda5b07c + totalist: ^3.0.0 + checksum: e2dfd4c97735a6ad6d842d0eec2cd9e3919ff0e46f0d228248c5753ad4b70b832711e77e1259c031c439cdb08303cc54d923685c92b0e890145cc733af7c5568 languageName: node linkType: hard @@ -36346,7 +36087,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:1.5.0, statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:~1.5.0": +"statuses@npm:1.5.0, statuses@npm:>= 1.4.0 < 2, statuses@npm:~1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c @@ -36519,6 +36260,16 @@ __metadata: languageName: node linkType: hard +"streamx@npm:^2.15.0": + version: 2.15.5 + resolution: "streamx@npm:2.15.5" + dependencies: + fast-fifo: ^1.1.0 + queue-tick: ^1.0.1 + checksum: 52e0ec94026d67c9e2e2e1090f05e5b138c2f2822462d9a8ef4a4805625a31d103e55ea5267fcd9bfe041374926424e42aec2dda28a85cb9de42c2a16d416d94 + languageName: node + linkType: hard + "strict-uri-encode@npm:^1.0.0": version: 1.1.0 resolution: "strict-uri-encode@npm:1.1.0" @@ -36709,17 +36460,6 @@ __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.trimend@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimend@npm:1.0.7" @@ -36731,17 +36471,6 @@ __metadata: languageName: node linkType: hard -"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.prototype.trimstart@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimstart@npm:1.0.7" @@ -37316,6 +37045,17 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^3.0.4": + version: 3.0.4 + resolution: "tar-fs@npm:3.0.4" + dependencies: + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^3.1.5 + checksum: dcf4054f9e92ca0efe61c2b3f612914fb259a47900aa908a63106513a6d006c899b426ada53eb88d9dbbf089b5724c8e90b96a2c4ca6171845fa14203d734e30 + languageName: node + linkType: hard + "tar-stream@npm:^1.5.2, tar-stream@npm:^1.6.2": version: 1.6.2 resolution: "tar-stream@npm:1.6.2" @@ -37344,6 +37084,17 @@ __metadata: languageName: node linkType: hard +"tar-stream@npm:^3.1.5": + version: 3.1.6 + resolution: "tar-stream@npm:3.1.6" + dependencies: + b4a: ^1.6.4 + fast-fifo: ^1.2.0 + streamx: ^2.15.0 + checksum: f3627f918581976e954ff03cb8d370551053796b82564f8c7ca8fac84c48e4d042026d0854fc222171a34ff9c682b72fae91be9c9b0a112d4c54f9e4f443e9c5 + languageName: node + linkType: hard + "tar@npm:^4": version: 4.4.19 resolution: "tar@npm:4.4.19" @@ -37881,10 +37632,10 @@ __metadata: languageName: node linkType: hard -"totalist@npm:^1.0.0": - version: 1.1.0 - resolution: "totalist@npm:1.1.0" - checksum: dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a languageName: node linkType: hard @@ -38454,7 +38205,7 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.5, type-detect@npm:^4.0.8": +"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 @@ -38637,10 +38388,10 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.35 - resolution: "ua-parser-js@npm:1.0.35" - checksum: 02370d38a0c8b586f2503d1c3bbba5cbc0b97d407282f9023201a99e4c03eae4357a2800fdf50cf80d73ec25c0b0cc5bfbaa03975b0add4043d6e4c86712c9c1 +"ua-parser-js@npm:^1.0.37": + version: 1.0.37 + resolution: "ua-parser-js@npm:1.0.37" + checksum: 4d481c720d523366d7762dc8a46a1b58967d979aacf786f9ceceb1cd767de069f64a4bdffb63956294f1c0696eb465ddb950f28ba90571709e33521b4bd75e07 languageName: node linkType: hard @@ -39451,12 +39202,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" +"uuid@npm:^9.0.0, uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" bin: uuid: dist/bin/uuid - checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 languageName: node linkType: hard @@ -39805,14 +39556,14 @@ __metadata: languageName: node linkType: hard -"webdav@npm:^4.11.2": - version: 4.11.2 - resolution: "webdav@npm:4.11.2" +"webdav@npm:^4.11.3": + version: 4.11.3 + resolution: "webdav@npm:4.11.3" dependencies: axios: ^0.27.2 base-64: ^1.0.0 byte-length: ^1.0.2 - fast-xml-parser: ^3.19.0 + fast-xml-parser: ^4.2.4 he: ^1.2.0 hot-patcher: ^1.0.0 layerr: ^0.1.2 @@ -39822,7 +39573,7 @@ __metadata: path-posix: ^1.0.0 url-join: ^4.0.1 url-parse: ^1.5.10 - checksum: 6fe040b43e350cb15febf688d8eabe45dbe3c74922c94a3730d63911139def435de7f410439e4e1eac6b46d545b6a3631808cc773647b04e6e41731f8ad5f011 + checksum: e5bfc66149088cd857c23a3a549650d7483dd5615cf1c4b6251a5b290a4ad8fef4975bfd99fca2d5842a0eaadc056bc0044e37893e0ad5447e6ce2e2dbd81da5 languageName: node linkType: hard @@ -39861,23 +39612,30 @@ __metadata: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:^4.9.0": - version: 4.9.0 - resolution: "webpack-bundle-analyzer@npm:4.9.0" +"webpack-bundle-analyzer@npm:^4.9.1": + version: 4.9.1 + resolution: "webpack-bundle-analyzer@npm:4.9.1" dependencies: "@discoveryjs/json-ext": 0.5.7 acorn: ^8.0.4 acorn-walk: ^8.0.0 - chalk: ^4.1.0 commander: ^7.2.0 + escape-string-regexp: ^4.0.0 gzip-size: ^6.0.0 - lodash: ^4.17.20 + is-plain-object: ^5.0.0 + lodash.debounce: ^4.0.8 + lodash.escape: ^4.0.1 + lodash.flatten: ^4.4.0 + lodash.invokemap: ^4.6.0 + lodash.pullall: ^4.2.0 + lodash.uniqby: ^4.7.0 opener: ^1.5.2 - sirv: ^1.0.7 + picocolors: ^1.0.0 + sirv: ^2.0.3 ws: ^7.3.1 bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: e439aea4e88e18bfdc16eb69782c1bb17b2e581905a5cfa8d34058dc6677f6e202f896189268e58b49fa14ae12f5ef4c25cdca9f98f3de7e6699ac62def2f0af + checksum: 7e891c28d5a903242893e55ecc714fa01d7ad6bedade143235c07091b235915349812fa048968462781d59187507962f38b6c61ed7d25fb836ba0ac0ee919a39 languageName: node linkType: hard @@ -40165,44 +39923,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:>=4.0.0 <6.0.0, webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5, webpack@npm:^5.9.0": - version: 5.88.2 - resolution: "webpack@npm:5.88.2" - dependencies: - "@types/eslint-scope": ^3.7.3 - "@types/estree": ^1.0.0 - "@webassemblyjs/ast": ^1.11.5 - "@webassemblyjs/wasm-edit": ^1.11.5 - "@webassemblyjs/wasm-parser": ^1.11.5 - acorn: ^8.7.1 - acorn-import-assertions: ^1.9.0 - browserslist: ^4.14.5 - chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.15.0 - es-module-lexer: ^1.2.1 - eslint-scope: 5.1.1 - events: ^3.2.0 - glob-to-regexp: ^0.4.1 - graceful-fs: ^4.2.9 - json-parse-even-better-errors: ^2.3.1 - loader-runner: ^4.2.0 - mime-types: ^2.1.27 - neo-async: ^2.6.2 - schema-utils: ^3.2.0 - tapable: ^2.1.1 - terser-webpack-plugin: ^5.3.7 - watchpack: ^2.4.0 - webpack-sources: ^3.2.3 - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 79476a782da31a21f6dd38fbbd06b68da93baf6a62f0d08ca99222367f3b8668f5a1f2086b7bb78e23172e31fa6df6fa7ab09b25e827866c4fc4dc2b30443ce2 - languageName: node - linkType: hard - -"webpack@npm:^5.89.0": +"webpack@npm:>=4.0.0 <6.0.0, webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5, webpack@npm:^5.89.0, webpack@npm:^5.9.0": version: 5.89.0 resolution: "webpack@npm:5.89.0" dependencies: @@ -40275,10 +39996,10 @@ __metadata: languageName: node linkType: hard -"whatwg-fetch@npm:^3.6.2": - version: 3.6.2 - resolution: "whatwg-fetch@npm:3.6.2" - checksum: ee976b7249e7791edb0d0a62cd806b29006ad7ec3a3d89145921ad8c00a3a67e4be8f3fb3ec6bc7b58498724fd568d11aeeeea1f7827e7e1e5eae6c8a275afed +"whatwg-fetch@npm:^3.6.19": + version: 3.6.19 + resolution: "whatwg-fetch@npm:3.6.19" + checksum: 2896bc9ca867ea514392c73e2a272f65d5c4916248fe0837a9df5b1b92f247047bc76cf7c29c28a01ac6c5fb4314021d2718958c8a08292a96d56f72b2f56806 languageName: node linkType: hard