refactor: Bump TypeScript version (#28697)

pull/28714/head
Tasso Evangelista 2 years ago committed by GitHub
parent 9101a42a10
commit b543e90e91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      apps/meteor/app/api/server/api.ts
  2. 16
      apps/meteor/app/api/server/definition.ts
  3. 8
      apps/meteor/app/api/server/v1/teams.ts
  4. 13
      apps/meteor/app/api/server/v1/voip/omnichannel.ts
  5. 4
      apps/meteor/app/authentication/server/lib/restrictLoginAttempts.ts
  6. 4
      apps/meteor/app/authorization/server/functions/getUsersInRole.ts
  7. 10
      apps/meteor/app/e2e/client/rocketchat.e2e.ts
  8. 2
      apps/meteor/app/federation/server/functions/helpers.ts
  9. 0
      apps/meteor/app/importer/lib/ImporterProgressStep.ts
  10. 2
      apps/meteor/app/invites/server/functions/sendInvitationEmail.ts
  11. 2
      apps/meteor/app/lib/server/functions/createDirectRoom.ts
  12. 2
      apps/meteor/app/lib/server/methods/sendMessage.ts
  13. 2
      apps/meteor/app/lib/server/methods/sendSMTPTestEmail.ts
  14. 4
      apps/meteor/app/livechat/server/api/lib/departments.ts
  15. 20
      apps/meteor/app/livechat/server/api/v1/customField.ts
  16. 2
      apps/meteor/app/livechat/server/api/v1/message.ts
  17. 2
      apps/meteor/app/markdown/lib/parser/original/token.ts
  18. 2
      apps/meteor/app/message-pin/server/pinMessage.ts
  19. 3
      apps/meteor/app/models/client/models/Base.ts
  20. 9
      apps/meteor/app/settings/server/functions/getSettingDefaults.ts
  21. 2
      apps/meteor/app/slashcommands-invite/server/server.ts
  22. 2
      apps/meteor/app/slashcommands-leave/server/leave.ts
  23. 2
      apps/meteor/app/threads/client/flextab/threadlist.tsx
  24. 2
      apps/meteor/app/ui-utils/client/lib/messageActionDefault.ts
  25. 2
      apps/meteor/app/version-check/server/functions/getNewUpdates.ts
  26. 2
      apps/meteor/client/components/RoomIcon/RoomIcon.tsx
  27. 2
      apps/meteor/client/components/message/content/attachments/FileAttachment.tsx
  28. 3
      apps/meteor/client/definitions/MinimongoCollection.ts
  29. 6
      apps/meteor/client/lib/portals/createTemplateForComponent.ts
  30. 2
      apps/meteor/client/sidebar/Sidebar.stories.tsx
  31. 2
      apps/meteor/client/views/admin/import/ImportProgressPage.tsx
  32. 4
      apps/meteor/client/views/admin/settings/inputs/AssetSettingInput.tsx
  33. 4
      apps/meteor/client/views/room/contextualBar/RoomMembers/InviteUsers/InviteUsers.tsx
  34. 4
      apps/meteor/ee/app/livechat-enterprise/server/api/lib/inquiries.ts
  35. 2
      apps/meteor/ee/app/livechat-enterprise/server/hooks/afterOnHold.ts
  36. 2
      apps/meteor/ee/server/lib/deviceManagement/session.ts
  37. 4
      apps/meteor/ee/server/services/mongo.ts
  38. 2
      apps/meteor/ee/server/services/package.json
  39. 12
      apps/meteor/lib/transforms.ts
  40. 2
      apps/meteor/package.json
  41. 4
      apps/meteor/server/models/raw/BannersDismiss.ts
  42. 23
      apps/meteor/server/models/raw/BaseRaw.ts
  43. 6
      apps/meteor/server/models/raw/LivechatBusinessHours.ts
  44. 10
      apps/meteor/server/models/raw/LivechatDepartmentAgents.ts
  45. 2
      apps/meteor/server/models/raw/LivechatInquiry.ts
  46. 2
      apps/meteor/server/models/raw/LivechatVisitors.ts
  47. 9
      apps/meteor/server/models/raw/Roles.ts
  48. 4
      apps/meteor/server/models/raw/Subscriptions.ts
  49. 42
      apps/meteor/server/models/raw/Team.ts
  50. 21
      apps/meteor/server/models/raw/TeamMember.ts
  51. 3
      apps/meteor/server/services/settings/service.ts
  52. 14
      apps/meteor/server/services/team/service.ts
  53. 2
      ee/apps/account-service/package.json
  54. 3
      ee/apps/account-service/tsconfig.json
  55. 2
      ee/apps/authorization-service/package.json
  56. 2
      ee/apps/ddp-streamer/package.json
  57. 2
      ee/apps/omnichannel-transcript/package.json
  58. 2
      ee/apps/presence-service/package.json
  59. 2
      ee/apps/queue-worker/package.json
  60. 2
      ee/apps/stream-hub-service/package.json
  61. 2
      ee/packages/omnichannel-services/package.json
  62. 2
      ee/packages/pdf-worker/package.json
  63. 2
      ee/packages/presence/package.json
  64. 2
      ee/packages/ui-theming/package.json
  65. 2
      packages/account-utils/package.json
  66. 2
      packages/agenda/package.json
  67. 2
      packages/api-client/package.json
  68. 2
      packages/base64/package.json
  69. 2
      packages/cas-validate/package.json
  70. 2
      packages/core-services/package.json
  71. 4
      packages/core-services/src/types/ISettingsService.ts
  72. 4
      packages/core-services/src/types/ITeamService.ts
  73. 2
      packages/core-typings/package.json
  74. 2
      packages/core-typings/src/IMessage/MessageAttachment/Files/FileAttachmentProps.ts
  75. 3
      packages/core-typings/src/IMessage/MessageAttachment/MessageQuoteAttachment.ts
  76. 4
      packages/core-typings/src/ITeam.ts
  77. 2
      packages/favicon/package.json
  78. 2
      packages/fuselage-ui-kit/package.json
  79. 1
      packages/fuselage-ui-kit/tsconfig.json
  80. 3
      packages/gazzodown/babel.config.js
  81. 10
      packages/gazzodown/jest.config.ts
  82. 2
      packages/gazzodown/package.json
  83. 2
      packages/gazzodown/src/Markup.spec.tsx
  84. 2
      packages/gazzodown/src/mentions/UserMentionElement.tsx
  85. 2
      packages/instance-status/package.json
  86. 2
      packages/livechat/package.json
  87. 2
      packages/model-typings/package.json
  88. 6
      packages/model-typings/src/models/IBannersDismissModel.ts
  89. 19
      packages/model-typings/src/models/IBaseModel.ts
  90. 6
      packages/model-typings/src/models/ILivechatBusinessHoursModel.ts
  91. 4
      packages/model-typings/src/models/ILivechatCustomFieldModel.ts
  92. 10
      packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts
  93. 2
      packages/model-typings/src/models/ILivechatInquiryModel.ts
  94. 2
      packages/model-typings/src/models/ILivechatVisitorsModel.ts
  95. 7
      packages/model-typings/src/models/IRolesModel.ts
  96. 4
      packages/model-typings/src/models/ISubscriptionsModel.ts
  97. 22
      packages/model-typings/src/models/ITeamMemberModel.ts
  98. 42
      packages/model-typings/src/models/ITeamModel.ts
  99. 2
      packages/models/package.json
  100. 2
      packages/node-poplib/package.json
  101. Some files were not shown because too many files have changed in this diff Show More

@ -106,7 +106,7 @@ const getRequestIP = (req: Request): string | null => {
let prometheusAPIUserAgent = false;
export class APIClass<TBasePath extends string = '/'> extends Restivus {
export class APIClass<TBasePath extends string = ''> extends Restivus {
protected apiPath: string;
public authMethods: ((...args: any[]) => any)[];
@ -195,6 +195,10 @@ export class APIClass<TBasePath extends string = '/'> extends Restivus {
);
}
public success(): SuccessResult<void>;
public success<T>(result: T): SuccessResult<T>;
public success<T>(result: T = {} as T): SuccessResult<T> {
if (isObject(result)) {
(result as Record<string, any>).success = true;

@ -139,19 +139,15 @@ export type ActionThis<TMethod extends Method, TPathPattern extends PathPattern,
? T
: Partial<OperationParams<TMethod, TPathPattern>>
: // TODO remove the extra (optionals) params when all the endpoints that use these are typed correctly
Partial<OperationParams<TMethod, TPathPattern>> & {
userId?: string;
username?: string;
user?: string;
};
Partial<OperationParams<TMethod, TPathPattern>>;
readonly request: Request;
readonly queryOperations: TOptions extends { queryOperations: infer T } ? T : never;
parseJsonQuery(): {
parseJsonQuery(): Promise<{
sort: Record<string, 1 | -1>;
fields: Record<string, 0 | 1>;
query: Record<string, unknown>;
};
}>;
} & (TOptions extends { authRequired: true }
? {
user: IUser;
@ -174,7 +170,11 @@ export type ResultFor<TMethod extends Method, TPathPattern extends PathPattern>
| SuccessResult<OperationResult<TMethod, TPathPattern>>
| FailureResult<unknown, unknown, unknown, unknown>
| UnauthorizedResult<unknown>
| NotFoundResult;
| NotFoundResult
| {
statusCode: number;
body: unknown;
};
export type Action<TMethod extends Method, TPathPattern extends PathPattern, TOptions> =
| ((this: ActionThis<TMethod, TPathPattern, TOptions>) => Promise<ResultFor<TMethod, TPathPattern>>)

@ -11,7 +11,7 @@ import {
isTeamsLeaveProps,
isTeamsUpdateProps,
} from '@rocket.chat/rest-typings';
import type { ITeam } from '@rocket.chat/core-typings';
import type { ITeam, UserStatus } from '@rocket.chat/core-typings';
import { TEAM_TYPE } from '@rocket.chat/core-typings';
import { Team } from '@rocket.chat/core-services';
@ -161,11 +161,11 @@ API.v1.addRoute(
Match.OneOf(
Match.ObjectIncluding({
teamId: String,
rooms: [String],
rooms: [String] as [StringConstructor],
}),
Match.ObjectIncluding({
teamName: String,
rooms: [String],
rooms: [String] as [StringConstructor],
}),
),
);
@ -410,7 +410,7 @@ API.v1.addRoute(
const query = {
username: username ? new RegExp(escapeRegExp(username), 'i') : undefined,
name: name ? new RegExp(escapeRegExp(name), 'i') : undefined,
status: status ? { $in: status } : undefined,
status: status ? { $in: status as UserStatus[] } : undefined,
};
const { records, total } = await Team.members(this.userId, team._id, canSeeAllMembers, { offset, count }, query);

@ -176,8 +176,8 @@ API.v1.addRoute(
}),
),
);
const { type } = this.queryParams;
switch ((type as string).toLowerCase()) {
switch (this.queryParams.type.toLowerCase()) {
case 'free': {
const extensions = await LivechatVoip.getFreeExtensions();
if (!extensions) {
@ -209,7 +209,7 @@ API.v1.addRoute(
return API.v1.success({ extensions });
}
default:
return API.v1.notFound(`${type} not found `);
return API.v1.notFound(`${this.queryParams.type} not found `);
}
},
},
@ -229,7 +229,12 @@ API.v1.addRoute(
check(extension, Match.Maybe(String));
const extensions = await LivechatVoip.getExtensionListWithAgentData();
const filteredExts = filter(extensions, { status, agentId, queues, extension });
const filteredExts = filter(extensions, {
status: status ?? undefined,
agentId: agentId ?? undefined,
queues: queues ?? undefined,
extension: extension ?? undefined,
});
// paginating in memory as Asterisk doesn't provide pagination for commands
return API.v1.success({

@ -66,7 +66,7 @@ export const isValidLoginAttemptByIp = async (ip: string): Promise<boolean> => {
failedAttemptsSinceLastLogin = await ServerEvents.countFailedAttemptsByIpSince(ip, new Date(lastLogin.loginAt));
}
const attemptsUntilBlock = settings.get('Block_Multiple_Failed_Logins_Attempts_Until_Block_By_Ip');
const attemptsUntilBlock = settings.get<number>('Block_Multiple_Failed_Logins_Attempts_Until_Block_By_Ip');
if (attemptsUntilBlock && failedAttemptsSinceLastLogin < attemptsUntilBlock) {
return true;
@ -109,7 +109,7 @@ export const isValidAttemptByUser = async (login: ILoginAttempt): Promise<boolea
failedAttemptsSinceLastLogin = await ServerEvents.countFailedAttemptsByUsernameSince(user.username, new Date(user.lastLogin));
}
const attemptsUntilBlock = settings.get('Block_Multiple_Failed_Logins_Attempts_Until_Block_by_User');
const attemptsUntilBlock = settings.get<number>('Block_Multiple_Failed_Logins_Attempts_Until_Block_by_User');
if (attemptsUntilBlock && failedAttemptsSinceLastLogin < attemptsUntilBlock) {
return true;

@ -1,4 +1,4 @@
import type { FindCursor, FindOptions } from 'mongodb';
import type { Document, FindCursor, FindOptions } from 'mongodb';
import type { IRole, IUser } from '@rocket.chat/core-typings';
import { Roles, Subscriptions, Users } from '@rocket.chat/models';
import type { FindPaginated } from '@rocket.chat/model-typings';
@ -8,7 +8,7 @@ export function getUsersInRole(roleId: IRole['_id'], scope?: string): Promise<Fi
export function getUsersInRole(roleId: IRole['_id'], scope: string | undefined, options: FindOptions<IUser>): Promise<FindCursor<IUser>>;
export function getUsersInRole<P = IUser>(
export function getUsersInRole<P extends Document = IUser>(
roleId: IRole['_id'],
scope: string | undefined,
options: FindOptions<P extends IUser ? IUser : P>,

@ -22,7 +22,7 @@ import {
decryptAES,
generateRSAKey,
exportJWKKey,
importRSAKey,
// importRSAKey,
importRawKey,
deriveKey,
generateMnemonicPhrase,
@ -62,7 +62,7 @@ class E2E extends Emitter {
private db_private_key: string | null;
private privateKey: CryptoKey | undefined;
// private privateKey: CryptoKey | undefined;
constructor() {
super();
@ -246,7 +246,7 @@ class E2E extends Emitter {
Meteor._localStorage.removeItem('public_key');
Meteor._localStorage.removeItem('private_key');
this.instancesByRoomId = {};
this.privateKey = undefined;
// this.privateKey = undefined;
this.enabled.set(false);
this._ready.set(false);
this.started = false;
@ -275,7 +275,7 @@ class E2E extends Emitter {
Meteor._localStorage.setItem('public_key', public_key);
try {
this.privateKey = await importRSAKey(EJSON.parse(private_key), ['decrypt']);
// this.privateKey = await importRSAKey(EJSON.parse(private_key), ['decrypt']);
Meteor._localStorage.setItem('private_key', private_key);
} catch (error) {
@ -288,7 +288,7 @@ class E2E extends Emitter {
let key;
try {
key = await generateRSAKey();
this.privateKey = key.privateKey;
// this.privateKey = key.privateKey;
} catch (error) {
return this.error('Error generating key: ', error);
}

@ -23,7 +23,7 @@ export async function updateEnabled(enabled: boolean): Promise<void> {
}
export const checkRoomType = (room: IRoom): boolean => room.t === 'p' || room.t === 'd';
export const checkRoomDomainsLength = (domains: unknown[]): boolean => domains.length <= (process.env.FEDERATED_DOMAINS_LENGTH || 10);
export const checkRoomDomainsLength = (domains: unknown[]): boolean => domains.length <= Number(process.env.FEDERATED_DOMAINS_LENGTH ?? 10);
export const hasExternalDomain = ({ federation }: { federation: { origin: string; domains: string[] } }): boolean => {
// same test as isFederated(room)

@ -55,7 +55,7 @@ export const sendInvitationEmail = async (userId: string, emails: string[]) => {
await Settings.incrementValueById('Invitation_Email_Count');
continue;
} catch ({ message }) {
} catch ({ message }: any) {
throw new Meteor.Error('error-email-send-failed', `Error trying to send email: ${message}`, {
method: 'sendInvitationEmail',
message,

@ -47,7 +47,7 @@ export async function createDirectRoom(
subscriptionExtra?: ISubscriptionExtraData;
},
): Promise<ICreatedRoom> {
if (members.length > (settings.get('DirectMesssage_maxUsers') || 1)) {
if (members.length > (settings.get<number>('DirectMesssage_maxUsers') || 1)) {
throw new Error('error-direct-message-max-user-exceeded');
}
callbacks.run('beforeCreateDirectRoom', members);

@ -44,7 +44,7 @@ export async function executeSendMessage(uid: IUser['_id'], message: AtLeast<IMe
}
if (message.msg) {
if (message.msg.length > (settings.get('Message_MaxAllowedSize') ?? 0)) {
if (message.msg.length > (settings.get<number>('Message_MaxAllowedSize') ?? 0)) {
throw new Meteor.Error('error-message-size-exceeded', 'Message size exceeds Message_MaxAllowedSize', {
method: 'sendMessage',
});

@ -35,7 +35,7 @@ Meteor.methods<ServerMethods>({
subject: 'SMTP Test Email',
html: '<p>You have successfully sent an email</p>',
});
} catch ({ message }) {
} catch ({ message }: any) {
throw new Meteor.Error('error-email-send-failed', `Error trying to send email: ${message}`, {
method: 'sendSMTPTestEmail',
message,

@ -1,4 +1,4 @@
import type { Filter, FindOptions } from 'mongodb';
import type { Document, Filter, FindOptions } from 'mongodb';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import type { PaginatedResult } from '@rocket.chat/rest-typings';
import type { ILivechatDepartment, ILivechatDepartmentAgents } from '@rocket.chat/core-typings';
@ -7,7 +7,7 @@ import { LivechatDepartment, LivechatDepartmentAgents } from '@rocket.chat/model
import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission';
import { callbacks } from '../../../../../lib/callbacks';
type Pagination<T> = { pagination: { offset: number; count: number; sort: FindOptions<T>['sort'] } };
type Pagination<T extends Document> = { pagination: { offset: number; count: number; sort: FindOptions<T>['sort'] } };
type FindDepartmentParams = {
userId: string;
onlyMyDepartments?: boolean;

@ -39,14 +39,20 @@ API.v1.addRoute(
}
const fields = await Promise.all(
this.bodyParams.customFields.map(async (customField) => {
const data = Object.assign({ token }, customField);
if (!(await Livechat.setCustomFields(data))) {
throw new Error('error-setting-custom-field');
}
this.bodyParams.customFields.map(
async (customField: {
key: string;
value: string;
overwrite: boolean;
}): Promise<{ Key: string; value: string; overwrite: boolean }> => {
const data = Object.assign({ token }, customField);
if (!(await Livechat.setCustomFields(data))) {
throw new Error('error-setting-custom-field');
}
return { Key: customField.key, value: customField.value, overwrite: customField.overwrite };
}),
return { Key: customField.key, value: customField.value, overwrite: customField.overwrite };
},
),
);
return API.v1.success({ fields });

@ -257,7 +257,7 @@ API.v1.addRoute(
}
const sentMessages = await Promise.all(
this.bodyParams.messages.map(async (message) => {
this.bodyParams.messages.map(async (message: { msg: string }): Promise<{ username: string; msg: string; ts: number }> => {
const sendMessage = {
guest: visitor,
message: {

@ -23,7 +23,7 @@ export const addAsToken = (message: IMessage, html: string, type: TokenType, ext
export const isToken = (msg: string): boolean => /=!=[.a-z0-9]{17}=!=/gim.test(msg.trim());
export const validateAllowedTokens = (message: IMessage, id: string, desiredTokens: TokenType[]): boolean => {
const tokens = id.match(/=!=[.a-z0-9]{17}=!=/gim) || [];
const tokens: string[] = id.match(/=!=[.a-z0-9]{17}=!=/gim) || [];
const tokensFound = message.tokens?.filter(({ token }) => tokens.includes(token)) || [];
return tokensFound.length === 0 || tokensFound.every((token) => token.type && desiredTokens.includes(token.type));
};

@ -20,7 +20,7 @@ const recursiveRemove = (msg: MessageAttachment, deep = 1) => {
return;
}
if (deep > (settings.get('Message_QuoteChainLimit') ?? 0)) {
if (deep > (settings.get<number>('Message_QuoteChainLimit') ?? 0)) {
delete msg.attachments;
return msg;
}

@ -1,7 +1,8 @@
import { check } from 'meteor/check';
import { Mongo } from 'meteor/mongo';
import type { Document } from 'mongodb';
export abstract class Base<T = any> {
export abstract class Base<T extends Document = any> {
private model: Mongo.Collection<T>;
protected _baseName() {

@ -7,9 +7,9 @@ export const getSettingDefaults = (
hiddenSettings: Set<string> = new Set(),
wizardRequiredSettings: Set<string> = new Set(),
): ISetting => {
const { _id, value, sorter, ...props } = setting;
const { _id, value, sorter, ...data } = setting;
const options = Object.fromEntries(Object.entries(props).filter(([, value]) => value !== undefined));
const options = Object.fromEntries(Object.entries(data).filter(([, value]) => value !== undefined)) as Partial<typeof data>;
return {
_id,
@ -23,8 +23,9 @@ export const getSettingDefaults = (
sorter: sorter || 0,
ts: new Date(),
createdAt: new Date(),
_updatedAt: options._updatedAt ?? new Date(),
...options,
...(options.enableQuery && { enableQuery: JSON.stringify(options.enableQuery) }),
...(options.enableQuery ? { enableQuery: JSON.stringify(options.enableQuery) } : undefined),
i18nLabel: options.i18nLabel || _id,
hidden: options.hidden || hiddenSettings.has(_id),
blocked: options.blocked || blockedSettings.has(_id),
@ -32,7 +33,7 @@ export const getSettingDefaults = (
type: options.type || 'string',
env: options.env || false,
public: options.public || false,
...(options.displayQuery && { displayQuery: JSON.stringify(options.displayQuery) }),
...(options.displayQuery ? { displayQuery: JSON.stringify(options.displayQuery) } : undefined),
...(isSettingColor(setting as ISetting) && {
packageEditor: (setting as ISettingColor).editor,
}),

@ -65,7 +65,7 @@ slashCommands.add({
rid: item.rid,
username: user.username,
});
} catch ({ error }) {
} catch ({ error }: any) {
if (typeof error !== 'string') {
return;
}

@ -14,7 +14,7 @@ import { Users } from '../../models/server';
const Leave: SlashCommand<'leave'>['callback'] = async function Leave(_command, _params, item): Promise<void> {
try {
await Meteor.callAsync('leaveRoom', item.rid);
} catch ({ error }) {
} catch ({ error }: any) {
const userId = Meteor.userId() as string;
if (typeof error !== 'string') {
return;

@ -46,7 +46,7 @@ addAction('thread', (options) => {
const variant = getVariant(tunreadUser, tunreadGroup);
return (
<Header.ToolBox.Action {...props}>
{unread > 0 && <Header.ToolBox.ActionBadge variant={variant}>{unread}</Header.ToolBox.ActionBadge>}
{!!unread && <Header.ToolBox.ActionBadge variant={variant}>{unread}</Header.ToolBox.ActionBadge>}
</Header.ToolBox.Action>
);
},

@ -176,7 +176,7 @@ Meteor.startup(async function () {
if (!(canEditMessage || (isEditAllowed && editOwn))) {
return false;
}
const blockEditInMinutes = settings.Message_AllowEditing_BlockEditInMinutes;
const blockEditInMinutes = settings.Message_AllowEditing_BlockEditInMinutes as number;
const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete');
if (!bypassBlockTimeLimit && blockEditInMinutes) {

@ -57,7 +57,7 @@ export const getNewUpdates = async () => {
title: String,
text: String,
textArguments: [Match.Any],
modifiers: [String],
modifiers: [String] as [StringConstructor],
infoUrl: String,
}),
]),

@ -28,7 +28,7 @@ export const RoomIcon = ({
return <OmnichannelRoomIcon placement={placement} room={room as IOmnichannelRoom} size={size} />;
}
if (isValidElement(iconPropsOrReactNode)) {
if (isValidElement<any>(iconPropsOrReactNode)) {
return iconPropsOrReactNode;
}

@ -19,5 +19,5 @@ export const FileAttachment: FC<FileAttachmentProps> = (attachment) => {
return <VideoAttachment {...attachment} />;
}
return <GenericFileAttachment {...attachment} />;
return <GenericFileAttachment {...(attachment as any)} />; // TODO: fix this
};

@ -1,6 +1,7 @@
import type { Mongo } from 'meteor/mongo';
import type { Document } from 'mongodb';
export type MinimongoCollection<T> = Mongo.Collection<T> & {
export type MinimongoCollection<T extends Document> = Mongo.Collection<T> & {
_collection: Mongo.Collection<T> & {
queries: Record<string, unknown>;
_docs: {

@ -2,14 +2,14 @@ import { Blaze } from 'meteor/blaze';
import { HTML } from 'meteor/htmljs';
import { ReactiveVar } from 'meteor/reactive-var';
import { Template } from 'meteor/templating';
import type { ComponentType, PropsWithoutRef } from 'react';
import type { ComponentType, PropsWithoutRef, Attributes, ReactNode, PropsWithRef } from 'react';
import { Suspense, createElement, lazy } from 'react';
import { createPortal } from 'react-dom';
import { useReactiveValue } from '../../hooks/useReactiveValue';
import { getClosestBlazePortals } from './blazePortals';
export const createTemplateForComponent = <Props>(
export const createTemplateForComponent = <Props extends object>(
name: string,
factory: () => Promise<{ default: ComponentType<Props> }>,
options:
@ -34,7 +34,7 @@ export const createTemplateForComponent = <Props>(
const template = new Blaze.Template(name, renderFunction);
template.onRendered(function (this: Blaze.TemplateInstance) {
const reactiveProps = new ReactiveVar(this.data as PropsWithoutRef<Props>);
const reactiveProps = new ReactiveVar(this.data as PropsWithRef<Props & { children?: ReactNode }> & Attributes);
this.autorun(() => {
reactiveProps.set({
...('props' in options && typeof options.props === 'function' && options.props()),

@ -71,7 +71,7 @@ const subscriptions: SubscriptionWithRoom[] = [
lowerCaseFName: 'general',
estimatedWaitingTimeQueue: 0,
livechatData: undefined,
priorityWeight: 0,
priorityWeight: 3,
responseBy: undefined,
usersCount: 0,
waitingResponse: undefined,

@ -52,7 +52,7 @@ const ImportProgressPage = function ImportProgressPage() {
return;
}
if (!ImportingStartedStates.includes(status)) {
if (!(ImportingStartedStates as string[]).includes(status)) {
prepareImportRoute.push();
}
},

@ -1,7 +1,7 @@
import { Button, Field, Icon } from '@rocket.chat/fuselage';
import { Random } from '@rocket.chat/random';
import { useToastMessageDispatch, useEndpoint, useTranslation, useUpload } from '@rocket.chat/ui-contexts';
import type { ChangeEventHandler, DragEvent, ReactElement } from 'react';
import type { ChangeEventHandler, DragEvent, ReactElement, SyntheticEvent } from 'react';
import React from 'react';
import './AssetSettingInput.styles.css';
@ -21,7 +21,7 @@ function AssetSettingInput({ _id, label, value, asset, fileConstraints }: AssetS
const setAsset = useUpload('/v1/assets.setAsset');
const unsetAsset = useEndpoint('POST', '/v1/assets.unsetAsset');
const isDataTransferEvent = <T,>(event: T): event is T & DragEvent<HTMLInputElement> =>
const isDataTransferEvent = <T extends SyntheticEvent>(event: T): event is T & DragEvent<HTMLInputElement> =>
Boolean('dataTransfer' in event && (event as any).dataTransfer.files);
const handleUpload: ChangeEventHandler<HTMLInputElement> = (event): void => {

@ -8,8 +8,8 @@ import EditInviteLink from './EditInviteLink';
import InviteLink from './InviteLink';
type InviteUsersProps = {
onClickBackMembers: () => void;
onClickBackLink: () => void;
onClickBackMembers?: () => void;
onClickBackLink?: () => void;
onClickNewLink: (daysAndMaxUses: { days: string; maxUses: string }) => void;
onClose: () => void;
isEditing: boolean;

@ -2,7 +2,7 @@ import { LivechatInquiry, Users, OmnichannelServiceLevelAgreements } from '@rock
import { updateRoomSLA } from './sla';
export async function setSLAToInquiry({ userId, roomId, sla }: { userId: string; roomId: string; sla: string }): Promise<void> {
export async function setSLAToInquiry({ userId, roomId, sla }: { userId: string; roomId: string; sla?: string }): Promise<void> {
const inquiry = await LivechatInquiry.findOneByRoomId(roomId, { projection: { status: 1 } });
if (!inquiry || inquiry.status !== 'queued') {
throw new Error('error-invalid-inquiry');
@ -14,7 +14,7 @@ export async function setSLAToInquiry({ userId, roomId, sla }: { userId: string;
}
const user = await Users.findOneById(userId, { projection: { _id: 1, username: 1, name: 1 } });
if (!user || !user.username) {
if (!user?.username) {
throw new Error('error-invalid-user');
}

@ -28,7 +28,7 @@ const handleAfterOnHold = async (room: any = {}): Promise<any> => {
await AutoCloseOnHoldScheduler.scheduleRoom(room._id, autoCloseOnHoldChatTimeout, closeComment);
};
settings.watch('Livechat_auto_close_on_hold_chats_timeout', (value) => {
settings.watch<number>('Livechat_auto_close_on_hold_chats_timeout', (value) => {
autoCloseOnHoldChatTimeout = value as number;
if (!value || value <= 0) {
callbacks.remove('livechat:afterOnHold', 'livechat-auto-close-on-hold');

@ -98,7 +98,7 @@ export const listenSessionLogin = async (): Promise<void> => {
data: mailData,
});
}
} catch ({ message }) {
} catch ({ message }: any) {
throw new Meteor.Error('error-email-send-failed', `Error trying to send email: ${message}`, {
method: 'listenSessionLogin',
message,

@ -1,5 +1,5 @@
import { MongoClient } from 'mongodb';
import type { Db, Collection, MongoClientOptions } from 'mongodb';
import type { Db, Collection, MongoClientOptions, Document } from 'mongodb';
const { MONGO_URL = 'mongodb://localhost:27017/rocketchat' } = process.env;
@ -44,7 +44,7 @@ export const getConnection = ((): ((options?: MongoClientOptions) => Promise<Db>
};
})();
export async function getCollection<T>(name: Collections): Promise<Collection<T>> {
export async function getCollection<T extends Document>(name: Collections): Promise<Collection<T>> {
if (!db) {
db = await getConnection();
}

@ -62,7 +62,7 @@
"pino-pretty": "^7.6.1",
"pm2": "^5.2.0",
"ts-node": "^10.9.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"volta": {
"extends": "../../../package.json"

@ -1,16 +1,18 @@
type Transform<T, U extends T | Promise<T>> = (x: T) => U;
type Transform<T, U extends T | Promise<Awaited<T>>> = (x: T) => U;
type TransformChain<T, U extends T | Promise<T>> = {
type TransformChain<T, U extends T | Promise<Awaited<T>>> = {
(x: T): U;
use(transform: Transform<T, U>): () => void;
};
export const createAsyncTransformChain = <T>(...transforms: Transform<T, Promise<T>>[]): TransformChain<T, Promise<T>> => {
export const createAsyncTransformChain = <T>(
...transforms: Transform<T, Promise<Awaited<T>>>[]
): TransformChain<T, Promise<Awaited<T>>> => {
let chain = transforms;
const call = (x: T): Promise<T> => chain.reduce((x, transform) => x.then(transform), Promise.resolve(x));
const call = (x: T): Promise<Awaited<T>> => chain.reduce((x, transform) => x.then(transform), Promise.resolve(x));
const use = (transform: Transform<T, Promise<T>>): (() => void) => {
const use = (transform: Transform<T, Promise<Awaited<T>>>): (() => void) => {
chain.push(transform);
return (): void => {

@ -196,7 +196,7 @@
"supertest": "^6.2.3",
"template-file": "^6.0.1",
"ts-node": "^10.9.1",
"typescript": "~4.6.4",
"typescript": "~5.0.2",
"webpack": "^4.46.0"
},
"dependencies": {

@ -17,13 +17,13 @@ export class BannersDismissRaw extends BaseRaw<IBannerDismiss> implements IBanne
findByUserIdAndBannerId(userId: string, bannerIds: string[], options: FindOptions<IBannerDismiss>): FindCursor<IBannerDismiss>;
findByUserIdAndBannerId<P>(
findByUserIdAndBannerId<P extends Document>(
userId: string,
bannerIds: string[],
options: FindOptions<P extends IBannerDismiss ? IBannerDismiss : P>,
): FindCursor<P>;
findByUserIdAndBannerId<P>(
findByUserIdAndBannerId<P extends Document>(
userId: string,
bannerIds: string[],
options?: undefined | FindOptions<IBannerDismiss> | FindOptions<P extends IBannerDismiss ? IBannerDismiss : P>,

@ -112,9 +112,9 @@ export abstract class BaseRaw<
};
}
private ensureDefaultFields<P>(options: FindOptions<P>): FindOptions<P>;
private ensureDefaultFields<P extends Document>(options: FindOptions<P>): FindOptions<P>;
private ensureDefaultFields<P>(
private ensureDefaultFields<P extends Document>(
options?: FindOptions<P> & { fields?: FindOptions<P>['projection'] },
): FindOptions<P> | FindOptions<T> | undefined {
if (options?.fields) {
@ -142,7 +142,7 @@ export abstract class BaseRaw<
async findOneById(_id: T['_id'], options?: FindOptions<T>): Promise<T | null>;
async findOneById<P = T>(_id: T['_id'], options?: FindOptions<P>): Promise<P | null>;
async findOneById<P extends Document = T>(_id: T['_id'], options?: FindOptions<P>): Promise<P | null>;
async findOneById(_id: T['_id'], options?: any): Promise<T | null> {
const query: Filter<T> = { _id } as Filter<T>;
@ -154,7 +154,7 @@ export abstract class BaseRaw<
async findOne(query?: Filter<T> | T['_id'], options?: undefined): Promise<T | null>;
async findOne<P = T>(query: Filter<T> | T['_id'], options?: FindOptions<P extends T ? T : P>): Promise<P | null>;
async findOne<P extends Document = T>(query: Filter<T> | T['_id'], options?: FindOptions<P extends T ? T : P>): Promise<P | null>;
async findOne<P>(query: Filter<T> | T['_id'] = {}, options?: any): Promise<WithId<T> | WithId<P> | null> {
const q: Filter<T> = typeof query === 'string' ? ({ _id: query } as Filter<T>) : query;
@ -167,14 +167,17 @@ export abstract class BaseRaw<
find(query?: Filter<T>): FindCursor<ResultFields<T, C>>;
find<P = T>(query: Filter<T>, options?: FindOptions<P extends T ? T : P>): FindCursor<P>;
find<P extends Document = T>(query: Filter<T>, options?: FindOptions<P extends T ? T : P>): FindCursor<P>;
find<P>(query: Filter<T> = {}, options?: FindOptions<P extends T ? T : P>): FindCursor<WithId<P>> | FindCursor<WithId<T>> {
find<P extends Document>(
query: Filter<T> = {},
options?: FindOptions<P extends T ? T : P>,
): FindCursor<WithId<P>> | FindCursor<WithId<T>> {
const optionsDef = this.doNotMixInclusionAndExclusionFields(options);
return this.col.find(query, optionsDef);
}
findPaginated<P = T>(query: Filter<T>, options?: FindOptions<P extends T ? T : P>): FindPaginated<FindCursor<WithId<P>>>;
findPaginated<P extends Document = T>(query: Filter<T>, options?: FindOptions<P extends T ? T : P>): FindPaginated<FindCursor<WithId<P>>>;
findPaginated(query: Filter<T> = {}, options?: any): FindPaginated<FindCursor<WithId<T>>> {
const optionsDef = this.doNotMixInclusionAndExclusionFields(options);
@ -339,7 +342,7 @@ export abstract class BaseRaw<
trashFindOneById(_id: TDeleted['_id']): Promise<TDeleted | null>;
trashFindOneById<P>(_id: TDeleted['_id'], options: FindOptions<P extends TDeleted ? TDeleted : P>): Promise<P | null>;
trashFindOneById<P extends Document>(_id: TDeleted['_id'], options: FindOptions<P extends TDeleted ? TDeleted : P>): Promise<P | null>;
async trashFindOneById<P extends TDeleted>(
_id: TDeleted['_id'],
@ -369,7 +372,7 @@ export abstract class BaseRaw<
trashFindDeletedAfter(deletedAt: Date): FindCursor<WithId<TDeleted>>;
trashFindDeletedAfter<P = TDeleted>(
trashFindDeletedAfter<P extends Document = TDeleted>(
deletedAt: Date,
query?: Filter<TDeleted>,
options?: FindOptions<P extends TDeleted ? TDeleted : P>,
@ -392,7 +395,7 @@ export abstract class BaseRaw<
return this.trash.find(q);
}
trashFindPaginatedDeletedAfter<P = TDeleted>(
trashFindPaginatedDeletedAfter<P extends Document = TDeleted>(
deletedAt: Date,
query?: Filter<TDeleted>,
options?: FindOptions<P extends TDeleted ? TDeleted : P>,

@ -1,5 +1,5 @@
import type { ILivechatBusinessHoursModel } from '@rocket.chat/model-typings';
import type { Collection, Db, FindOptions } from 'mongodb';
import type { Collection, Db, Document, FindOptions } from 'mongodb';
import type { ILivechatBusinessHour, RocketChatRecordDeleted } from '@rocket.chat/core-typings';
import { LivechatBusinessHourTypes } from '@rocket.chat/core-typings';
@ -24,7 +24,9 @@ export class LivechatBusinessHoursRaw extends BaseRaw<ILivechatBusinessHour> imp
async findOneDefaultBusinessHour(options: FindOptions<ILivechatBusinessHour>): Promise<ILivechatBusinessHour | null>;
async findOneDefaultBusinessHour<P>(options: FindOptions<P extends ILivechatBusinessHour ? ILivechatBusinessHour : P>): Promise<P | null>;
async findOneDefaultBusinessHour<P extends Document>(
options: FindOptions<P extends ILivechatBusinessHour ? ILivechatBusinessHour : P>,
): Promise<P | null>;
findOneDefaultBusinessHour<P>(options?: any): Promise<ILivechatBusinessHour | P | null> {
return this.findOne({ type: LivechatBusinessHourTypes.DEFAULT }, options);

@ -50,12 +50,12 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw<ILivechatDepartmentAgen
findUsersInQueue(usersList: string[], options: FindOptions<ILivechatDepartmentAgents>): FindCursor<ILivechatDepartmentAgents>;
findUsersInQueue<P>(
findUsersInQueue<P extends Document>(
usersList: string[],
options: FindOptions<P extends ILivechatDepartmentAgents ? ILivechatDepartmentAgents : P>,
): FindCursor<P>;
findUsersInQueue<P>(
findUsersInQueue<P extends Document>(
usersList: string[],
options?:
| undefined
@ -89,7 +89,7 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw<ILivechatDepartmentAgen
options: FindOptions<ILivechatDepartmentAgents>,
): FindPaginated<FindCursor<ILivechatDepartmentAgents>>;
findAgentsByDepartmentId<P>(
findAgentsByDepartmentId<P extends Document>(
departmentId: string,
options: FindOptions<P extends ILivechatDepartmentAgents ? ILivechatDepartmentAgents : P>,
): FindPaginated<FindCursor<P>>;
@ -111,12 +111,12 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw<ILivechatDepartmentAgen
findActiveDepartmentsByAgentId(agentId: string, options: FindOptions<ILivechatDepartmentAgents>): FindCursor<ILivechatDepartmentAgents>;
findActiveDepartmentsByAgentId<P>(
findActiveDepartmentsByAgentId<P extends Document>(
agentId: string,
options: FindOptions<P extends ILivechatDepartmentAgents ? ILivechatDepartmentAgents : P>,
): FindCursor<P>;
findActiveDepartmentsByAgentId<P>(
findActiveDepartmentsByAgentId<P extends Document>(
agentId: string,
options?:
| undefined

@ -112,7 +112,7 @@ export class LivechatInquiryRaw extends BaseRaw<ILivechatInquiryRecord> implemen
return this.findOne(query) as unknown as Promise<(ILivechatInquiryRecord & { status: LivechatInquiryStatus.QUEUED }) | null>;
}
findOneByRoomId<T = ILivechatInquiryRecord>(
findOneByRoomId<T extends Document = ILivechatInquiryRecord>(
rid: string,
options: FindOptions<T extends ILivechatInquiryRecord ? ILivechatInquiryRecord : T>,
): Promise<T | null> {

@ -113,7 +113,7 @@ export class LivechatVisitorsRaw extends BaseRaw<ILivechatVisitor> implements IL
return `guest-${livechatCount.value.value}`;
}
findByNameRegexWithExceptionsAndConditions<P = ILivechatVisitor>(
findByNameRegexWithExceptionsAndConditions<P extends Document = ILivechatVisitor>(
searchTerm: string,
exceptions: string[] = [],
conditions: Filter<ILivechatVisitor> = {},

@ -1,7 +1,7 @@
import type { IRole, IRoom, IUser, RocketChatRecordDeleted } from '@rocket.chat/core-typings';
import type { IRolesModel } from '@rocket.chat/model-typings';
import { Subscriptions, Users } from '@rocket.chat/models';
import type { Collection, FindCursor, Db, Filter, FindOptions, InsertOneResult, UpdateResult, WithId } from 'mongodb';
import type { Collection, FindCursor, Db, Filter, FindOptions, InsertOneResult, UpdateResult, WithId, Document } from 'mongodb';
import { BaseRaw } from './BaseRaw';
@ -104,7 +104,10 @@ export class RolesRaw extends BaseRaw<IRole> implements IRolesModel {
async findOneByIdOrName(_idOrName: IRole['_id'] | IRole['name'], options: FindOptions<IRole>): Promise<IRole | null>;
async findOneByIdOrName<P>(_idOrName: IRole['_id'] | IRole['name'], options: FindOptions<P extends IRole ? IRole : P>): Promise<P | null>;
async findOneByIdOrName<P extends Document>(
_idOrName: IRole['_id'] | IRole['name'],
options: FindOptions<P extends IRole ? IRole : P>,
): Promise<P | null>;
findOneByIdOrName<P>(_idOrName: IRole['_id'] | IRole['name'], options?: any): Promise<IRole | P | null> {
const query: Filter<IRole> = {
@ -208,7 +211,7 @@ export class RolesRaw extends BaseRaw<IRole> implements IRolesModel {
findUsersInRole(roleId: IRole['_id'], scope: IRoom['_id'] | undefined, options: FindOptions<IUser>): Promise<FindCursor<IUser>>;
findUsersInRole<P>(
findUsersInRole<P extends Document>(
roleId: IRole['_id'],
scope: IRoom['_id'] | undefined,
options: FindOptions<P extends IUser ? IUser : P>,

@ -226,13 +226,13 @@ export class SubscriptionsRaw extends BaseRaw<ISubscription> implements ISubscri
findUsersInRoles(roles: IRole['_id'][], rid: string | undefined, options: FindOptions<IUser>): Promise<FindCursor<IUser>>;
findUsersInRoles<P = IUser>(
findUsersInRoles<P extends Document = IUser>(
roles: IRole['_id'][],
rid: string | undefined,
options: FindOptions<P extends IUser ? IUser : P>,
): Promise<FindCursor<P>>;
async findUsersInRoles<P = IUser>(
async findUsersInRoles<P extends Document = IUser>(
roles: IRole['_id'][],
rid: IRoom['_id'] | undefined,
options?: FindOptions<P extends IUser ? IUser : P>,

@ -1,6 +1,6 @@
import type { ITeam, RocketChatRecordDeleted, TEAM_TYPE } from '@rocket.chat/core-typings';
import type { FindPaginated, ITeamModel } from '@rocket.chat/model-typings';
import type { Collection, FindCursor, Db, DeleteResult, Filter, FindOptions, IndexDescription, UpdateResult } from 'mongodb';
import type { Collection, FindCursor, Db, DeleteResult, Document, Filter, FindOptions, IndexDescription, UpdateResult } from 'mongodb';
import { BaseRaw } from './BaseRaw';
@ -17,9 +17,9 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findByNames(names: Array<string>, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByNames<P>(names: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByNames<P extends Document>(names: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByNames<P>(
findByNames<P extends Document>(
names: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<P> | FindCursor<ITeam> {
@ -33,9 +33,13 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findByIds(ids: Array<string>, options: FindOptions<ITeam>, query?: Filter<ITeam>): FindCursor<ITeam>;
findByIds<P>(ids: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>, query?: Filter<ITeam>): FindCursor<P>;
findByIds<P extends Document>(
ids: Array<string>,
options: FindOptions<P extends ITeam ? ITeam : P>,
query?: Filter<ITeam>,
): FindCursor<P>;
findByIds<P>(
findByIds<P extends Document>(
ids: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
query?: Filter<ITeam>,
@ -63,9 +67,13 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findByIdsAndType(ids: Array<string>, type: TEAM_TYPE, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByIdsAndType<P>(ids: Array<string>, type: TEAM_TYPE, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByIdsAndType<P extends Document>(
ids: Array<string>,
type: TEAM_TYPE,
options: FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<P>;
findByIdsAndType<P>(
findByIdsAndType<P extends Document>(
ids: Array<string>,
type: TEAM_TYPE,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
@ -80,9 +88,9 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findByType(type: number, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByType<P>(type: number, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByType<P extends Document>(type: number, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByType<P>(
findByType<P extends Document>(
type: number,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<ITeam> | FindCursor<P> {
@ -96,9 +104,13 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findByNameAndTeamIds(name: string | RegExp, teamIds: Array<string>, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByNameAndTeamIds<P>(name: string | RegExp, teamIds: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByNameAndTeamIds<P extends Document>(
name: string | RegExp,
teamIds: Array<string>,
options: FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<P>;
findByNameAndTeamIds<P>(
findByNameAndTeamIds<P extends Document>(
name: string | RegExp,
teamIds: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
@ -140,9 +152,9 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findOneByName(name: string | RegExp, options: FindOptions<ITeam>): Promise<ITeam | null>;
findOneByName<P>(name: string | RegExp, options: FindOptions<P>): Promise<P | null>;
findOneByName<P extends Document>(name: string | RegExp, options: FindOptions<P>): Promise<P | null>;
findOneByName<P>(
findOneByName<P extends Document>(
name: string | RegExp,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): Promise<P | null> | Promise<ITeam | null> {
@ -156,9 +168,9 @@ export class TeamRaw extends BaseRaw<ITeam> implements ITeamModel {
findOneByMainRoomId(roomId: string, options: FindOptions<ITeam>): Promise<ITeam | null>;
findOneByMainRoomId<P>(roomId: string, options: FindOptions<P>): Promise<P | null>;
findOneByMainRoomId<P extends Document>(roomId: string, options: FindOptions<P>): Promise<P | null>;
findOneByMainRoomId<P>(
findOneByMainRoomId<P extends Document>(
roomId: string,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): Promise<P | null> | Promise<ITeam | null> {

@ -5,6 +5,7 @@ import type {
FindCursor,
Db,
DeleteResult,
Document,
Filter,
FindOptions,
IndexDescription,
@ -35,9 +36,9 @@ export class TeamMemberRaw extends BaseRaw<ITeamMember> implements ITeamMemberMo
findByUserId(userId: string, options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByUserId<P>(userId: string, options: FindOptions<P>): FindCursor<P>;
findByUserId<P extends Document>(userId: string, options: FindOptions<P>): FindCursor<P>;
findByUserId<P>(
findByUserId<P extends Document>(
userId: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): FindCursor<P> | FindCursor<ITeamMember> {
@ -48,9 +49,9 @@ export class TeamMemberRaw extends BaseRaw<ITeamMember> implements ITeamMemberMo
findOneByUserIdAndTeamId(userId: string, teamId: string, options: FindOptions<ITeamMember>): Promise<ITeamMember | null>;
findOneByUserIdAndTeamId<P>(userId: string, teamId: string, options: FindOptions<P>): Promise<P | null>;
findOneByUserIdAndTeamId<P extends Document>(userId: string, teamId: string, options: FindOptions<P>): Promise<P | null>;
findOneByUserIdAndTeamId<P>(
findOneByUserIdAndTeamId<P extends Document>(
userId: string,
teamId: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
@ -62,9 +63,9 @@ export class TeamMemberRaw extends BaseRaw<ITeamMember> implements ITeamMemberMo
findByTeamId(teamId: string, options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByTeamId<P>(teamId: string, options: FindOptions<P>): FindCursor<P>;
findByTeamId<P extends Document>(teamId: string, options: FindOptions<P>): FindCursor<P>;
findByTeamId<P>(
findByTeamId<P extends Document>(
teamId: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): FindCursor<P> | FindCursor<ITeamMember> {
@ -75,9 +76,9 @@ export class TeamMemberRaw extends BaseRaw<ITeamMember> implements ITeamMemberMo
findByTeamIds(teamIds: Array<string>, options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByTeamIds<P>(teamIds: Array<string>, options: FindOptions<P>): FindCursor<P>;
findByTeamIds<P extends Document>(teamIds: Array<string>, options: FindOptions<P>): FindCursor<P>;
findByTeamIds<P>(
findByTeamIds<P extends Document>(
teamIds: Array<string>,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): FindCursor<P> | FindCursor<ITeamMember> {
@ -88,9 +89,9 @@ export class TeamMemberRaw extends BaseRaw<ITeamMember> implements ITeamMemberMo
findByTeamIdAndRole(teamId: string, role: IRole['_id'], options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByTeamIdAndRole<P>(teamId: string, role: IRole['_id'], options: FindOptions<P>): FindCursor<P>;
findByTeamIdAndRole<P extends Document>(teamId: string, role: IRole['_id'], options: FindOptions<P>): FindCursor<P>;
findByTeamIdAndRole<P>(
findByTeamIdAndRole<P extends Document>(
teamId: string,
role: IRole['_id'],
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,

@ -1,12 +1,13 @@
import type { ISettingsService } from '@rocket.chat/core-services';
import { ServiceClassInternal } from '@rocket.chat/core-services';
import type { SettingValue } from '@rocket.chat/core-typings';
import { settings } from '../../../app/settings/server';
export class SettingsService extends ServiceClassInternal implements ISettingsService {
protected name = 'settings';
async get<T>(settingId: string): Promise<T> {
async get<T extends SettingValue>(settingId: string): Promise<T> {
return settings.get<T>(settingId);
}
}

@ -1,4 +1,4 @@
import type { FindOptions, Filter } from 'mongodb';
import type { Document, FindOptions, Filter } from 'mongodb';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import type {
IRoom,
@ -198,9 +198,9 @@ export class TeamService extends ServiceClassInternal implements ITeamService {
search(userId: string, term: string | RegExp, options: FindOptions<ITeam>): Promise<ITeam[]>;
search<P>(userId: string, term: string | RegExp, options: FindOptions<P extends ITeam ? ITeam : P>): Promise<P[]>;
search<P extends Document>(userId: string, term: string | RegExp, options: FindOptions<P extends ITeam ? ITeam : P>): Promise<P[]>;
async search<P>(
async search<P extends Document>(
userId: string,
term: string | RegExp,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
@ -295,9 +295,9 @@ export class TeamService extends ServiceClassInternal implements ITeamService {
listByNames(names: Array<string>, options: FindOptions<ITeam>): Promise<ITeam[]>;
listByNames<P>(names: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): Promise<P[]>;
listByNames<P extends Document>(names: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): Promise<P[]>;
async listByNames<P>(
async listByNames<P extends Document>(
names: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): Promise<P[] | ITeam[]> {
@ -487,9 +487,9 @@ export class TeamService extends ServiceClassInternal implements ITeamService {
listTeamsBySubscriberUserId(uid: string, options: FindOptions<ITeamMember>): Promise<ITeamMember[]>;
listTeamsBySubscriberUserId<P>(uid: string, options: FindOptions<P>): Promise<P[]>;
listTeamsBySubscriberUserId<P extends Document>(uid: string, options: FindOptions<P>): Promise<P[]>;
listTeamsBySubscriberUserId<P>(
listTeamsBySubscriberUserId<P extends Document>(
uid: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): Promise<P[] | ITeamMember[]> {

@ -42,7 +42,7 @@
"@types/polka": "^0.5.4",
"eslint": "^8.29.0",
"ts-node": "^10.9.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"main": "./dist/ee/apps/account-service/src/service.js",
"files": [

@ -12,9 +12,6 @@
"noImplicitReturns": false,
"noFallthroughCasesInSwitch": false,
/* Module Resolution Options */
"importsNotUsedAsValues": "preserve",
"outDir": "./dist"
},
"files": ["./src/service.ts"],

@ -39,7 +39,7 @@
"@types/polka": "^0.5.4",
"eslint": "^8.29.0",
"ts-node": "^10.9.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"main": "./dist/ee/apps/authorization-service/src/service.js",
"files": [

@ -53,7 +53,7 @@
"eslint": "^8.29.0",
"pino-pretty": "^7.6.1",
"ts-node": "^10.9.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"main": "./dist/service.js",
"files": [

@ -45,7 +45,7 @@
"@types/polka": "^0.5.4",
"eslint": "^8.29.0",
"ts-node": "^10.9.1",
"typescript": "~4.5.5"
"typescript": "~5.0.2"
},
"main": "./dist/ee/apps/omnichannel-transcript/src/service.js",
"files": [

@ -39,7 +39,7 @@
"@types/polka": "^0.5.4",
"eslint": "^8.29.0",
"ts-node": "^10.9.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"main": "./dist/ee/apps/presence-service/src/service.js",
"files": [

@ -42,7 +42,7 @@
"@types/polka": "^0.5.4",
"eslint": "^8.29.0",
"ts-node": "^10.9.1",
"typescript": "~4.5.5"
"typescript": "~5.0.2"
},
"main": "./dist/ee/apps/queue-worker/src/service.js",
"files": [

@ -40,7 +40,7 @@
"@types/polka": "^0.5.4",
"eslint": "^8.29.0",
"ts-node": "^10.9.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"main": "./dist/ee/apps/stream-hub-service/src/service.js",
"files": [

@ -8,7 +8,7 @@
"eslint": "^8.12.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"dependencies": {
"@rocket.chat/core-services": "workspace:^",

@ -22,7 +22,7 @@
"jest": "^27.5.1",
"react-dom": "^18.2.0",
"ts-jest": "^27.1.4",
"typescript": "~4.5.5"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -13,7 +13,7 @@
"babel-jest": "^29.0.3",
"eslint": "^8.29.0",
"jest": "^29.0.3",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint src",

@ -36,7 +36,7 @@
"postcss-url": "~10.1.3",
"react": "~17.0.2",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -7,7 +7,7 @@
"eslint": "^8.12.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -17,7 +17,7 @@
"eslint": "^8.29.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -8,7 +8,7 @@
"eslint": "^8.29.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.5",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -20,7 +20,7 @@
"eslint": "^8.29.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.5",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"volta": {
"extends": "../../package.json"

@ -8,7 +8,7 @@
"eslint": "^8.29.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -7,7 +7,7 @@
"eslint": "^8.29.0",
"mongodb": "^4.12.1",
"prettier": "^2.7.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -1,3 +1,5 @@
import type { SettingValue } from '@rocket.chat/core-typings';
export interface ISettingsService {
get<T>(settingId: string): Promise<T>;
get<T extends SettingValue>(settingId: string): Promise<T>;
}

@ -10,7 +10,7 @@ import type {
IUser,
IRole,
} from '@rocket.chat/core-typings';
import type { Filter, FindOptions } from 'mongodb';
import type { Document, Filter, FindOptions } from 'mongodb';
import type { ICreateRoomParams } from './IRoomService';
@ -107,7 +107,7 @@ export interface ITeamService {
deleteByName(teamName: string): Promise<boolean>;
unsetTeamIdOfRooms(uid: string, teamId: string): void;
getOneById(teamId: string, options?: FindOptions<ITeam>): Promise<ITeam | null>;
getOneById<P>(teamId: string, options?: FindOptions<P extends ITeam ? ITeam : P>): Promise<ITeam | P | null>;
getOneById<P extends Document>(teamId: string, options?: FindOptions<P extends ITeam ? ITeam : P>): Promise<ITeam | P | null>;
getOneByName(teamName: string | RegExp, options?: FindOptions<ITeam>): Promise<ITeam | null>;
getOneByMainRoomId(teamId: string): Promise<Pick<ITeam, '_id'> | null>;
getOneByRoomId(teamId: string): Promise<ITeam | null>;

@ -7,7 +7,7 @@
"eslint": "^8.29.0",
"mongodb": "^4.12.1",
"prettier": "^2.7.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -1,12 +1,10 @@
import type { MessageAttachmentBase } from '../MessageAttachmentBase';
import type { AudioAttachmentProps } from './AudioAttachmentProps';
import type { FileProp } from './FileProp';
import type { ImageAttachmentProps } from './ImageAttachmentProps';
import type { VideoAttachmentProps } from './VideoAttachmentProps';
export type FileAttachmentProps = {
type: 'file';
file?: FileProp;
} & (VideoAttachmentProps | ImageAttachmentProps | AudioAttachmentProps);
export const isFileAttachment = (attachment: MessageAttachmentBase): attachment is FileAttachmentProps =>

@ -1,6 +1,7 @@
import type { Root } from '@rocket.chat/message-parser';
import type { MessageAttachmentBase } from './MessageAttachmentBase';
import type { MessageAttachment } from './MessageAttachment';
export type MessageQuoteAttachment = {
author_name: string;
@ -12,4 +13,4 @@ export type MessageQuoteAttachment = {
attachments?: Array<MessageQuoteAttachment>; // TODO this is cauising issues to define a model, see @ts-expect-error at apps/meteor/app/api/server/v1/channels.ts:274
} & MessageAttachmentBase;
export const isQuoteAttachment = (attachment: MessageAttachmentBase): attachment is MessageQuoteAttachment => 'message_link' in attachment;
export const isQuoteAttachment = (attachment: MessageAttachment): attachment is MessageQuoteAttachment => 'message_link' in attachment;

@ -1,4 +1,4 @@
import type { FindOptions, Filter, SchemaMember } from 'mongodb';
import type { Document, FindOptions, Filter, SchemaMember } from 'mongodb';
import type { IRocketChatRecord } from './IRocketChatRecord';
import type { IRole } from './IRole';
@ -34,7 +34,7 @@ export interface IPaginationOptions {
}
// TODO move this definition to a more broader file
export interface IQueryOptions<T> {
export interface IQueryOptions<T extends Document> {
sort?: FindOptions<T>['sort'];
query?: Filter<T>;
fields?: SchemaMember<T, number | boolean>;

@ -4,7 +4,7 @@
"private": true,
"devDependencies": {
"eslint": "^8.29.0",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -85,7 +85,7 @@
"react-dom": "^17.0.2",
"rimraf": "^3.0.2",
"tslib": "^2.3.1",
"typescript": "~4.6.4",
"typescript": "~5.0.2",
"webpack": "~5.68.0"
},
"dependencies": {

@ -6,7 +6,6 @@
"allowJs": false,
"noImplicitReturns": true,
"noImplicitThis": true,
"suppressImplicitAnyIndexErrors": true
},
"exclude": ["node_modules", "dist"]
}

@ -0,0 +1,3 @@
module.exports = {
presets: ['@babel/preset-env'],
};

@ -1,16 +1,8 @@
module.exports = {
export default {
preset: 'ts-jest',
errorOnDeprecated: true,
testEnvironment: 'jsdom',
modulePathIgnorePatterns: ['<rootDir>/dist/'],
globals: {
'ts-jest': {
tsconfig: {
noUnusedLocals: false,
noUnusedParameters: false,
},
},
},
moduleNameMapper: {
'\\.css$': 'identity-obj-proxy',
},

@ -43,7 +43,7 @@
"outdent": "^0.8.0",
"react-dom": "~17.0.2",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -73,7 +73,6 @@ it('renders a paragraph', () => {
);
expect(screen.getByText('Hello')).toBeInTheDocument();
expect(screen.getByText('Hello').matches('p')).toBeTruthy();
});
it('renders a heading', () => {
@ -205,7 +204,6 @@ it('renders a blockquote', () => {
expect(screen.getByText('Cogito ergo sum.')).toBeInTheDocument();
expect(screen.getByText('Sit amet, consectetur adipiscing elit.')).toBeInTheDocument();
expect(screen.getByText('Donec eget ex euismod, euismod nisi euismod, vulputate nisi.')).toBeInTheDocument();
expect(screen.getByText('Cogito ergo sum.').matches('blockquote p')).toBeTruthy();
});
it('renders a code block', async () => {

@ -15,7 +15,7 @@ const UserMentionElement = ({ mention }: UserMentionElementProps): ReactElement
const { isMobile } = useLayout();
const uid = useUserId();
const showRealName = Boolean(useSetting('UI_Use_Real_Name')) && !isMobile;
const showRealName = useSetting<boolean>('UI_Use_Real_Name') && !isMobile;
if (mention === 'all') {
return <span className='mention-link mention-link--all mention-link--group'>all</span>;

@ -7,7 +7,7 @@
"eslint": "^8.29.0",
"mongodb": "^4.12.1",
"prettier": "^2.7.1",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -76,7 +76,7 @@
"stylelint": "^14.9.1",
"stylelint-order": "^5.0.0",
"svg-loader": "^0.0.2",
"typescript": "~4.6.4",
"typescript": "~5.0.2",
"url-loader": "^4.1.1",
"webpack": "^4.44.1",
"webpack-cli": "^3.3.12",

@ -9,7 +9,7 @@
"jest": "^27.5.1",
"mongodb": "^4.12.1",
"ts-jest": "^27.1.5",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",

@ -1,4 +1,4 @@
import type { FindCursor, FindOptions } from 'mongodb';
import type { Document, FindCursor, FindOptions } from 'mongodb';
import type { IBannerDismiss } from '@rocket.chat/core-typings';
import type { IBaseModel } from './IBaseModel';
@ -8,13 +8,13 @@ export interface IBannersDismissModel extends IBaseModel<IBannerDismiss> {
findByUserIdAndBannerId(userId: string, bannerIds: string[], options: FindOptions<IBannerDismiss>): FindCursor<IBannerDismiss>;
findByUserIdAndBannerId<P>(
findByUserIdAndBannerId<P extends Document>(
userId: string,
bannerIds: string[],
options: FindOptions<P extends IBannerDismiss ? IBannerDismiss : P>,
): FindCursor<P>;
findByUserIdAndBannerId<P>(
findByUserIdAndBannerId<P extends Document>(
userId: string,
bannerIds: string[],
options?: undefined | FindOptions<IBannerDismiss> | FindOptions<P extends IBannerDismiss ? IBannerDismiss : P>,

@ -50,18 +50,21 @@ export interface IBaseModel<
findOneAndUpdate(query: Filter<T>, update: UpdateFilter<T> | T, options?: FindOneAndUpdateOptions): Promise<ModifyResult<T>>;
findOneById(_id: T['_id'], options?: FindOptions<T> | undefined): Promise<T | null>;
findOneById<P = T>(_id: T['_id'], options?: FindOptions<P>): Promise<P | null>;
findOneById<P extends Document = T>(_id: T['_id'], options?: FindOptions<P>): Promise<P | null>;
findOneById(_id: T['_id'], options?: any): Promise<T | null>;
findOne(query?: Filter<T> | T['_id'], options?: undefined): Promise<T | null>;
findOne<P = T>(query: Filter<T> | T['_id'], options: FindOptions<P extends T ? T : P>): Promise<P | null>;
findOne<P extends Document = T>(query: Filter<T> | T['_id'], options: FindOptions<P extends T ? T : P>): Promise<P | null>;
findOne<P>(query: Filter<T> | T['_id'], options?: any): Promise<WithId<T> | WithId<P> | null>;
find(query?: Filter<T>): FindCursor<ResultFields<T, C>>;
find<P = T>(query: Filter<T>, options: FindOptions<P extends T ? T : P>): FindCursor<P>;
find<P>(query: Filter<T> | undefined, options?: FindOptions<P extends T ? T : P>): FindCursor<WithId<P>> | FindCursor<WithId<T>>;
find<P extends Document = T>(query: Filter<T>, options: FindOptions<P extends T ? T : P>): FindCursor<P>;
find<P extends Document>(
query: Filter<T> | undefined,
options?: FindOptions<P extends T ? T : P>,
): FindCursor<WithId<P>> | FindCursor<WithId<T>>;
findPaginated<P = T>(query: Filter<T>, options?: FindOptions<P extends T ? T : P>): FindPaginated<FindCursor<WithId<P>>>;
findPaginated<P extends Document = T>(query: Filter<T>, options?: FindOptions<P extends T ? T : P>): FindPaginated<FindCursor<WithId<P>>>;
findPaginated(query: Filter<T>, options?: any): FindPaginated<FindCursor<WithId<T>>>;
update(
@ -92,7 +95,7 @@ export interface IBaseModel<
trashFindOneById(_id: TDeleted['_id']): Promise<TDeleted | null>;
trashFindOneById<P>(_id: TDeleted['_id'], options: FindOptions<P extends TDeleted ? TDeleted : P>): Promise<P | null>;
trashFindOneById<P extends Document>(_id: TDeleted['_id'], options: FindOptions<P extends TDeleted ? TDeleted : P>): Promise<P | null>;
trashFindOneById<P extends TDeleted>(
_id: TDeleted['_id'],
@ -101,13 +104,13 @@ export interface IBaseModel<
trashFindDeletedAfter(deletedAt: Date): FindCursor<WithId<TDeleted>>;
trashFindDeletedAfter<P = TDeleted>(
trashFindDeletedAfter<P extends Document = TDeleted>(
deletedAt: Date,
query?: Filter<TDeleted>,
options?: FindOptions<P extends TDeleted ? TDeleted : P>,
): FindCursor<WithId<TDeleted>>;
trashFindPaginatedDeletedAfter<P = TDeleted>(
trashFindPaginatedDeletedAfter<P extends Document = TDeleted>(
deletedAt: Date,
query?: Filter<TDeleted>,
options?: FindOptions<P extends TDeleted ? TDeleted : P>,

@ -1,4 +1,4 @@
import type { FindOptions } from 'mongodb';
import type { Document, FindOptions } from 'mongodb';
import type { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings';
import type { IBaseModel } from './IBaseModel';
@ -17,7 +17,9 @@ export interface ILivechatBusinessHoursModel extends IBaseModel<ILivechatBusines
findActiveBusinessHours(options?: FindOptions<ILivechatBusinessHour>): Promise<ILivechatBusinessHour[]>;
findOneDefaultBusinessHour(options?: undefined): Promise<ILivechatBusinessHour | null>;
findOneDefaultBusinessHour(options: FindOptions<ILivechatBusinessHour>): Promise<ILivechatBusinessHour | null>;
findOneDefaultBusinessHour<P>(options: FindOptions<P extends ILivechatBusinessHour ? ILivechatBusinessHour : P>): Promise<P | null>;
findOneDefaultBusinessHour<P extends Document>(
options: FindOptions<P extends ILivechatBusinessHour ? ILivechatBusinessHour : P>,
): Promise<P | null>;
findOneDefaultBusinessHour<P>(options?: any): Promise<ILivechatBusinessHour | P | null>;
findActiveAndOpenBusinessHoursByDay(day: string, options?: FindOptions<ILivechatBusinessHour>): Promise<ILivechatBusinessHour[]>;
findDefaultActiveAndOpenBusinessHoursByDay(day: string, options?: any): Promise<ILivechatBusinessHour[]>;

@ -1,11 +1,11 @@
import type { ILivechatCustomField } from '@rocket.chat/core-typings';
import type { FindOptions, FindCursor } from 'mongodb';
import type { FindOptions, FindCursor, Document } from 'mongodb';
import type { IBaseModel } from './IBaseModel';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ILivechatCustomFieldModel extends IBaseModel<ILivechatCustomField> {
findByScope<T = ILivechatCustomField>(scope: ILivechatCustomField['scope'], options?: FindOptions<T>): FindCursor<T>;
findByScope<T extends Document = ILivechatCustomField>(scope: ILivechatCustomField['scope'], options?: FindOptions<T>): FindCursor<T>;
findByScope(scope: ILivechatCustomField['scope'], options?: FindOptions<ILivechatCustomField>): FindCursor<ILivechatCustomField>;
findMatchingCustomFields(
scope: ILivechatCustomField['scope'],

@ -8,12 +8,12 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel<ILivechatDepa
findUsersInQueue(usersList: string[], options: FindOptions<ILivechatDepartmentAgents>): FindCursor<ILivechatDepartmentAgents>;
findUsersInQueue<P>(
findUsersInQueue<P extends Document>(
usersList: string[],
options: FindOptions<P extends ILivechatDepartmentAgents ? ILivechatDepartmentAgents : P>,
): FindCursor<P>;
findUsersInQueue<P>(
findUsersInQueue<P extends Document>(
usersList: string[],
options?:
| undefined
@ -29,7 +29,7 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel<ILivechatDepa
options: FindOptions<ILivechatDepartmentAgents>,
): FindPaginated<FindCursor<ILivechatDepartmentAgents>>;
findAgentsByDepartmentId<P>(
findAgentsByDepartmentId<P extends Document>(
departmentId: string,
options: FindOptions<P extends ILivechatDepartmentAgents ? ILivechatDepartmentAgents : P>,
): FindPaginated<FindCursor<P>>;
@ -43,12 +43,12 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel<ILivechatDepa
findActiveDepartmentsByAgentId(agentId: string, options: FindOptions<ILivechatDepartmentAgents>): FindCursor<ILivechatDepartmentAgents>;
findActiveDepartmentsByAgentId<P>(
findActiveDepartmentsByAgentId<P extends Document>(
agentId: string,
options: FindOptions<P extends ILivechatDepartmentAgents ? ILivechatDepartmentAgents : P>,
): FindCursor<P>;
findActiveDepartmentsByAgentId<P>(
findActiveDepartmentsByAgentId<P extends Document>(
agentId: string,
options?:
| undefined

@ -10,7 +10,7 @@ import type { IBaseModel } from './IBaseModel';
export interface ILivechatInquiryModel extends IBaseModel<ILivechatInquiryRecord> {
findOneQueuedByRoomId(rid: string): Promise<(ILivechatInquiryRecord & { status: LivechatInquiryStatus.QUEUED }) | null>;
findOneByRoomId<T = ILivechatInquiryRecord>(
findOneByRoomId<T extends Document = ILivechatInquiryRecord>(
rid: string,
options: FindOptions<T extends ILivechatInquiryRecord ? ILivechatInquiryRecord : T>,
): Promise<T | null>;

@ -7,7 +7,7 @@ export interface ILivechatVisitorsModel extends IBaseModel<ILivechatVisitor> {
findById(_id: string, options?: FindOptions<ILivechatVisitor>): FindCursor<ILivechatVisitor>;
getVisitorByToken(token: string, options?: FindOptions<ILivechatVisitor>): Promise<ILivechatVisitor | null>;
getVisitorsBetweenDate({ start, end, department }: { start: Date; end: Date; department?: string }): FindCursor<ILivechatVisitor>;
findByNameRegexWithExceptionsAndConditions<P = ILivechatVisitor>(
findByNameRegexWithExceptionsAndConditions<P extends Document = ILivechatVisitor>(
searchTerm: string,
exceptions: string[],
conditions: Filter<ILivechatVisitor>,

@ -12,7 +12,10 @@ export interface IRolesModel extends IBaseModel<IRole> {
findOneByIdOrName(_idOrName: IRole['_id'] | IRole['name'], options: FindOptions<IRole>): Promise<IRole | null>;
findOneByIdOrName<P>(_idOrName: IRole['_id'] | IRole['name'], options: FindOptions<P extends IRole ? IRole : P>): Promise<P | null>;
findOneByIdOrName<P extends Document>(
_idOrName: IRole['_id'] | IRole['name'],
options: FindOptions<P extends IRole ? IRole : P>,
): Promise<P | null>;
findOneByIdOrName<P>(_idOrName: IRole['_id'] | IRole['name'], options?: any): Promise<IRole | P | null>;
findOneByName<P = IRole>(name: IRole['name'], options?: any): Promise<IRole | P | null>;
@ -34,7 +37,7 @@ export interface IRolesModel extends IBaseModel<IRole> {
findUsersInRole(roleId: IRole['_id'], scope: IRoom['_id'] | undefined, options: FindOptions<IUser>): Promise<FindCursor<IUser>>;
findUsersInRole<P>(
findUsersInRole<P extends Document>(
roleId: IRole['_id'],
scope: IRoom['_id'] | undefined,
options: FindOptions<P extends IUser ? IUser : P>,

@ -38,13 +38,13 @@ export interface ISubscriptionsModel extends IBaseModel<ISubscription> {
findUsersInRoles(roles: IRole['_id'][], rid: string | undefined, options: FindOptions<IUser>): Promise<FindCursor<IUser>>;
findUsersInRoles<P = IUser>(
findUsersInRoles<P extends Document = IUser>(
roles: IRole['_id'][],
rid: string | undefined,
options: FindOptions<P extends IUser ? IUser : P>,
): Promise<FindCursor<P>>;
findUsersInRoles<P = IUser>(
findUsersInRoles<P extends Document = IUser>(
roles: IRole['_id'][],
rid: IRoom['_id'] | undefined,
options?: FindOptions<P extends IUser ? IUser : P>,

@ -1,4 +1,4 @@
import type { FindOptions, FindCursor, InsertOneResult, UpdateResult, DeleteResult, Filter } from 'mongodb';
import type { FindOptions, FindCursor, InsertOneResult, UpdateResult, DeleteResult, Filter, Document } from 'mongodb';
import type { ITeamMember, IUser, IRole } from '@rocket.chat/core-typings';
import type { FindPaginated, IBaseModel } from './IBaseModel';
@ -8,9 +8,9 @@ export interface ITeamMemberModel extends IBaseModel<ITeamMember> {
findByUserId(userId: string, options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByUserId<P>(userId: string, options: FindOptions<P>): FindCursor<P>;
findByUserId<P extends Document>(userId: string, options: FindOptions<P>): FindCursor<P>;
findByUserId<P>(
findByUserId<P extends Document>(
userId: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): FindCursor<P> | FindCursor<ITeamMember>;
@ -19,9 +19,9 @@ export interface ITeamMemberModel extends IBaseModel<ITeamMember> {
findOneByUserIdAndTeamId(userId: string, teamId: string, options: FindOptions<ITeamMember>): Promise<ITeamMember | null>;
findOneByUserIdAndTeamId<P>(userId: string, teamId: string, options: FindOptions<P>): Promise<P | null>;
findOneByUserIdAndTeamId<P extends Document>(userId: string, teamId: string, options: FindOptions<P>): Promise<P | null>;
findOneByUserIdAndTeamId<P>(
findOneByUserIdAndTeamId<P extends Document>(
userId: string,
teamId: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
@ -31,9 +31,9 @@ export interface ITeamMemberModel extends IBaseModel<ITeamMember> {
findByTeamId(teamId: string, options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByTeamId<P>(teamId: string, options: FindOptions<P>): FindCursor<P>;
findByTeamId<P extends Document>(teamId: string, options: FindOptions<P>): FindCursor<P>;
findByTeamId<P>(
findByTeamId<P extends Document>(
teamId: string,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): FindCursor<P> | FindCursor<ITeamMember>;
@ -42,9 +42,9 @@ export interface ITeamMemberModel extends IBaseModel<ITeamMember> {
findByTeamIds(teamIds: Array<string>, options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByTeamIds<P>(teamIds: Array<string>, options: FindOptions<P>): FindCursor<P>;
findByTeamIds<P extends Document>(teamIds: Array<string>, options: FindOptions<P>): FindCursor<P>;
findByTeamIds<P>(
findByTeamIds<P extends Document>(
teamIds: Array<string>,
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,
): FindCursor<P> | FindCursor<ITeamMember>;
@ -53,9 +53,9 @@ export interface ITeamMemberModel extends IBaseModel<ITeamMember> {
findByTeamIdAndRole(teamId: string, role: IRole['_id'], options: FindOptions<ITeamMember>): FindCursor<ITeamMember>;
findByTeamIdAndRole<P>(teamId: string, role: IRole['_id'], options: FindOptions<P>): FindCursor<P>;
findByTeamIdAndRole<P extends Document>(teamId: string, role: IRole['_id'], options: FindOptions<P>): FindCursor<P>;
findByTeamIdAndRole<P>(
findByTeamIdAndRole<P extends Document>(
teamId: string,
role: IRole['_id'],
options?: undefined | FindOptions<ITeamMember> | FindOptions<P extends ITeamMember ? ITeamMember : P>,

@ -1,4 +1,4 @@
import type { FindOptions, FindCursor, UpdateResult, DeleteResult, Filter } from 'mongodb';
import type { FindOptions, FindCursor, UpdateResult, DeleteResult, Filter, Document } from 'mongodb';
import type { ITeam, TEAM_TYPE } from '@rocket.chat/core-typings';
import type { FindPaginated, IBaseModel } from './IBaseModel';
@ -8,9 +8,9 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findByNames(names: Array<string>, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByNames<P>(names: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByNames<P extends Document>(names: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByNames<P>(
findByNames<P extends Document>(
names: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<P> | FindCursor<ITeam>;
@ -19,9 +19,13 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findByIds(ids: Array<string>, options: FindOptions<ITeam>, query?: Filter<ITeam>): FindCursor<ITeam>;
findByIds<P>(ids: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>, query?: Filter<ITeam>): FindCursor<P>;
findByIds<P extends Document>(
ids: Array<string>,
options: FindOptions<P extends ITeam ? ITeam : P>,
query?: Filter<ITeam>,
): FindCursor<P>;
findByIds<P>(
findByIds<P extends Document>(
ids: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
query?: Filter<ITeam>,
@ -33,9 +37,13 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findByIdsAndType(ids: Array<string>, type: TEAM_TYPE, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByIdsAndType<P>(ids: Array<string>, type: TEAM_TYPE, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByIdsAndType<P extends Document>(
ids: Array<string>,
type: TEAM_TYPE,
options: FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<P>;
findByIdsAndType<P>(
findByIdsAndType<P extends Document>(
ids: Array<string>,
type: TEAM_TYPE,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
@ -45,9 +53,9 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findByType(type: number, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByType<P>(type: number, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByType<P extends Document>(type: number, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByType<P>(
findByType<P extends Document>(
type: number,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<ITeam> | FindCursor<P>;
@ -56,9 +64,13 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findByNameAndTeamIds(name: string | RegExp, teamIds: Array<string>, options: FindOptions<ITeam>): FindCursor<ITeam>;
findByNameAndTeamIds<P>(name: string | RegExp, teamIds: Array<string>, options: FindOptions<P extends ITeam ? ITeam : P>): FindCursor<P>;
findByNameAndTeamIds<P extends Document>(
name: string | RegExp,
teamIds: Array<string>,
options: FindOptions<P extends ITeam ? ITeam : P>,
): FindCursor<P>;
findByNameAndTeamIds<P>(
findByNameAndTeamIds<P extends Document>(
name: string | RegExp,
teamIds: Array<string>,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
@ -68,9 +80,9 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findOneByName(name: string | RegExp, options: FindOptions<ITeam>): Promise<ITeam | null>;
findOneByName<P>(name: string | RegExp, options: FindOptions<P>): Promise<P | null>;
findOneByName<P extends Document>(name: string | RegExp, options: FindOptions<P>): Promise<P | null>;
findOneByName<P>(
findOneByName<P extends Document>(
name: string | RegExp,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): Promise<P | null> | Promise<ITeam | null>;
@ -79,9 +91,9 @@ export interface ITeamModel extends IBaseModel<ITeam> {
findOneByMainRoomId(roomId: string, options: FindOptions<ITeam>): Promise<ITeam | null>;
findOneByMainRoomId<P>(roomId: string, options: FindOptions<P>): Promise<P | null>;
findOneByMainRoomId<P extends Document>(roomId: string, options: FindOptions<P>): Promise<P | null>;
findOneByMainRoomId<P>(
findOneByMainRoomId<P extends Document>(
roomId: string,
options?: undefined | FindOptions<ITeam> | FindOptions<P extends ITeam ? ITeam : P>,
): Promise<P | null> | Promise<ITeam | null>;

@ -7,7 +7,7 @@
"eslint": "^8.29.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.5",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"dependencies": {
"@rocket.chat/model-typings": "workspace:^"

@ -7,7 +7,7 @@
"eslint": "^8.29.0",
"jest": "^27.5.1",
"ts-jest": "^27.1.4",
"typescript": "~4.6.4"
"typescript": "~5.0.2"
},
"scripts": {
"jest": "jest"

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save