From ed4ea307d8c73babc62ce23935550e7b573786a3 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Wed, 21 Aug 2024 10:37:21 -0600 Subject: [PATCH 1/4] feat: Allow apps to react/unreact to messages (#33001) --- .changeset/nasty-windows-smile.md | 5 ++++ .../app/apps/server/bridges/messages.ts | 22 ++++++++++++++++ apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 2 +- ee/apps/ddp-streamer/package.json | 2 +- ee/packages/presence/package.json | 2 +- packages/apps/package.json | 2 +- packages/core-services/package.json | 2 +- packages/core-typings/package.json | 2 +- packages/fuselage-ui-kit/package.json | 2 +- packages/rest-typings/package.json | 2 +- yarn.lock | 26 +++++++++---------- 12 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 .changeset/nasty-windows-smile.md diff --git a/.changeset/nasty-windows-smile.md b/.changeset/nasty-windows-smile.md new file mode 100644 index 000000000000..e80ec3db27a9 --- /dev/null +++ b/.changeset/nasty-windows-smile.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Allow apps to react/unreact to messages via bridge diff --git a/apps/meteor/app/apps/server/bridges/messages.ts b/apps/meteor/app/apps/server/bridges/messages.ts index 18a68220998f..5a60a37e8b0b 100644 --- a/apps/meteor/app/apps/server/bridges/messages.ts +++ b/apps/meteor/app/apps/server/bridges/messages.ts @@ -1,4 +1,5 @@ import type { IAppServerOrchestrator, IAppsMessage, IAppsUser } from '@rocket.chat/apps'; +import type { Reaction } from '@rocket.chat/apps-engine/definition/messages'; import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; import type { ITypingDescriptor } from '@rocket.chat/apps-engine/server/bridges/MessageBridge'; import { MessageBridge } from '@rocket.chat/apps-engine/server/bridges/MessageBridge'; @@ -10,6 +11,7 @@ import { deleteMessage } from '../../../lib/server/functions/deleteMessage'; import { updateMessage } from '../../../lib/server/functions/updateMessage'; import { executeSendMessage } from '../../../lib/server/methods/sendMessage'; import notifications from '../../../notifications/server/lib/Notifications'; +import { executeSetReaction } from '../../../reactions/server/setReaction'; export class AppMessageBridge extends MessageBridge { constructor(private readonly orch: IAppServerOrchestrator) { @@ -118,4 +120,24 @@ export class AppMessageBridge extends MessageBridge { throw new Error('Unrecognized typing scope provided'); } } + + private isValidReaction(reaction: Reaction): boolean { + return reaction.startsWith(':') && reaction.endsWith(':'); + } + + protected async addReaction(messageId: string, userId: string, reaction: Reaction): Promise { + if (!this.isValidReaction(reaction)) { + throw new Error('Invalid reaction'); + } + + return executeSetReaction(messageId, userId, reaction, true); + } + + protected async removeReaction(messageId: string, userId: string, reaction: Reaction): Promise { + if (!this.isValidReaction(reaction)) { + throw new Error('Invalid reaction'); + } + + return executeSetReaction(messageId, userId, reaction, false); + } } diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 76a0c59d54e6..4aaff739e4d0 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -18,7 +18,7 @@ "author": "Rocket.Chat", "license": "MIT", "dependencies": { - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.25", diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 5addaf756f8a..8f2138b47b7d 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -230,7 +230,7 @@ "@rocket.chat/agenda": "workspace:^", "@rocket.chat/api-client": "workspace:^", "@rocket.chat/apps": "workspace:^", - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/base64": "workspace:^", "@rocket.chat/cas-validate": "workspace:^", "@rocket.chat/core-services": "workspace:^", diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index fdee5d5d3b9a..9bf49018ed0a 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -15,7 +15,7 @@ ], "author": "Rocket.Chat", "dependencies": { - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.25", diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index 21f1883b6704..ad160821647c 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@babel/preset-env": "~7.22.20", "@babel/preset-typescript": "~7.22.15", - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@types/node": "^14.18.63", diff --git a/packages/apps/package.json b/packages/apps/package.json index 15289501be4c..0aca06fdf070 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -18,7 +18,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/model-typings": "workspace:^" } diff --git a/packages/core-services/package.json b/packages/core-services/package.json index d576f87bef27..02176d6bf88c 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -34,7 +34,7 @@ "extends": "../../package.json" }, "dependencies": { - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/message-parser": "workspace:^", diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 267e75e5c177..499dab0156b6 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -22,7 +22,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/ui-kit": "workspace:~" diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 6d6b882c89d2..101769768017 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -63,7 +63,7 @@ "@babel/preset-env": "~7.22.20", "@babel/preset-react": "~7.22.15", "@babel/preset-typescript": "~7.22.15", - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/fuselage": "^0.57.0", diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 6a5bf5464e98..896e78900626 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -23,7 +23,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "1.44.0", + "@rocket.chat/apps-engine": "1.45.0-alpha.864", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", diff --git a/yarn.lock b/yarn.lock index 6a6c2a8ee9d0..64d79a0d27e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8483,9 +8483,9 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/apps-engine@npm:1.44.0": - version: 1.44.0 - resolution: "@rocket.chat/apps-engine@npm:1.44.0" +"@rocket.chat/apps-engine@npm:1.45.0-alpha.864": + version: 1.45.0-alpha.864 + resolution: "@rocket.chat/apps-engine@npm:1.45.0-alpha.864" dependencies: "@msgpack/msgpack": 3.0.0-beta2 adm-zip: ^0.5.9 @@ -8501,7 +8501,7 @@ __metadata: uuid: ~8.3.2 peerDependencies: "@rocket.chat/ui-kit": "*" - checksum: f2b1b13c6a070c8d320a6d681ede6945a5882f9e2d42f2569bfc8c098229f761c7ef358589d3f1714d17b157fafa8e4869f28752408356f4a9286f62cb517f46 + checksum: 4f223dd0671d920e4eaafa465fe87584473f3295061252d1020c0d0e1c076c3b74ee98af1ee5aedfeb72b042e38c3f381d10a151b3a2abcf33a7de8ac6146fa1 languageName: node linkType: hard @@ -8509,7 +8509,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/apps@workspace:packages/apps" dependencies: - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/model-typings": "workspace:^" eslint: ~8.45.0 @@ -8582,7 +8582,7 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@babel/preset-typescript": ~7.22.15 - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/icons": ^0.36.0 @@ -8609,7 +8609,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/core-typings@workspace:packages/core-typings" dependencies: - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/icons": ^0.36.0 "@rocket.chat/message-parser": "workspace:^" @@ -8681,7 +8681,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer" dependencies: - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/ddp-client": "workspace:~" @@ -8879,7 +8879,7 @@ __metadata: "@babel/preset-env": ~7.22.20 "@babel/preset-react": ~7.22.15 "@babel/preset-typescript": ~7.22.15 - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/fuselage": ^0.57.0 @@ -9329,7 +9329,7 @@ __metadata: "@rocket.chat/agenda": "workspace:^" "@rocket.chat/api-client": "workspace:^" "@rocket.chat/apps": "workspace:^" - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/base64": "workspace:^" "@rocket.chat/cas-validate": "workspace:^" "@rocket.chat/core-services": "workspace:^" @@ -9953,7 +9953,7 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@babel/preset-typescript": ~7.22.15 - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" @@ -10067,7 +10067,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/rest-typings@workspace:packages/rest-typings" dependencies: - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:~" "@rocket.chat/message-parser": "workspace:^" @@ -36732,7 +36732,7 @@ __metadata: version: 0.0.0-use.local resolution: "rocketchat-services@workspace:apps/meteor/ee/server/services" dependencies: - "@rocket.chat/apps-engine": 1.44.0 + "@rocket.chat/apps-engine": 1.45.0-alpha.864 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ~0.31.25 From 2f402fd33b0814815d8967ba457e5f8b30c5630c Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Wed, 21 Aug 2024 13:49:43 -0300 Subject: [PATCH 2/4] chore: allow using db watchers in localhost (#33120) --- packages/core-services/src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core-services/src/index.ts b/packages/core-services/src/index.ts index 0f93ccbee04c..8eea19ea7405 100644 --- a/packages/core-services/src/index.ts +++ b/packages/core-services/src/index.ts @@ -143,8 +143,11 @@ export { IUserService, }; +const disabledEnvVar = String(process.env.DISABLE_DB_WATCHERS).toLowerCase(); + export const dbWatchersDisabled = - ['yes', 'true'].includes(String(process.env.DISABLE_DB_WATCHERS).toLowerCase()) || process.env.NODE_ENV !== 'production'; + (process.env.NODE_ENV === 'production' && ['yes', 'true'].includes(disabledEnvVar)) || + (process.env.NODE_ENV !== 'production' && !['no', 'false'].includes(disabledEnvVar)); // TODO think in a way to not have to pass the service name to proxify here as well export const Authorization = proxifyWithWait('authorization'); From a7f12cc0ac76c9a59f89a0f17d0dfd143602a7b8 Mon Sep 17 00:00:00 2001 From: Yash Rajpal <58601732+yash-rajpal@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:33:20 +0530 Subject: [PATCH 3/4] fix: Forget session on window close (#33040) --- .changeset/two-bikes-crash.md | 7 +++ apps/meteor/client/startup/accounts.ts | 13 +++++ .../externals/meteor/accounts-base.d.ts | 2 + ...account-forgetSessionOnWindowClose.spec.ts | 55 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 .changeset/two-bikes-crash.md create mode 100644 apps/meteor/tests/e2e/account-forgetSessionOnWindowClose.spec.ts diff --git a/.changeset/two-bikes-crash.md b/.changeset/two-bikes-crash.md new file mode 100644 index 000000000000..a120435e4a48 --- /dev/null +++ b/.changeset/two-bikes-crash.md @@ -0,0 +1,7 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed an issue related to setting Accounts_ForgetUserSessionOnWindowClose, this setting was not working as expected. + +The new meteor 2.16 release introduced a new option to configure the Accounts package and choose between the local storage or session storage. They also changed how Meteor.\_localstorage works internally. Due to these changes in Meteor, our setting to use session storage wasn't working as expected. This PR fixes this issue and configures the Accounts package according to the workspace settings. diff --git a/apps/meteor/client/startup/accounts.ts b/apps/meteor/client/startup/accounts.ts index 3be110bc0a09..60f2de02bde0 100644 --- a/apps/meteor/client/startup/accounts.ts +++ b/apps/meteor/client/startup/accounts.ts @@ -2,6 +2,7 @@ import { Accounts } from 'meteor/accounts-base'; import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; +import { settings } from '../../app/settings/client'; import { mainReady } from '../../app/ui-utils/client'; import { sdk } from '../../app/utils/client/lib/SDKClient'; import { t } from '../../app/utils/lib/i18n'; @@ -24,3 +25,15 @@ Accounts.onEmailVerificationLink((token: string) => { }); }); }); + +Meteor.startup(() => { + Tracker.autorun(() => { + const forgetUserSessionOnWindowClose = settings.get('Accounts_ForgetUserSessionOnWindowClose'); + + if (forgetUserSessionOnWindowClose === undefined) { + return; + } + + Accounts.config({ clientStorage: forgetUserSessionOnWindowClose ? 'session' : 'local' }); + }); +}); diff --git a/apps/meteor/definition/externals/meteor/accounts-base.d.ts b/apps/meteor/definition/externals/meteor/accounts-base.d.ts index 3f0b148120e7..31b70f7b7154 100644 --- a/apps/meteor/definition/externals/meteor/accounts-base.d.ts +++ b/apps/meteor/definition/externals/meteor/accounts-base.d.ts @@ -42,6 +42,8 @@ declare module 'meteor/accounts-base' { function _clearAllLoginTokens(userId: string | null): void; + function config(options: { clientStorage: 'session' | 'local' }): void; + class ConfigError extends Error {} class LoginCancelledError extends Error { diff --git a/apps/meteor/tests/e2e/account-forgetSessionOnWindowClose.spec.ts b/apps/meteor/tests/e2e/account-forgetSessionOnWindowClose.spec.ts new file mode 100644 index 000000000000..a19b0e9866da --- /dev/null +++ b/apps/meteor/tests/e2e/account-forgetSessionOnWindowClose.spec.ts @@ -0,0 +1,55 @@ +import { DEFAULT_USER_CREDENTIALS } from './config/constants'; +import { Registration } from './page-objects'; +import { test, expect } from './utils/test'; + +test.describe.serial('Forget session on window close setting', () => { + let poRegistration: Registration; + + test.beforeEach(async ({ page }) => { + poRegistration = new Registration(page); + + await page.goto('/home'); + }); + + test.describe('Setting off', async () => { + test.beforeAll(async ({ api }) => { + await api.post('/settings/Accounts_ForgetUserSessionOnWindowClose', { value: false }); + }); + + test('Login using credentials and reload to stay logged in', async ({ page, context }) => { + await poRegistration.username.type('user1'); + await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); + await poRegistration.btnLogin.click(); + + await expect(page.locator('role=heading[name="Welcome to Rocket.Chat"]')).toBeVisible(); + + const newPage = await context.newPage(); + await newPage.goto('/home'); + + await expect(newPage.locator('role=heading[name="Welcome to Rocket.Chat"]')).toBeVisible(); + }); + }); + + test.describe('Setting on', async () => { + test.beforeAll(async ({ api }) => { + await api.post('/settings/Accounts_ForgetUserSessionOnWindowClose', { value: true }); + }); + + test.afterAll(async ({ api }) => { + await api.post('/settings/Accounts_ForgetUserSessionOnWindowClose', { value: false }); + }); + + test('Login using credentials and reload to get logged out', async ({ page, context }) => { + await poRegistration.username.type('user1'); + await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); + await poRegistration.btnLogin.click(); + + await expect(page.locator('role=heading[name="Welcome to Rocket.Chat"]')).toBeVisible(); + + const newPage = await context.newPage(); + await newPage.goto('/home'); + + await expect(newPage.locator('role=button[name="Login"]')).toBeVisible(); + }); + }); +}); From 94518af19429c00808662e5bfe486599ad7bea25 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Wed, 21 Aug 2024 12:35:26 -0600 Subject: [PATCH 4/4] chore: Remove `googleapis` package from codebase (#33121) --- apps/meteor/package.json | 1 - yarn.lock | 49 ++-------------------------------------- 2 files changed, 2 insertions(+), 48 deletions(-) diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 8f2138b47b7d..b8c35ceab8a7 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -343,7 +343,6 @@ "filesize": "9.0.11", "generate-password": "^1.7.1", "google-libphonenumber": "^3.2.33", - "googleapis": "^104.0.0", "gravatar": "^1.8.2", "he": "^1.2.0", "highlight.js": "^11.6.0", diff --git a/yarn.lock b/yarn.lock index 64d79a0d27e6..1698092642f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9551,7 +9551,6 @@ __metadata: filesize: 9.0.11 generate-password: ^1.7.1 google-libphonenumber: ^3.2.33 - googleapis: ^104.0.0 gravatar: ^1.8.2 he: ^1.2.0 highlight.js: ^11.6.0 @@ -24339,19 +24338,6 @@ __metadata: languageName: node linkType: hard -"gaxios@npm:^4.0.0": - version: 4.3.3 - resolution: "gaxios@npm:4.3.3" - dependencies: - abort-controller: ^3.0.0 - extend: ^3.0.2 - https-proxy-agent: ^5.0.0 - is-stream: ^2.0.0 - node-fetch: ^2.6.7 - checksum: 0b72a00875404e2c3d7aca9f32535e931d7b0ebb850dc92fafc1685b99a109b04205c63e4637a2d0d9a261ac50adf83f7d33435f73e256dcca32564ef9358fee - languageName: node - linkType: hard - "gaxios@npm:^5.0.0, gaxios@npm:^5.0.1": version: 5.1.0 resolution: "gaxios@npm:5.1.0" @@ -24901,7 +24887,7 @@ __metadata: languageName: node linkType: hard -"google-auth-library@npm:^8.0.1, google-auth-library@npm:^8.0.2": +"google-auth-library@npm:^8.0.1": version: 8.7.0 resolution: "google-auth-library@npm:8.7.0" dependencies: @@ -24936,30 +24922,6 @@ __metadata: languageName: node linkType: hard -"googleapis-common@npm:^6.0.0": - version: 6.0.0 - resolution: "googleapis-common@npm:6.0.0" - dependencies: - extend: ^3.0.2 - gaxios: ^4.0.0 - google-auth-library: ^8.0.2 - qs: ^6.7.0 - url-template: ^2.0.8 - uuid: ^8.0.0 - checksum: a6c697ac0c829f7bdfcfe32f5fb16fbf7b864cc173257c09eff6e4893f3bd56064904f7b6843d4c8ff074b128609c6cc2ac7490aaf9ed70cab417dc2fb54236b - languageName: node - linkType: hard - -"googleapis@npm:^104.0.0": - version: 104.0.0 - resolution: "googleapis@npm:104.0.0" - dependencies: - google-auth-library: ^8.0.2 - googleapis-common: ^6.0.0 - checksum: b6aabd6913daf4ebbdc5500907991560680e4bedda6852a03767c890467719369e7b7c8e9152bf77908345c7626f2465d329a916270c7bf277a4af0d26262ae1 - languageName: node - linkType: hard - "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -34843,7 +34805,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0, qs@npm:^6.10.0, qs@npm:^6.10.3, qs@npm:^6.7.0, qs@npm:^6.9.4, qs@npm:^6.9.6": +"qs@npm:6.11.0, qs@npm:^6.10.0, qs@npm:^6.10.3, qs@npm:^6.9.4, qs@npm:^6.9.6": version: 6.11.0 resolution: "qs@npm:6.11.0" dependencies: @@ -41187,13 +41149,6 @@ __metadata: languageName: node linkType: hard -"url-template@npm:^2.0.8": - version: 2.0.8 - resolution: "url-template@npm:2.0.8" - checksum: 4183fccd74e3591e4154134d4443dccecba9c455c15c7df774f1f1e3fa340fd9bffb903b5beec347196d15ce49c34edf6dec0634a95d170ad6e78c0467d6e13e - languageName: node - linkType: hard - "url-to-options@npm:^1.0.1": version: 1.0.1 resolution: "url-to-options@npm:1.0.1"