[QRQC_2] No explicit any in twenty-server (#12068)

# Introduction

Added a no-explicit-any rule to the twenty-server, not applicable to
tests and integration tests folder

Related to https://github.com/twentyhq/core-team-issues/issues/975
Discussed with Charles

## In case of conflicts
Until this is approved I won't rebased and handle conflict, just need to
drop two latest commits and re run the scripts etc

## Legacy
We decided not to handle the existing lint error occurrences and
programmatically ignored them through a disable next line rule comment

## Open question
We might wanna activate the
[no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any/)
`ignoreRestArgs` for our use case ?
```
    ignoreRestArgs?: boolean;
```

---------

Co-authored-by: etiennejouan <jouan.etienne@gmail.com>
This commit is contained in:
Paul Rastoin
2025-05-15 16:26:38 +02:00
committed by GitHub
parent c95c4383b4
commit a8423e8503
213 changed files with 453 additions and 4 deletions

View File

@ -47,6 +47,7 @@ registerEnumType(FieldMetadataType, {
@ObjectType('Field')
@Authorize({
// eslint-disable-next-line @typescript-eslint/no-explicit-any
authorize: (context: any) => ({
workspaceId: { eq: context?.req?.workspace?.id },
}),

View File

@ -69,6 +69,8 @@ export class FieldMetadataValidationService<
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private async validateSettings(validator: any, settings: any) {
try {
const settingsInstance = plainToInstance(validator, settings);
@ -77,6 +79,7 @@ export class FieldMetadataValidationService<
} catch (error) {
const errorMessages = Array.isArray(error)
? error
// eslint-disable-next-line @typescript-eslint/no-explicit-any
.map((err: any) => Object.values(err.constraints))
.flat()
.join(', ')

View File

@ -530,9 +530,9 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
};
if ('standardOverrides' in fieldMetadataInput) {
updatableStandardFieldInput.standardOverrides = (
fieldMetadataInput as any
).standardOverrides;
updatableStandardFieldInput.standardOverrides =
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(fieldMetadataInput as any).standardOverrides;
}
if (

View File

@ -270,6 +270,7 @@ export class BeforeUpdateOneField<T extends UpdateFieldInput>
// Reset the override by setting it to null
const localeTranslations = update.standardOverrides.translations[locale];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(localeTranslations as Record<string, any>)[overrideKey] = null;
return true;
@ -325,6 +326,7 @@ export class BeforeUpdateOneField<T extends UpdateFieldInput>
const localeTranslations = update.standardOverrides.translations[locale];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(localeTranslations as Record<string, any>)[overrideKey] = value;
}

View File

@ -7,6 +7,7 @@ import { fieldMetadataGraphqlApiExceptionHandler } from 'src/engine/metadata-mod
export class FieldMetadataGraphqlApiExceptionInterceptor
implements NestInterceptor
{
// eslint-disable-next-line @typescript-eslint/no-explicit-any
intercept(_: ExecutionContext, next: CallHandler): Observable<any> {
return next
.handle()

View File

@ -8,6 +8,7 @@ export const assertDoesNotNullifyDefaultValueForNonNullableField = ({
defaultValueFromUpdate,
}: {
isNullable: boolean;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
defaultValueFromUpdate?: any;
}) => {
if (!isNullable && defaultValueFromUpdate === null) {

View File

@ -2,6 +2,7 @@ import { FieldMetadataDefaultSerializableValue } from 'src/engine/metadata-modul
export const unserializeDefaultValue = (
serializedDefaultValue: FieldMetadataDefaultSerializableValue,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): any => {
if (serializedDefaultValue === null) {
return null;

View File

@ -73,6 +73,7 @@ export const validateDefaultValueForType = (
};
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const validators = defaultValueValidatorsMap[type] as any[];
if (!validators) {
@ -88,6 +89,7 @@ export const validateDefaultValueForType = (
: { value: defaultValue };
const defaultValueInstance = plainToInstance<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
any,
FieldMetadataClassValidation
>(validator, conputedDefaultValue as FieldMetadataClassValidation);

View File

@ -59,6 +59,7 @@ export const validateOptionsForType = (
const isValid = options.every((option) => {
return validators.some((validator) => {
const optionsInstance = plainToInstance<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
any,
FieldMetadataDefaultOption | FieldMetadataComplexOption
>(validator, option);

View File

@ -12,6 +12,7 @@ export function IsQuotedString(validationOptions?: ValidationOptions) {
propertyName: propertyName,
options: validationOptions,
validator: {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
validate(value: any) {
return typeof value === 'string' && /^'{1}.*'{1}$/.test(value);
},

View File

@ -14,6 +14,7 @@ export function IsValidGraphQLEnumName(validationOptions?: ValidationOptions) {
propertyName: propertyName,
options: validationOptions,
validator: {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
validate(value: any) {
return typeof value === 'string' && graphQLEnumNameRegex.test(value);
},