From 17334f88000383d27a7f7076feb0decb36394c71 Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:58:27 +0200 Subject: [PATCH] Fix undefined read attempt (#11816) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Introduction Followup of https://github.com/twentyhq/twenty/pull/11784 Again some propaganda for the [noUncheckedIndexedAccess](https://www.typescriptlang.org/tsconfig/#noUncheckedIndexedAccess) that involved this @charlesBochet 👀 That's very risky to have this setup to false especially in the backend regarding the twenty-server metadata nature Also suggested that we do some integration testing ( e2e nestsJs tests ) on a related endpoint that could related we always retrieve the same form result output We could also do some unit testing of the method but like the idea to ship it through the api itself --- .../src/engine/twenty-orm/utils/format-result.util.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/format-result.util.ts b/packages/twenty-server/src/engine/twenty-orm/utils/format-result.util.ts index be86c639b..e209d3d19 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/format-result.util.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/format-result.util.ts @@ -1,8 +1,8 @@ import { isPlainObject } from '@nestjs/common/utils/shared.utils'; import { isNonEmptyString } from '@sniptt/guards'; -import { isDefined } from 'class-validator'; import { FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface'; @@ -87,7 +87,9 @@ export function formatResult( for (const [key, value] of Object.entries(data)) { const compositePropertyArgs = compositeFieldMetadataMap.get(key); - const fieldMetadata = objectMetadataItemWithFieldMaps.fieldsByName[key]; + const fieldMetadata = objectMetadataItemWithFieldMaps.fieldsByName[key] as + | FieldMetadataInterface + | undefined; const isRelation = fieldMetadata ? isFieldMetadataInterfaceOfType( @@ -151,7 +153,7 @@ export function formatResult( } } else { if (isRelation) { - if (!fieldMetadata.relationTargetObjectMetadataId) { + if (!isDefined(fieldMetadata?.relationTargetObjectMetadataId)) { throw new Error( `Relation target object metadata ID is missing for field "${key}"`, );