Files
twenty/packages/twenty-sdk/src/cli/utilities/build/manifest/utils/get-default-object-fields.ts
T
Charles Bochet 0d4fe4575b Various SDK improvements (#18115)
## Summary

- **Refactor frontend metadata loading architecture**: Split the
monolithic `EagerMetadataLoadEffect` into focused provider effects
(`UserMetadataProviderEffect`, `ObjectMetadataProviderEffect`,
`ViewMetadataProviderEffect`) orchestrated by `MetadataProviderEffects`.
Replaced `UserProvider` + `ObjectMetadataItemsProvider` with a single
`MetadataGater` that gates rendering on `isAppMetadataReadyState`. The
metadata store now validates view-object consistency before promoting
views, and `updateDraft` skips no-op updates via deep equality checks.

- **SDK CLI improvements**: Added `app:typecheck` command, improved
error handling in API sync (extracts GraphQL error messages), added
`serializeError` utility for human-readable error output, added `error`
file status to dev mode orchestrator with UI support, and fixed
ClickHouse migration/seed commands to use `transpile-only`.
2026-02-23 19:57:02 +01:00

147 lines
4.0 KiB
TypeScript

import type { ObjectConfig } from '@/sdk/objects/object-config';
import { FieldMetadataType } from 'twenty-shared/types';
import { generateDefaultFieldUniversalIdentifier } from '@/cli/utilities/build/manifest/utils/generate-default-field-universal-identifier';
import { type ObjectFieldManifest } from 'twenty-shared/application';
export const getDefaultObjectFields = (
objectConfig: ObjectConfig,
): ObjectFieldManifest[] => {
const idField: ObjectFieldManifest = {
name: 'id',
label: 'Id',
description: 'Id',
icon: 'Icon123',
isNullable: false,
defaultValue: 'uuid',
type: FieldMetadataType.UUID as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'id',
}),
};
const nameField: ObjectFieldManifest = {
name: 'name',
label: 'Name',
description: 'Name',
icon: 'IconAbc',
isNullable: true,
defaultValue: null,
type: FieldMetadataType.TEXT as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'name',
}),
};
const createdAtField: ObjectFieldManifest = {
name: 'createdAt',
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isNullable: false,
defaultValue: 'now',
type: FieldMetadataType.DATE_TIME as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'createdAt',
}),
};
const updatedAtField: ObjectFieldManifest = {
name: 'updatedAt',
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isNullable: false,
defaultValue: 'now',
type: FieldMetadataType.DATE_TIME as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'updatedAt',
}),
};
const deletedAtField: ObjectFieldManifest = {
name: 'deletedAt',
label: 'Deleted at',
description: 'Deletion date',
icon: 'IconCalendarClock',
isNullable: true,
defaultValue: null,
type: FieldMetadataType.DATE_TIME as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'deletedAt',
}),
};
const createdByField: ObjectFieldManifest = {
name: 'createdBy',
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isNullable: false,
defaultValue: { name: "''", source: "'MANUAL'" },
type: FieldMetadataType.ACTOR as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'createdBy',
}),
};
const updatedByField: ObjectFieldManifest = {
name: 'updatedBy',
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isNullable: false,
defaultValue: { name: "''", source: "'MANUAL'" },
type: FieldMetadataType.ACTOR as const,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'updatedBy',
}),
};
const positionField: ObjectFieldManifest = {
name: 'position',
label: 'Position',
description: 'Position',
icon: 'IconHierarchy2',
isNullable: false,
defaultValue: 0,
type: FieldMetadataType.POSITION,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'position',
}),
};
const searchVectorField: ObjectFieldManifest = {
name: 'searchVector',
label: 'Search vector',
icon: 'IconSearch',
description: 'Search vector',
isNullable: true,
defaultValue: null,
type: FieldMetadataType.TS_VECTOR,
universalIdentifier: generateDefaultFieldUniversalIdentifier({
objectConfig,
fieldName: 'searchVector',
}),
};
return [
idField,
nameField,
createdAtField,
updatedAtField,
deletedAtField,
createdByField,
updatedByField,
positionField,
searchVectorField,
];
};