Fix assert unreachable, remove unused variables (#13753)

Small code cleanup
This commit is contained in:
Félix Malfait
2025-08-08 09:04:45 +02:00
committed by GitHub
parent 8b4b9ef8da
commit 0236f79ccf
105 changed files with 172 additions and 315 deletions
+1 -9
View File
@@ -94,15 +94,7 @@ module.exports = {
],
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-unused-vars': [
'warn',
{
vars: 'all',
varsIgnorePattern: '^_',
args: 'after-used',
argsIgnorePattern: '^_',
},
],
'@typescript-eslint/no-unused-vars': 'off',
},
},
{
@@ -10,9 +10,8 @@ import { useEmailThreadInCommandMenu } from '@/command-menu/pages/message-thread
import { messageThreadComponentState } from '@/command-menu/pages/message-thread/states/messageThreadComponentState';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { ConnectedAccountProvider } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { assertUnreachable, isDefined } from 'twenty-shared/utils';
import { IconArrowBackUp } from 'twenty-ui/display';
import { Button } from 'twenty-ui/input';
@@ -1,6 +1,6 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { RecordGqlConnection } from '@/object-record/graphql/types/RecordGqlConnection';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { assertUnreachable } from 'twenty-shared/utils';
import { RelationType } from '~/generated-metadata/graphql';
export const isObjectRecordConnection = (
@@ -1,6 +1,6 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { FieldActorValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { assertUnreachable } from 'twenty-shared/utils';
import { FieldMetadataType, RelationType } from '~/generated-metadata/graphql';
export type GenerateEmptyFieldValueArgs = {
@@ -7,7 +7,6 @@ import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMembe
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { SettingsAccountsCalendarChannelDetails } from '@/settings/accounts/components/SettingsAccountsCalendarChannelDetails';
import { SettingsAccountsCalendarChannelsGeneral } from '@/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral';
import { SettingsNewAccountSection } from '@/settings/accounts/components/SettingsNewAccountSection';
import { SETTINGS_ACCOUNT_CALENDAR_CHANNELS_TAB_LIST_COMPONENT_ID } from '@/settings/accounts/constants/SettingsAccountCalendarChannelsTabListComponentId';
import { TabList } from '@/ui/layout/tab-list/components/TabList';
@@ -82,9 +81,10 @@ export const SettingsAccountsCalendarChannelsContainer = () => {
)}
</React.Fragment>
))}
{false && activeTabId === 'general' && (
{/* TODO: remove or keep? */}
{/* {activeTabId === 'general' && (
<SettingsAccountsCalendarChannelsGeneral />
)}
)} */}
</>
);
};
@@ -1,13 +0,0 @@
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
it('throws when argument is not never', () => {
expect(() => {
assertUnreachable(42 as never);
}).toThrow();
});
it('throws with the provided error message when argument is not never', () => {
expect(() => {
assertUnreachable(42 as never, 'Custom error!');
}).toThrow('Custom error!');
});
@@ -1,3 +0,0 @@
export const assertUnreachable = (x: never, errorMessage?: string): never => {
throw new Error(errorMessage ?? "Didn't expect to get here.");
};
@@ -1,8 +1,8 @@
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { WorkflowDiagramStepNodeData } from '@/workflow/workflow-diagram/types/WorkflowDiagram';
import { getWorkflowNodeIconKey } from '@/workflow/workflow-diagram/utils/getWorkflowNodeIconKey';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { assertUnreachable } from 'twenty-shared/utils';
import { useIcons } from 'twenty-ui/display';
const StyledStepNodeLabelIconContainer = styled.div`
@@ -1,12 +1,11 @@
import { WorkflowTrigger } from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { splitWorkflowTriggerEventName } from '@/workflow/utils/splitWorkflowTriggerEventName';
import { WorkflowDiagramStepNodeData } from '@/workflow/workflow-diagram/types/WorkflowDiagram';
import { DATABASE_TRIGGER_TYPES } from '@/workflow/workflow-trigger/constants/DatabaseTriggerTypes';
import { TRIGGER_STEP_ID } from '@/workflow/workflow-trigger/constants/TriggerStepId';
import { getTriggerIcon } from '@/workflow/workflow-trigger/utils/getTriggerIcon';
import { Node } from '@xyflow/react';
import { isDefined } from 'twenty-shared/utils';
import { assertUnreachable, isDefined } from 'twenty-shared/utils';
export const getWorkflowDiagramTriggerNode = ({
trigger,
@@ -3,7 +3,6 @@ import {
WorkflowRunStepStatus,
WorkflowTrigger,
} from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { getStepDefinitionOrThrow } from '@/workflow/utils/getStepDefinitionOrThrow';
import { WorkflowEditActionAiAgent } from '@/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowEditActionAiAgent';
import { WorkflowActionServerlessFunction } from '@/workflow/workflow-steps/workflow-actions/code-action/components/WorkflowActionServerlessFunction';
@@ -19,7 +18,7 @@ import { WorkflowEditTriggerCronForm } from '@/workflow/workflow-trigger/compone
import { WorkflowEditTriggerDatabaseEventForm } from '@/workflow/workflow-trigger/components/WorkflowEditTriggerDatabaseEventForm';
import { WorkflowEditTriggerManualForm } from '@/workflow/workflow-trigger/components/WorkflowEditTriggerManualForm';
import { WorkflowEditTriggerWebhookForm } from '@/workflow/workflow-trigger/components/WorkflowEditTriggerWebhookForm';
import { isDefined } from 'twenty-shared/utils';
import { assertUnreachable, isDefined } from 'twenty-shared/utils';
type WorkflowRunStepNodeDetailProps = {
stepId: string;
@@ -1,5 +1,4 @@
import { WorkflowAction, WorkflowTrigger } from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { getStepDefinitionOrThrow } from '@/workflow/utils/getStepDefinitionOrThrow';
import { WorkflowEditActionAiAgent } from '@/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowEditActionAiAgent';
import { WorkflowActionServerlessFunction } from '@/workflow/workflow-steps/workflow-actions/code-action/components/WorkflowActionServerlessFunction';
@@ -15,7 +14,7 @@ import { WorkflowEditTriggerCronForm } from '@/workflow/workflow-trigger/compone
import { WorkflowEditTriggerDatabaseEventForm } from '@/workflow/workflow-trigger/components/WorkflowEditTriggerDatabaseEventForm';
import { WorkflowEditTriggerManualForm } from '@/workflow/workflow-trigger/components/WorkflowEditTriggerManualForm';
import { WorkflowEditTriggerWebhookForm } from '@/workflow/workflow-trigger/components/WorkflowEditTriggerWebhookForm';
import { isDefined } from 'twenty-shared/utils';
import { assertUnreachable, isDefined } from 'twenty-shared/utils';
type WorkflowStepDetailProps = {
stepId: string;
@@ -1,6 +1,6 @@
import { CronTriggerInterval } from '@/workflow/workflow-trigger/constants/CronTriggerIntervalOptions';
import { WorkflowCronTrigger } from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { CronTriggerInterval } from '@/workflow/workflow-trigger/constants/CronTriggerIntervalOptions';
import { assertUnreachable } from 'twenty-shared/utils';
const DEFAULT_CRON_PATTERN = '0 */1 * * *'; // Every hour
@@ -3,8 +3,8 @@ import {
WorkflowManualTriggerAvailability,
WorkflowManualTriggerSettings,
} from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { COMMAND_MENU_DEFAULT_ICON } from '@/workflow/workflow-trigger/constants/CommandMenuDefaultIcon';
import { assertUnreachable } from 'twenty-shared/utils';
export const getManualTriggerDefaultSettings = ({
availability,
@@ -4,11 +4,10 @@ import {
WorkflowTrigger,
WorkflowTriggerType,
} from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { DATABASE_TRIGGER_TYPES } from '@/workflow/workflow-trigger/constants/DatabaseTriggerTypes';
import { getManualTriggerDefaultSettings } from '@/workflow/workflow-trigger/utils/getManualTriggerDefaultSettings';
import { isDefined } from 'twenty-shared/utils';
import { getRootStepIds } from '@/workflow/workflow-trigger/utils/getRootStepIds';
import { assertUnreachable, isDefined } from 'twenty-shared/utils';
// TODO: This needs to be migrated to the server
export const getTriggerDefaultDefinition = ({
@@ -1,6 +1,6 @@
import { WorkflowWebhookTrigger } from '@/workflow/types/Workflow';
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
import { WebhookHttpMethods } from '@/workflow/workflow-trigger/constants/WebhookTriggerHttpMethodOptions';
import { assertUnreachable } from 'twenty-shared/utils';
export const getWebhookTriggerDefaultSettings = (
webhookHttpMethods: WebhookHttpMethods,
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
type GraphqlQueryRunnerException,
GraphqlQueryRunnerExceptionCode,
@@ -31,9 +33,7 @@ export const graphqlQueryRunnerExceptionHandler = (
case GraphqlQueryRunnerExceptionCode.MISSING_SYSTEM_FIELD:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
};
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
type WorkspaceQueryRunnerException,
WorkspaceQueryRunnerExceptionCode,
@@ -27,9 +29,7 @@ export const workspaceExceptionHandler = (
case WorkspaceQueryRunnerExceptionCode.INTERNAL_SERVER_ERROR:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
};
@@ -26,7 +26,7 @@ export class DeleteManyResolverFactory
): Resolver<DeleteManyResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -25,7 +25,7 @@ export class DeleteOneResolverFactory
): Resolver<DeleteOneResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -26,7 +26,7 @@ export class DestroyManyResolverFactory
): Resolver<DestroyManyResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -26,7 +26,7 @@ export class DestroyOneResolverFactory
): Resolver<DestroyOneResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -26,7 +26,7 @@ export class FindDuplicatesResolverFactory
): Resolver<FindDuplicatesResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -26,7 +26,7 @@ export class RestoreManyResolverFactory
): Resolver<RestoreManyResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -26,7 +26,7 @@ export class RestoreOneResolverFactory
): Resolver<RestoreOneResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -24,7 +24,7 @@ export class UpdateManyResolverFactory
): Resolver<UpdateManyResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -26,7 +26,7 @@ export class UpdateOneResolverFactory
): Resolver<UpdateOneResolverArgs> {
const internalContext = context;
return async (_source, args, context, info) => {
return async (_source, args, _context, info) => {
const options: WorkspaceQueryRunnerOptions = {
authContext: internalContext.authContext,
info,
@@ -8,7 +8,6 @@ import { CompositeObjectTypeDefinitionFactory } from 'src/engine/api/graphql/wor
import { EnumTypeDefinitionFactory } from 'src/engine/api/graphql/workspace-schema-builder/factories/enum-type-definition.factory';
import { ExtendObjectTypeDefinitionV2Factory } from 'src/engine/api/graphql/workspace-schema-builder/factories/extend-object-type-definition-v2.factory';
import { RelationConnectInputTypeDefinitionFactory } from 'src/engine/api/graphql/workspace-schema-builder/factories/relation-connect-input-type-definition.factory';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
@@ -42,7 +41,6 @@ export class TypeDefinitionsGenerator {
private readonly connectionTypeDefinitionFactory: ConnectionTypeDefinitionFactory,
private readonly extendObjectTypeDefinitionV2Factory: ExtendObjectTypeDefinitionV2Factory,
private readonly relationConnectInputTypeDefinitionFactory: RelationConnectInputTypeDefinitionFactory,
private readonly featureFlagService: FeatureFlagService,
) {}
async generate(
@@ -504,7 +504,7 @@ export class ToolService {
}
}
private async destroyRecord(
private async _destroyRecord(
objectName: string,
parameters: Record<string, unknown>,
workspaceId: string,
@@ -618,7 +618,7 @@ export class ToolService {
}
}
private async destroyManyRecords(
private async _destroyManyRecords(
objectName: string,
parameters: Record<string, unknown>,
workspaceId: string,
@@ -8,7 +8,6 @@ import {
ApiKeyException,
ApiKeyExceptionCode,
} from 'src/engine/core-modules/api-key/api-key.exception';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { type RoleDTO } from 'src/engine/metadata-modules/role/dtos/role.dto';
import { RoleTargetsEntity } from 'src/engine/metadata-modules/role/role-targets.entity';
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
@@ -22,8 +21,7 @@ export class ApiKeyRoleService {
private readonly roleTargetsRepository: Repository<RoleTargetsEntity>,
@InjectRepository(RoleEntity, 'core')
private readonly roleRepository: Repository<RoleEntity>,
@InjectRepository(Workspace, 'core')
private readonly workspaceRepository: Repository<Workspace>,
@InjectRepository(ApiKey, 'core')
private readonly apiKeyRepository: Repository<ApiKey>,
private readonly workspacePermissionsCacheService: WorkspacePermissionsCacheService,
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ApiKeyException,
ApiKeyExceptionCode,
@@ -26,9 +28,7 @@ export const apiKeyGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -81,7 +81,7 @@ describe('GoogleAPIsService', () => {
useValue: {
getRepositoryForWorkspace: jest
.fn()
.mockImplementation((workspaceId, entity) => {
.mockImplementation((_workspaceId, entity) => {
if (entity === 'connectedAccount')
return mockConnectedAccountRepository;
if (entity === 'calendarChannel')
@@ -82,7 +82,7 @@ describe('MicrosoftAPIsService', () => {
useValue: {
getRepositoryForWorkspace: jest
.fn()
.mockImplementation((workspaceId, entity) => {
.mockImplementation((_workspaceId, entity) => {
if (entity === 'connectedAccount')
return mockConnectedAccountRepository;
if (entity === 'calendarChannel')
@@ -137,7 +137,7 @@ export class BillingSyncPlansDataCommand extends MigrationCommandRunner {
}
override async runMigrationCommand(
passedParams: string[],
_passedParams: string[],
options: MigrationCommandOptions,
): Promise<void> {
const billingMeters = await this.stripeBillingMeterService.getAllMeters();
@@ -3,7 +3,7 @@
import type Stripe from 'stripe';
export class StripeSDKMock {
constructor(private readonly apiKey: string) {}
constructor(private readonly _apiKey: string) {}
customers = {
update: (_id: string, _params?: Stripe.CustomerUpdateParams) => {
@@ -11,7 +11,7 @@ export const WithLock = (
): MethodDecorator => {
const injectCacheLockService = Inject(CacheLockService);
return function (target, propertyKey, descriptor: PropertyDescriptor) {
return function (target, _propertyKey, descriptor: PropertyDescriptor) {
injectCacheLockService(target, 'cacheLockService');
const originalMethod = descriptor.value;
@@ -21,7 +21,7 @@ export class FlushCacheCommand extends CommandRunner {
}
async run(
passedParams: string[],
_passedParams: string[],
// eslint-disable-next-line @typescript-eslint/no-explicit-any
options?: Record<string, any>,
): Promise<void> {
@@ -9,12 +9,12 @@ import {
} from 'src/engine/core-modules/captcha/interfaces';
export class GoogleRecaptchaDriver implements CaptchaDriver {
private readonly siteKey: string;
private readonly _siteKey: string;
private readonly secretKey: string;
private readonly httpService: AxiosInstance;
constructor(private options: CaptchaDriverOptions) {
this.siteKey = options.siteKey;
this.secretKey = options.secretKey;
constructor(private _options: CaptchaDriverOptions) {
this._siteKey = _options.siteKey;
this.secretKey = _options.secretKey;
this.httpService = axios.create({
baseURL: 'https://www.google.com/recaptcha/api/siteverify',
});
@@ -9,12 +9,12 @@ import {
} from 'src/engine/core-modules/captcha/interfaces';
export class TurnstileDriver implements CaptchaDriver {
private readonly siteKey: string;
private readonly _siteKey: string;
private readonly secretKey: string;
private readonly httpService: AxiosInstance;
constructor(private options: CaptchaDriverOptions) {
this.siteKey = options.siteKey;
this.secretKey = options.secretKey;
constructor(private _options: CaptchaDriverOptions) {
this._siteKey = _options.siteKey;
this.secretKey = _options.secretKey;
this.httpService = axios.create({
baseURL: 'https://challenges.cloudflare.com/turnstile/v0/siteverify',
});
@@ -3,8 +3,8 @@ import * as Sentry from '@sentry/node';
export function SentryCronMonitor(monitorSlug: string, schedule: string) {
return function (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
target: any,
propertyKey: string,
_target: any,
_propertyKey: string,
descriptor: PropertyDescriptor,
) {
const originalMethod = descriptor.value;
@@ -15,7 +15,6 @@ import {
import { featureFlagValidator } from 'src/engine/core-modules/feature-flag/validates/feature-flag.validate';
import { publicFeatureFlagValidator } from 'src/engine/core-modules/feature-flag/validates/is-public-feature-flag.validate';
import { WorkspaceFeatureFlagsMapCacheService } from 'src/engine/metadata-modules/workspace-feature-flags-map-cache/workspace-feature-flags-map-cache.service';
import { WorkspacePermissionsCacheService } from 'src/engine/metadata-modules/workspace-permissions-cache/workspace-permissions-cache.service';
@Injectable()
export class FeatureFlagService {
@@ -23,7 +22,6 @@ export class FeatureFlagService {
@InjectRepository(FeatureFlag, 'core')
private readonly featureFlagRepository: Repository<FeatureFlag>,
private readonly workspaceFeatureFlagsMapCacheService: WorkspaceFeatureFlagsMapCacheService,
private readonly workspacePermissionsCacheService: WorkspacePermissionsCacheService,
) {}
public async isFeatureEnabled(
@@ -98,7 +98,6 @@ describe('publicFeatureFlagValidator', () => {
flag,
mockException,
);
const _test: PublicFeatureFlag['key'] = flag;
return true;
};
@@ -34,7 +34,7 @@ export class FileController {
@Get('*/:filename')
@UseGuards(PublicEndpointGuard)
async getFile(
@Param() params: string[],
@Param() _params: string[],
@Res() res: Response,
@Req() req: Request,
) {
@@ -5,7 +5,6 @@ import { Repository } from 'typeorm';
import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.interface';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { type FileDTO } from 'src/engine/core-modules/file/dtos/file.dto';
import { FileEntity } from 'src/engine/core-modules/file/entities/file.entity';
import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service';
@@ -19,7 +18,6 @@ export class FileMetadataService {
@InjectRepository(FileEntity, 'core')
private readonly fileRepository: Repository<FileEntity>,
private readonly fileService: FileService,
private readonly fileStorageService: FileStorageService,
private readonly fileUploadService: FileUploadService,
) {}
@@ -7,7 +7,7 @@ import { APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations';
// TODO: this should be deprecated as singleton pattern won't work: user will keep changing locales for eachothers
@Injectable()
export class I18nMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
use(req: Request, _res: Response, next: NextFunction) {
const locale = req.locale;
if (locale && Object.values(APP_LOCALES).includes(locale)) {
@@ -12,7 +12,7 @@ import { type TwentyConfigService } from 'src/engine/core-modules/twenty-config/
* @param twentyConfigService
*/
export const messageQueueModuleFactory = async (
twentyConfigService: TwentyConfigService,
_twentyConfigService: TwentyConfigService,
redisClientService: RedisClientService,
): Promise<MessageQueueModuleOptions> => {
const driverType = MessageQueueDriverType.BullMQ;
@@ -27,7 +27,7 @@ export class AddPackagesCommand extends CommandRunner {
}
async run(
passedParams: string[],
_passedParams: string[],
// eslint-disable-next-line @typescript-eslint/no-explicit-any
options: Record<string, any>,
): Promise<void> {
@@ -4,7 +4,9 @@ export const main = async (params: {
}): Promise<object> => {
const { a, b } = params;
// Your code here
// Rename the parameters and code below with your own logic
// This is just an example
const message = `Hello, input: ${a} and ${b}`;
return {};
};
return { message };
};
@@ -138,7 +138,7 @@ export class LocalDriver implements ServerlessDriver {
return JSON.stringify(
arg,
(key, value) => {
(_key, value) => {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) {
return '[Circular]'; // Handle circular references
@@ -1,4 +1,4 @@
import { Inject, Injectable, Logger } from '@nestjs/common';
import { Inject, Injectable } from '@nestjs/common';
import { ConfigVariables } from 'src/engine/core-modules/twenty-config/config-variables';
import { CONFIG_VARIABLES_INSTANCE_TOKEN } from 'src/engine/core-modules/twenty-config/constants/config-variables-instance-tokens.constants';
@@ -13,8 +13,6 @@ import { TypedReflect } from 'src/utils/typed-reflect';
@Injectable()
export class ConfigValueConverterService {
private readonly logger = new Logger(ConfigValueConverterService.name);
constructor(
@Inject(CONFIG_VARIABLES_INSTANCE_TOKEN)
private readonly configVariables: ConfigVariables,
@@ -7,7 +7,7 @@ import { AssertOrWarn } from 'src/engine/core-modules/twenty-config/decorators/a
describe('AssertOrWarn Decorator', () => {
it('should pass validation if the condition is met', () => {
class ConfigVariables {
@AssertOrWarn((object, value) => value > 10, {
@AssertOrWarn((_object, value) => value > 10, {
message: 'Value should be higher than 10',
})
someProperty!: number;
@@ -24,7 +24,7 @@ describe('AssertOrWarn Decorator', () => {
it('should provide a warning message if the condition is not met', () => {
class ConfigVariables {
@AssertOrWarn((object, value) => value > 10, {
@AssertOrWarn((_object, value) => value > 10, {
message: 'Value should be higher than 10',
})
someProperty!: number;
@@ -1,4 +1,4 @@
import { Injectable, Logger } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { authenticator } from 'otplib';
import { TwoFactorAuthenticationStrategy } from 'twenty-shared/types';
@@ -23,8 +23,6 @@ import {
export class TotpStrategy implements OTPAuthenticationStrategyInterface {
public readonly name = TwoFactorAuthenticationStrategy.TOTP;
private readonly logger = new Logger(TotpStrategy.name);
constructor(options?: TOTPStrategyConfig) {
let result: SafeParseReturnType<unknown, TOTPStrategyConfig> | undefined;
@@ -20,10 +20,12 @@ describe('SimpleSecretEncryptionUtil', () => {
{
provide: JwtWrapperService,
useValue: {
generateAppSecret: jest.fn().mockImplementation((type, purpose) => {
// Return different secrets for different purposes to simulate real behavior
return `${mockAppSecret}-${purpose}`;
}),
generateAppSecret: jest
.fn()
.mockImplementation((_type, purpose) => {
// Return different secrets for different purposes to simulate real behavior
return `${mockAppSecret}-${purpose}`;
}),
},
},
],
@@ -4,11 +4,12 @@ import { NestjsQueryGraphQLModule } from '@ptc-org/nestjs-query-graphql';
import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { ApprovedAccessDomainModule } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.module';
import { TokenModule } from 'src/engine/core-modules/auth/token/token.module';
import { DomainManagerModule } from 'src/engine/core-modules/domain-manager/domain-manager.module';
import { FileUploadModule } from 'src/engine/core-modules/file/file-upload/file-upload.module';
import { FileModule } from 'src/engine/core-modules/file/file.module';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { UserWorkspaceResolver } from 'src/engine/core-modules/user-workspace/user-workspace.resolver';
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service';
import { User } from 'src/engine/core-modules/user/user.entity';
import { WorkspaceInvitationModule } from 'src/engine/core-modules/workspace-invitation/workspace-invitation.module';
@@ -18,8 +19,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat
import { UserRoleModule } from 'src/engine/metadata-modules/user-role/user-role.module';
import { TwentyORMModule } from 'src/engine/twenty-orm/twenty-orm.module';
import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module';
import { ApprovedAccessDomainModule } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.module';
import { TokenModule } from 'src/engine/core-modules/auth/token/token.module';
@Module({
imports: [
@@ -46,6 +45,6 @@ import { TokenModule } from 'src/engine/core-modules/auth/token/token.module';
}),
],
exports: [UserWorkspaceService],
providers: [UserWorkspaceService, UserWorkspaceResolver],
providers: [UserWorkspaceService],
})
export class UserWorkspaceModule {}
@@ -1,26 +0,0 @@
import { UseFilters, UseGuards, UsePipes } from '@nestjs/common';
import { Resolver } from '@nestjs/graphql';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { PreventNestToAutoLogGraphqlErrorsFilter } from 'src/engine/core-modules/graphql/filters/prevent-nest-to-auto-log-graphql-errors.filter';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service';
import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
@UseGuards(WorkspaceAuthGuard)
@Resolver(() => UserWorkspace)
@UsePipes(ResolverValidationPipe)
@UseFilters(PreventNestToAutoLogGraphqlErrorsFilter)
export class UserWorkspaceResolver {
constructor(
@InjectRepository(Workspace, 'core')
private readonly workspaceRepository: Repository<Workspace>,
private readonly userWorkspaceService: UserWorkspaceService,
private readonly workspaceInvitationService: WorkspaceInvitationService,
) {}
}
@@ -25,7 +25,6 @@ import {
AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception';
import { AvailableWorkspaces } from 'src/engine/core-modules/auth/dto/available-workspaces.output';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { SignedFileDTO } from 'src/engine/core-modules/file/file-upload/dtos/signed-file.dto';
import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service';
import { OnboardingStatus } from 'src/engine/core-modules/onboarding/enums/onboarding-status.enum';
@@ -85,7 +84,7 @@ export class UserResolver {
private readonly userWorkspaceRepository: Repository<UserWorkspace>,
private readonly userRoleService: UserRoleService,
private readonly permissionsService: PermissionsService,
private readonly featureFlagService: FeatureFlagService,
private readonly workspaceMemberTranspiler: WorkspaceMemberTranspiler,
private readonly userWorkspaceService: UserWorkspaceService,
) {}
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
NotFoundError,
UserInputError,
@@ -37,9 +39,7 @@ export const viewGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -53,9 +53,7 @@ export const viewGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -69,9 +67,7 @@ export const viewGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -85,9 +81,7 @@ export const viewGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -101,9 +95,7 @@ export const viewGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -117,9 +109,7 @@ export const viewGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
NotFoundError,
UserInputError,
@@ -17,9 +19,7 @@ export const webhookGraphqlApiExceptionHandler = (error: Error) => {
userFriendlyMessage: error.userFriendlyMessage,
});
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -42,15 +42,6 @@ describe('workspaceGraphqlApiExceptionHandler', () => {
);
});
it('should throw InternalServerError for unknown WorkspaceExceptionCode', () => {
// @ts-expect-error - should never happen but it allow to test the default case
const error = new WorkspaceException('Unknown error', 'UNKNOWN_CODE');
expect(() => workspaceGraphqlApiExceptionHandler(error)).toThrow(
WorkspaceException,
);
});
it('should throw the original error if it is not a WorkspaceException', () => {
const genericError = new Error('Generic error');
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
ForbiddenError,
@@ -21,9 +23,7 @@ export const workspaceGraphqlApiExceptionHandler = (error: Error) => {
case WorkspaceExceptionCode.WORKSPACE_CUSTOM_DOMAIN_DISABLED:
throw new ForbiddenError(error);
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -3,7 +3,7 @@ import { createParamDecorator, type ExecutionContext } from '@nestjs/common';
import { getRequest } from 'src/utils/extract-request';
export const AuthApiKey = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
(_data: unknown, ctx: ExecutionContext) => {
const request = getRequest(ctx);
return request.apiKey;
@@ -3,7 +3,7 @@ import { type ExecutionContext, createParamDecorator } from '@nestjs/common';
import { getRequest } from 'src/utils/extract-request';
export const AuthUserWorkspaceId = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
(_data: unknown, ctx: ExecutionContext) => {
const request = getRequest(ctx);
return request.userWorkspaceId;
@@ -3,7 +3,7 @@ import { type ExecutionContext, createParamDecorator } from '@nestjs/common';
import { getRequest } from 'src/utils/extract-request';
export const AuthWorkspaceMemberId = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
(_data: unknown, ctx: ExecutionContext) => {
const request = getRequest(ctx);
return request.workspaceMemberId;
@@ -15,7 +15,7 @@ export const FEATURE_FLAG_KEY = 'feature-flag-metadata-args';
export function RequireFeatureFlag(featureFlag: FeatureFlagKey) {
return (
target: object,
propertyKey?: string,
_propertyKey?: string,
descriptor?: PropertyDescriptor,
) => {
TypedReflect.defineMetadata(
@@ -3,7 +3,6 @@ import { Injectable, Logger } from '@nestjs/common';
import { generateText } from 'ai';
import { AiModelRegistryService } from 'src/engine/core-modules/ai/services/ai-model-registry.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable()
export class AgentTitleGenerationService {
@@ -11,7 +10,6 @@ export class AgentTitleGenerationService {
constructor(
private readonly aiModelRegistryService: AiModelRegistryService,
private readonly twentyConfigService: TwentyConfigService,
) {}
async generateThreadTitle(messageContent: string): Promise<string> {
@@ -5,7 +5,6 @@ import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { AgentRoleService } from 'src/engine/metadata-modules/agent-role/agent-role.service';
import { AgentChatService } from 'src/engine/metadata-modules/agent/agent-chat.service';
import { type CreateAgentInput } from 'src/engine/metadata-modules/agent/dtos/create-agent.input';
import { type UpdateAgentInput } from 'src/engine/metadata-modules/agent/dtos/update-agent.input';
import { RoleTargetsEntity } from 'src/engine/metadata-modules/role/role-targets.entity';
@@ -21,7 +20,6 @@ export class AgentService {
private readonly agentRepository: Repository<AgentEntity>,
@InjectRepository(RoleTargetsEntity, 'core')
private readonly roleTargetsRepository: Repository<RoleTargetsEntity>,
private readonly agentChatService: AgentChatService,
private readonly agentRoleService: AgentRoleService,
) {}
@@ -24,7 +24,7 @@ export type FieldMetadataDefaultValueFunctionNames =
(typeof fieldMetadataDefaultValueFunctionName)[keyof typeof fieldMetadataDefaultValueFunctionName];
export class FieldMetadataDefaultValueString {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsQuotedString()
value: string | null;
}
@@ -36,11 +36,11 @@ export class FieldMetadataDefaultValueRawJson {
}
export class FieldMetadataDefaultValueRichTextV2 {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsQuotedString()
blocknote: string | null;
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsQuotedString()
markdown: string | null;
}
@@ -52,52 +52,52 @@ export class FieldMetadataDefaultValueRichText {
}
export class FieldMetadataDefaultValueNumber {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsNumber()
value: number | null;
}
export class FieldMetadataDefaultValueBoolean {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsBoolean()
value: boolean | null;
}
export class FieldMetadataDefaultValueStringArray {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsArray()
@IsQuotedString({ each: true })
value: string[] | null;
}
export class FieldMetadataDefaultValueDateTime {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsDate()
value: Date | null;
}
export class FieldMetadataDefaultValueDate {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsDate()
value: Date | null;
}
export class FieldMetadataDefaultValueCurrency {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsNumberString()
amountMicros: string | null;
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsQuotedString()
currencyCode: string | null;
}
export class FieldMetadataDefaultValueFullName {
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsQuotedString()
firstName: string | null;
@ValidateIf((object, value) => value !== null)
@ValidateIf((_object, value) => value !== null)
@IsQuotedString()
lastName: string | null;
}
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
ForbiddenError,
@@ -33,9 +35,7 @@ export const fieldMetadataGraphqlApiExceptionHandler = (error: Error) => {
case FieldMetadataExceptionCode.LABEL_IDENTIFIER_FIELD_METADATA_ID_NOT_FOUND:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -3,7 +3,6 @@ import {
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { i18n } from '@lingui/core';
import {
@@ -12,10 +11,8 @@ import {
} from '@ptc-org/nestjs-query-graphql';
import { type APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations';
import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { generateMessageId } from 'src/engine/core-modules/i18n/utils/generateMessageId';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { type ObjectStandardOverridesDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-standard-overrides.dto';
import { type UpdateObjectPayload } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
@@ -29,12 +26,7 @@ interface StandardObjectUpdate extends Partial<UpdateObjectPayload> {
export class BeforeUpdateOneObject<T extends UpdateObjectPayload>
implements BeforeUpdateOneHook<T>
{
constructor(
readonly objectMetadataService: ObjectMetadataService,
// TODO: Should not use the repository here
@InjectRepository(FieldMetadataEntity, 'core')
private readonly fieldMetadataRepository: Repository<FieldMetadataEntity>,
) {}
constructor(readonly objectMetadataService: ObjectMetadataService) {}
// TODO: this logic could be moved to a policy guard
async run(
@@ -4,12 +4,12 @@ import { InjectRepository } from '@nestjs/typeorm';
import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm';
import { Repository } from 'typeorm';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { fromCreateObjectInputToFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-create-object-input-to-flat-object-metadata.util';
import { fromFlatObjectMetadataMapsToFlatObjectMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-maps-to-flat-object-metadatas.util';
import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service';
import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.service';
import { WorkspaceMigrationRunnerV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { fromFlatObjectMetadataMapsToFlatObjectMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-maps-to-flat-object-metadatas.util';
import { ObjectMetadataEntity } from './object-metadata.entity';
@@ -20,7 +20,6 @@ export class ObjectMetadataServiceV2 extends TypeOrmQueryService<ObjectMetadataE
constructor(
@InjectRepository(ObjectMetadataEntity, 'core')
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService,
private readonly workspaceMigrationBuilderV2: WorkspaceMigrationBuilderV2Service,
private readonly workspaceMigrationRunnerV2Service: WorkspaceMigrationRunnerV2Service,
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
ForbiddenError,
@@ -31,9 +33,7 @@ export const objectMetadataGraphqlApiExceptionHandler = (error: Error) => {
case ObjectMetadataExceptionCode.MISSING_CUSTOM_OBJECT_DEFAULT_LABEL_IDENTIFIER_FIELD:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -16,8 +16,6 @@ import { WorkspacePermissionsCacheService } from 'src/engine/metadata-modules/wo
export class PermissionFlagService {
constructor(
@InjectRepository(PermissionFlagEntity, 'core')
private readonly permissionFlagRepository: Repository<PermissionFlagEntity>,
@InjectRepository(RoleEntity, 'core')
private readonly roleRepository: Repository<RoleEntity>,
@InjectDataSource('core')
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ForbiddenError,
NotFoundError,
@@ -66,9 +68,7 @@ export const permissionGraphqlApiExceptionHandler = (
case PermissionsExceptionCode.COMPOSITE_TYPE_NOT_FOUND:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
};
@@ -34,7 +34,7 @@ export class ForeignTableService {
) {}
public async fetchForeignTableNamesWithinWorkspace(
workspaceId: string,
_workspaceId: string,
foreignDataWrapperId: string,
): Promise<string[]> {
const mainDataSource =
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
NotFoundError,
@@ -21,9 +23,7 @@ export const remoteTableGraphqlApiExceptionHandler = (error: Error) => {
case RemoteTableExceptionCode.REMOTE_TABLE_ALREADY_EXISTS:
throw new ConflictError(error.message);
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
ForbiddenError,
@@ -24,9 +26,7 @@ export const remoteServerGraphqlApiExceptionHandler = (error: any) => {
case RemoteServerExceptionCode.REMOTE_SERVER_CONNECTION_ERROR:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -17,7 +17,6 @@ import {
type UpdateRoleInput,
type UpdateRolePayload,
} from 'src/engine/metadata-modules/role/dtos/update-role-input.dto';
import { RoleTargetsEntity } from 'src/engine/metadata-modules/role/role-targets.entity';
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
import { UserRoleService } from 'src/engine/metadata-modules/user-role/user-role.service';
import { isArgDefinedIfProvidedOrThrow } from 'src/engine/metadata-modules/utils/is-arg-defined-if-provided-or-throw.util';
@@ -29,8 +28,6 @@ export class RoleService {
private readonly workspaceRepository: Repository<Workspace>,
@InjectRepository(RoleEntity, 'core')
private readonly roleRepository: Repository<RoleEntity>,
@InjectRepository(RoleTargetsEntity, 'core')
private readonly roleTargetsRepository: Repository<RoleTargetsEntity>,
private readonly userRoleService: UserRoleService,
private readonly workspacePermissionsCacheService: WorkspacePermissionsCacheService,
) {}
@@ -1,3 +1,5 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
ForbiddenError,
@@ -24,9 +26,7 @@ export const serverlessFunctionGraphQLApiExceptionHandler = (error: any) => {
case ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_CODE_UNCHANGED:
throw error;
default: {
const _exhaustiveCheck: never = error.code;
throw error;
return assertUnreachable(error.code);
}
}
}
@@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common';
import { EntitySchema } from 'typeorm';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
import { type ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
import { EntitySchemaColumnFactory } from 'src/engine/twenty-orm/factories/entity-schema-column.factory';
@@ -15,7 +14,6 @@ export class EntitySchemaFactory {
constructor(
private readonly entitySchemaColumnFactory: EntitySchemaColumnFactory,
private readonly entitySchemaRelationFactory: EntitySchemaRelationFactory,
private readonly featureFlagService: FeatureFlagService,
) {}
async create(
@@ -1,4 +1,4 @@
import { Injectable, Logger } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
@@ -14,8 +14,6 @@ import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/works
@Injectable()
export class DevSeederService {
private readonly logger = new Logger(DevSeederService.name);
constructor(
private readonly typeORMService: TypeORMService,
private readonly workspaceCacheStorageService: WorkspaceCacheStorageService,
@@ -4,7 +4,6 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Command, CommandRunner, Option } from 'nest-commander';
import { In, Repository } from 'typeorm';
import { WorkspaceService } from 'src/engine/core-modules/workspace/services/workspace.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { getDryRunLogHeader } from 'src/utils/get-dry-run-log-header';
@@ -22,7 +21,6 @@ export class DeleteWorkspacesCommand extends CommandRunner {
private readonly logger = new Logger(DeleteWorkspacesCommand.name);
constructor(
private readonly workspaceService: WorkspaceService,
@InjectRepository(Workspace, 'core')
private readonly workspaceRepository: Repository<Workspace>,
private readonly dataSourceService: DataSourceService,
@@ -2,21 +2,21 @@ import { Injectable } from '@nestjs/common';
import { type EntityManager } from 'typeorm';
import { type FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface';
import {
type WorkspaceHealthColumnIssue,
WorkspaceHealthIssueType,
} from 'src/engine/workspace-manager/workspace-health/interfaces/workspace-health-issue.interface';
import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/workspace-migration-builder/interfaces/workspace-migration-builder-action.interface';
import { type FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { type WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
import { WorkspaceMigrationFieldFactory } from 'src/engine/workspace-manager/workspace-migration-builder/factories/workspace-migration-field.factory';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import {
type FieldMetadataDefaultValueFunctionNames,
fieldMetadataDefaultValueFunctionName,
} from 'src/engine/metadata-modules/field-metadata/dtos/default-value.input';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { type WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
import { WorkspaceMigrationFieldFactory } from 'src/engine/workspace-manager/workspace-migration-builder/factories/workspace-migration-field.factory';
import {
AbstractWorkspaceFixer,
@@ -39,8 +39,8 @@ export class WorkspaceDefaultValueFixer extends AbstractWorkspaceFixer<Workspace
}
async createWorkspaceMigrations(
manager: EntityManager,
objectMetadataCollection: ObjectMetadataEntity[],
_manager: EntityManager,
_objectMetadataCollection: ObjectMetadataEntity[],
issues: WorkspaceHealthColumnIssue<WorkspaceDefaultValueFixerType>[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
if (issues.length <= 0) {
@@ -52,14 +52,14 @@ export class WorkspaceDefaultValueFixer extends AbstractWorkspaceFixer<Workspace
[];
return this.fixColumnDefaultValueConflictIssues(
objectMetadataCollection,
_objectMetadataCollection,
issueNeedingMigration as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_CONFLICT>[],
);
}
async createMetadataUpdates(
manager: EntityManager,
objectMetadataCollection: ObjectMetadataEntity[],
_manager: EntityManager,
_objectMetadataCollection: ObjectMetadataEntity[],
issues: WorkspaceHealthColumnIssue<WorkspaceDefaultValueFixerType>[],
): Promise<CompareEntity<FieldMetadataEntity>[]> {
if (issues.length <= 0) {
@@ -72,7 +72,7 @@ export class WorkspaceDefaultValueFixer extends AbstractWorkspaceFixer<Workspace
[];
return this.fixColumnDefaultValueNotValidIssues(
manager,
_manager,
issueNeedingMetadataUpdate as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_NOT_VALID>[],
);
}
@@ -26,7 +26,7 @@ export class WorkspaceMissingColumnFixer extends AbstractWorkspaceFixer<Workspac
}
async createWorkspaceMigrations(
manager: EntityManager,
_manager: EntityManager,
objectMetadataCollection: ObjectMetadataEntity[],
issues: WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.MISSING_COLUMN>[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
@@ -23,7 +23,7 @@ export class WorkspaceNullableFixer extends AbstractWorkspaceFixer<WorkspaceHeal
}
async createWorkspaceMigrations(
manager: EntityManager,
_manager: EntityManager,
objectMetadataCollection: ObjectMetadataEntity[],
issues: WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_NULLABILITY_CONFLICT>[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
@@ -10,11 +10,11 @@ import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/wo
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { type WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service';
import {
type FieldMetadataUpdate,
WorkspaceMigrationFieldFactory,
} from 'src/engine/workspace-manager/workspace-migration-builder/factories/workspace-migration-field.factory';
import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service';
import { AbstractWorkspaceFixer } from './abstract-workspace.fixer';
@@ -32,7 +32,7 @@ export class WorkspaceTypeFixer extends AbstractWorkspaceFixer<WorkspaceHealthIs
}
async createWorkspaceMigrations(
manager: EntityManager,
_manager: EntityManager,
objectMetadataCollection: ObjectMetadataEntity[],
issues: WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DATA_TYPE_CONFLICT>[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
@@ -5,7 +5,6 @@ import { FieldMetadataType } from 'twenty-shared/types';
import { WorkspaceMigrationBuilderAction } from 'src/engine/workspace-manager/workspace-migration-builder/interfaces/workspace-migration-builder-action.interface';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { generateMigrationName } from 'src/engine/metadata-modules/workspace-migration/utils/generate-migration-name.util';
@@ -30,7 +29,6 @@ export interface FieldMetadataUpdate<
export class WorkspaceMigrationFieldFactory {
constructor(
private readonly workspaceMigrationFactory: WorkspaceMigrationFactory,
private readonly featureFlagService: FeatureFlagService,
) {}
async create(
@@ -1,4 +1,4 @@
import { Injectable, Logger } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { isDefined } from 'twenty-shared/utils';
import { type QueryRunner, TableColumn } from 'typeorm';
@@ -22,8 +22,6 @@ import { removeSqlDDLInjection } from 'src/engine/workspace-manager/workspace-mi
@Injectable()
export class WorkspaceMigrationColumnService {
private readonly logger = new Logger(WorkspaceMigrationColumnService.name);
constructor(
private readonly workspaceMigrationEnumService: WorkspaceMigrationEnumService,
private readonly workspaceMigrationTypeService: WorkspaceMigrationTypeService,
@@ -1,4 +1,4 @@
import { Injectable, Logger } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { type PartialIndexMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface';
import { type WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface';
@@ -15,8 +15,6 @@ import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-syn
@Injectable()
export class StandardIndexFactory {
private readonly logger = new Logger(StandardIndexFactory.name);
create(
standardObjectMetadataDefinitions: (typeof BaseWorkspaceEntity)[],
context: WorkspaceSyncContext,
@@ -17,7 +17,6 @@ import { type PartialFieldMetadata } from 'src/engine/workspace-manager/workspac
import { type PartialIndexMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/partial-index-metadata.interface';
import { type UpdaterOptions } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/updater-options.interface';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types';
import { type FieldMetadataComplexOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
@@ -33,7 +32,7 @@ import { type WorkspaceSyncStorage } from 'src/engine/workspace-manager/workspac
@Injectable()
export class WorkspaceMetadataUpdaterService {
constructor(private readonly featureFlagService: FeatureFlagService) {}
constructor() {}
async updateObjectMetadata(
manager: EntityManager,
@@ -195,7 +195,7 @@ export class WorkspaceSyncFieldMetadataRelationService {
}
private async synchronizeCustomObjectRelationFields(
context: WorkspaceSyncContext,
_context: WorkspaceSyncContext,
customObjectMetadataCollection: ObjectMetadataEntity[],
originalObjectMetadataMapByName: Record<string, ObjectMetadataEntity>,
storage: WorkspaceSyncStorage,
@@ -45,8 +45,6 @@ export class WorkspaceSyncStorage {
// Index metadata
private readonly _indexMetadataCreateCollection: Partial<IndexMetadataEntity>[] =
[];
private readonly _indexMetadataUpdateCollection: Partial<IndexMetadataEntity>[] =
[];
private readonly _indexMetadataDeleteCollection: IndexMetadataEntity[] = [];
constructor() {}
@@ -9,7 +9,7 @@ import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-me
import { createRelationDeterministicUuid } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
export const computeStandardFields = (
context: WorkspaceSyncContext,
_context: WorkspaceSyncContext,
standardFieldMetadataCollection: (
| PartialFieldMetadata
| PartialComputedFieldMetadata
@@ -5,7 +5,6 @@ import { DataSource, QueryFailedError } from 'typeorm';
import { type WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service';
import {
WorkspaceMigrationEntity,
@@ -37,7 +36,6 @@ export class WorkspaceSyncMetadataService {
private readonly workspaceSyncIndexMetadataService: WorkspaceSyncIndexMetadataService,
private readonly workspaceSyncObjectMetadataIdentifiersService: WorkspaceSyncObjectMetadataIdentifiersService,
private readonly workspaceMetadataVersionService: WorkspaceMetadataVersionService,
private readonly featureFlagService: FeatureFlagService,
) {}
/**
@@ -5,11 +5,11 @@ import { type CreateManyResolverArgs } from 'src/engine/api/graphql/workspace-re
import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
import {
type BlocklistItem,
BlocklistValidationService,
} from 'src/modules/blocklist/blocklist-validation-manager/services/blocklist-validation.service';
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
@WorkspaceQueryHook(`blocklist.createMany`)
export class BlocklistCreateManyPreQueryHook
@@ -21,7 +21,7 @@ export class BlocklistCreateManyPreQueryHook
async execute(
authContext: AuthContext,
objectName: string,
_objectName: string,
payload: CreateManyResolverArgs<BlocklistItem>,
): Promise<CreateManyResolverArgs<BlocklistItem>> {
if (!authContext.user?.id) {
@@ -5,11 +5,11 @@ import { type UpdateOneResolverArgs } from 'src/engine/api/graphql/workspace-res
import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
import {
type BlocklistItem,
BlocklistValidationService,
} from 'src/modules/blocklist/blocklist-validation-manager/services/blocklist-validation.service';
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
@WorkspaceQueryHook(`blocklist.updateOne`)
export class BlocklistUpdateOnePreQueryHook
@@ -21,7 +21,7 @@ export class BlocklistUpdateOnePreQueryHook
async execute(
authContext: AuthContext,
objectName: string,
_objectName: string,
payload: UpdateOneResolverArgs<BlocklistItem>,
): Promise<UpdateOneResolverArgs<BlocklistItem>> {
if (!authContext.user?.id) {
@@ -1,4 +1,4 @@
import { Logger, Scope } from '@nestjs/common';
import { Scope } from '@nestjs/common';
import { And, Any, ILike, In, Not, Or } from 'typeorm';
@@ -22,10 +22,6 @@ export type BlocklistItemDeleteCalendarEventsJobData = WorkspaceEventBatch<
scope: Scope.REQUEST,
})
export class BlocklistItemDeleteCalendarEventsJob {
private readonly logger = new Logger(
BlocklistItemDeleteCalendarEventsJob.name,
);
constructor(
private readonly twentyORMManager: TwentyORMManager,
private readonly calendarEventCleanerService: CalendarEventCleanerService,
@@ -27,7 +27,7 @@ export class ConnectedAccountDeleteOnePreQueryHook
async execute(
authContext: AuthContext,
objectName: string,
_objectName: string,
payload: DeleteOneResolverArgs,
): Promise<DeleteOneResolverArgs> {
const connectedAccountId = payload.id;
@@ -1,4 +1,4 @@
import { Logger, Scope } from '@nestjs/common';
import { Scope } from '@nestjs/common';
import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator';
import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator';
@@ -15,10 +15,6 @@ export type MessagingConnectedAccountDeletionCleanupJobData = {
scope: Scope.REQUEST,
})
export class MessagingConnectedAccountDeletionCleanupJob {
private readonly logger = new Logger(
MessagingConnectedAccountDeletionCleanupJob.name,
);
constructor(
private readonly messageCleanerService: MessagingMessageCleanerService,
) {}
@@ -1,4 +1,4 @@
import { Injectable, Logger } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { type ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
import {
@@ -12,7 +12,6 @@ import { isAccessTokenRefreshingError } from 'src/modules/messaging/message-impo
@Injectable()
export class MicrosoftFetchByBatchService {
private readonly logger = new Logger(MicrosoftFetchByBatchService.name);
constructor(
private readonly microsoftClientProvider: MicrosoftClientProvider,
private readonly microsoftHandleErrorService: MicrosoftHandleErrorService,
@@ -89,7 +88,7 @@ export class MicrosoftFetchByBatchService {
* }
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private isTemporaryError(error: any): boolean {
private _isTemporaryError(error: any): boolean {
return error?.body?.includes('Unexpected token < in JSON at position');
}
}
@@ -8,7 +8,6 @@ import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
import { BlocklistRepository } from 'src/modules/blocklist/repositories/blocklist.repository';
import { BlocklistWorkspaceEntity } from 'src/modules/blocklist/standard-objects/blocklist.workspace-entity';
import { EmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/services/email-alias-manager.service';
import { ConnectedAccountRefreshTokensService } from 'src/modules/connected-account/refresh-tokens-manager/services/connected-account-refresh-tokens.service';
import { type ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
import { MessageChannelSyncStatusService } from 'src/modules/messaging/common/services/message-channel-sync-status.service';
import {
@@ -34,7 +33,6 @@ export class MessagingMessagesImportService {
private readonly cacheStorage: CacheStorageService,
private readonly messageChannelSyncStatusService: MessageChannelSyncStatusService,
private readonly saveMessagesAndEnqueueContactCreationService: MessagingSaveMessagesAndEnqueueContactCreationService,
private readonly connectedAccountRefreshTokensService: ConnectedAccountRefreshTokensService,
private readonly messagingMonitoringService: MessagingMonitoringService,
@InjectObjectMetadataRepository(BlocklistWorkspaceEntity)
private readonly blocklistRepository: BlocklistRepository,
@@ -1,4 +1,3 @@
import { Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import snakeCase from 'lodash.snakecase';
@@ -20,10 +19,6 @@ export const MESSAGING_MESSAGE_CHANNEL_SYNC_STATUS_MONITORING_CRON_PATTERN =
@Processor(MessageQueue.cronQueue)
export class MessagingMessageChannelSyncStatusMonitoringCronJob {
private readonly logger = new Logger(
MessagingMessageChannelSyncStatusMonitoringCronJob.name,
);
constructor(
@InjectRepository(Workspace, 'core')
private readonly workspaceRepository: Repository<Workspace>,

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