Add default relation to standard object on custom object in manifest (#18033)

add default relation fields when creating an object from an application

---------

Co-authored-by: prastoin <paul@twenty.com>
This commit is contained in:
martmull
2026-02-20 11:49:06 +01:00
committed by GitHub
parent d060c843d1
commit 3bc887e12e
48 changed files with 1812 additions and 554 deletions
@@ -1,3 +1,8 @@
export const DEFAULT_BUILT_HANDLER_PATH = 'src/index.mjs';
export const DEFAULT_SOURCE_HANDLER_PATH = 'src/index.ts';
export const DEFAULT_HANDLER_NAME = 'main';
// Matches a valid JS identifier or dotted member expression
// e.g. "main", "handler", "default.config.handler", "exports.run"
export const HANDLER_NAME_REGEX =
/^[a-zA-Z_$][a-zA-Z0-9_$]*(\.[a-zA-Z_$][a-zA-Z0-9_$]*)*$/;
@@ -3,6 +3,8 @@ import { Field, InputType } from '@nestjs/graphql';
import { IsObject, IsString, Matches } from 'class-validator';
import graphqlTypeJson from 'graphql-type-json';
import { HANDLER_NAME_REGEX } from 'src/engine/metadata-modules/logic-function/constants/handler.contant';
@InputType()
export class LogicFunctionSourceInput {
@IsString()
@@ -14,8 +16,8 @@ export class LogicFunctionSourceInput {
toolInputSchema: object;
@IsString()
@Matches(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/, {
message: 'handlerName must be a valid JavaScript identifier',
@Matches(HANDLER_NAME_REGEX, {
message: 'handlerName must be a valid JavaScript identifier or dotted path',
})
@Field({ nullable: false })
handlerName: string;
@@ -22,6 +22,7 @@ import {
} from 'twenty-shared/application';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { HANDLER_NAME_REGEX } from 'src/engine/metadata-modules/logic-function/constants/handler.contant';
import type { JsonbProperty } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/jsonb-property.type';
@InputType()
@@ -54,8 +55,8 @@ class UpdateLogicFunctionFromSourceInputUpdates {
toolInputSchema?: object;
@IsString()
@Matches(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/, {
message: 'handlerName must be a valid JavaScript identifier',
@Matches(HANDLER_NAME_REGEX, {
message: 'handlerName must be a valid JavaScript identifier or dotted path',
})
@Field({ nullable: true })
@IsOptional()
@@ -1,4 +1,7 @@
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
import {
STANDARD_OBJECTS,
DEFAULT_RELATIONS_OBJECTS_STANDARD_IDS,
} from 'twenty-shared/metadata';
import { FieldMetadataType } from 'twenty-shared/types';
import { capitalize, isDefined } from 'twenty-shared/utils';
@@ -20,14 +23,6 @@ import { STANDARD_OBJECT_ICONS } from 'src/engine/workspace-manager/workspace-mi
import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type';
import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type';
const DEFAULT_RELATIONS_OBJECTS_STANDARD_IDS = [
'timelineActivity',
'favorite',
'attachment',
'noteTarget',
'taskTarget',
] as const satisfies (keyof typeof STANDARD_OBJECTS)[];
const morphIdByRelationObjectNameSingular = {
timelineActivity:
STANDARD_OBJECTS.timelineActivity.morphIds.targetMorphId.morphId,