[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

@ -44,7 +44,11 @@ export class CompositeObjectTypeDefinitionFactory {
compositeType: CompositeType,
kind: ObjectTypeDefinitionKind,
options: WorkspaceBuildSchemaOptions,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): GraphQLFieldConfigMap<any, any> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fields: GraphQLFieldConfigMap<any, any> = {};
for (const property of compositeType.properties) {

View File

@ -46,7 +46,11 @@ export class ConnectionTypeDefinitionFactory {
private generateFields(
objectMetadata: ObjectMetadataInterface,
options: WorkspaceBuildSchemaOptions,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): GraphQLFieldConfigMap<any, any> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fields: GraphQLFieldConfigMap<any, any> = {};
const aggregatedFields = this.aggregationTypeFactory.create(objectMetadata);

View File

@ -42,7 +42,11 @@ export class EdgeTypeDefinitionFactory {
private generateFields(
objectMetadata: ObjectMetadataInterface,
options: WorkspaceBuildSchemaOptions,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): GraphQLFieldConfigMap<any, any> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fields: GraphQLFieldConfigMap<any, any> = {};
fields.node = {

View File

@ -103,7 +103,11 @@ export class ExtendObjectTypeDefinitionV2Factory {
private generateFields(
objectMetadata: ObjectMetadataInterface,
options: WorkspaceBuildSchemaOptions,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): GraphQLFieldConfigMap<any, any> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fields: GraphQLFieldConfigMap<any, any> = {};
for (const fieldMetadata of objectMetadata.fields) {

View File

@ -104,7 +104,11 @@ export class ExtendObjectTypeDefinitionFactory {
private generateFields(
objectMetadata: ObjectMetadataInterface,
options: WorkspaceBuildSchemaOptions,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): GraphQLFieldConfigMap<any, any> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fields: GraphQLFieldConfigMap<any, any> = {};
for (const fieldMetadata of objectMetadata.fields) {

View File

@ -63,6 +63,8 @@ export class RootTypeFactory {
});
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private generateFields<T = any, U = any>(
objectMetadataCollection: ObjectMetadataInterface[],
workspaceResolverMethodNames: WorkspaceResolverBuilderMethodNames[],

View File

@ -10,6 +10,7 @@ const isValidStringPosition = (value: string): boolean =>
const isValidNumberPosition = (value: number): boolean =>
typeof value === 'number';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const checkPosition = (value: any): PositionType => {
if (isValidNumberPosition(value) || isValidStringPosition(value)) {
return value;

View File

@ -8,6 +8,7 @@ import { ValidationError } from 'src/engine/core-modules/graphql/utils/graphql-e
const parseLiteral = (
ast: ValueNode,
variables?: Maybe<ObjMap<unknown>>,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): any => {
switch (ast.kind) {
case Kind.STRING:
@ -17,8 +18,10 @@ const parseLiteral = (
case Kind.FLOAT:
return parseFloat(ast.value);
case Kind.OBJECT:
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return parseObject(ast as any, variables);
case Kind.LIST:
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return (ast as any).values.map((n: ValueNode) =>
parseLiteral(n, variables),
);
@ -40,6 +43,7 @@ const parseObject = (
const value = Object.create(null);
if ('fields' in ast) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
ast.fields?.forEach((field: any) => {
value[field.name.value] = parseLiteral(field.value, variables);
});
@ -48,6 +52,7 @@ const parseObject = (
return value;
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const stringify = (value: any): string => {
return JSON.stringify(value);
};

View File

@ -3,6 +3,7 @@ import { validate as uuidValidate } from 'uuid';
import { ValidationError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const checkUUID = (value: any): string => {
if (typeof value !== 'string') {
throw new ValidationError('UUID must be a string');

View File

@ -2,6 +2,7 @@ import { GraphQLScalarType } from 'graphql';
import { InputTypeDefinitionKind } from 'src/engine/api/graphql/workspace-schema-builder/factories/input-type-definition.factory';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export interface ArgMetadata<T = any> {
kind?: InputTypeDefinitionKind;
type?: GraphQLScalarType;

View File

@ -40,6 +40,7 @@ import { RawJSONScalar } from 'src/engine/api/graphql/workspace-schema-builder/g
import { getNumberFilterType } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-number-filter-type.util';
import { getNumberScalarType } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-number-scalar-type.util';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export interface TypeOptions<T = any> {
nullable?: boolean;
isArray?: boolean;

View File

@ -24,8 +24,10 @@ type TypeFactory<T extends InputTypeDefinitionKind | ObjectTypeDefinitionKind> =
options: WorkspaceBuildSchemaOptions,
additionalOptions: {
nullable?: boolean;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
defaultValue?: any;
isArray: boolean;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
settings: any;
isIdField: boolean;
},
@ -43,7 +45,9 @@ export const generateFields = <
typeFactory: TypeFactory<T>,
): T extends InputTypeDefinitionKind
? GraphQLInputFieldConfigMap
: GraphQLFieldConfigMap<any, any> => {
: // eslint-disable-next-line @typescript-eslint/no-explicit-any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
GraphQLFieldConfigMap<any, any> => {
const fields = {};
for (const fieldMetadata of objectMetadata.fields) {