[REQUIRES_FULL_CACHE_FLUSH_WHEN_RELEASED] Refactor FlatEntity to be UniversalFlatEntity superset (#17452)
# Introduction
In this PR we're refactoring the `FlatEntity` type to become a superset
of the `UniversalFlatEntity`.
Right now we're storing all the extra properties in `__universal`
property, at some point it might just be sibling to other entity and we
might rely on the `propertiesToCompare` constants and TypeScript
allowing passing a superset type into a smaller subset type
## FromTo utils
The entity to flat entity method now computes the universal information,
standardized a typing and pattern to do
## Example
Also strictly type
```ts
"bbb019ea-6205-498c-aea5-67bc53bce8a9": {
"workspaceId": "20202020-1c25-4d02-bf25-6aeccf7ea419",
"universalIdentifier": "20202020-d111-4d11-8d11-da5ab0a11002",
"applicationId": "d01b010d-b984-465b-b40b-370e954e5188",
"id": "bbb019ea-6205-498c-aea5-67bc53bce8a9",
"pageLayoutTabId": "791a512f-169f-4209-b731-aa86716668c6",
"title": "Deals by Company",
"type": "GRAPH",
"objectMetadataId": "9e14efea-df5b-4c0e-aba9-cfe455f32397",
"gridPosition": { "row": 0, "column": 6, "rowSpan": 6, "columnSpan": 6 },
"configuration": {
"color": "orange",
"orderBy": "FIELD_ASC",
"timezone": "UTC",
"displayLegend": true,
"displayDataLabel": false,
"showCenterMetric": true,
"configurationType": "PIE_CHART",
"firstDayOfTheWeek": 0,
"aggregateOperation": "COUNT",
"groupBySubFieldName": "name",
"groupByFieldMetadataId": "6673ff18-63d2-47a1-8f85-2b9b09ca27a5",
"aggregateFieldMetadataId": "8d64ee41-5dd4-4de6-945a-7c0c18399715"
},
"createdAt": "2026-01-28T14:08:52.140Z",
"updatedAt": "2026-01-28T14:08:52.140Z",
"deletedAt": null,
"__universal": {
"universalIdentifier": "20202020-d111-4d11-8d11-da5ab0a11002",
"applicationUniversalIdentifier": "20202020-64aa-4b6f-b003-9c74b97cee20",
"pageLayoutTabUniversalIdentifier": "20202020-d011-4d11-8d11-da5ab0a01001",
"objectMetadataUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
"gridPosition": {
"row": 0,
"column": 6,
"rowSpan": 6,
"columnSpan": 6
},
"configuration": {
"color": "orange",
"orderBy": "FIELD_ASC",
"timezone": "UTC",
"displayLegend": true,
"displayDataLabel": false,
"showCenterMetric": true,
"configurationType": "PIE_CHART",
"firstDayOfTheWeek": 0,
"aggregateOperation": "COUNT",
"groupBySubFieldName": "name",
"aggregateFieldMetadataUniversalIdentifier": "20202020-d01a-4131-8a31-f123456789ab",
"groupByFieldMetadataUniversalIdentifier": "20202020-cbac-457e-b565-adece5fc815f"
}
}
},
```
This commit is contained in:
@@ -1,14 +1,11 @@
|
||||
import { type SERIALIZED_RELATION_BRAND } from './SerializedRelation.type';
|
||||
|
||||
type HasSerializedRelationPropertyBrand<T> =
|
||||
typeof SERIALIZED_RELATION_BRAND extends keyof T ? true : false;
|
||||
import { IsSerializedRelation } from "@/types/IsSerializedRelation.type";
|
||||
|
||||
export type ExtractSerializedRelationProperties<T> = T extends unknown
|
||||
? T extends object
|
||||
? {
|
||||
[P in keyof T]-?: [NonNullable<T[P]>] extends [never]
|
||||
? never
|
||||
: HasSerializedRelationPropertyBrand<NonNullable<T[P]>> extends true
|
||||
: IsSerializedRelation<NonNullable<T[P]>> extends true
|
||||
? P
|
||||
: never;
|
||||
}[keyof T]
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
import { SERIALIZED_RELATION_BRAND } from '@/types/SerializedRelation.type';
|
||||
|
||||
export type IsSerializedRelation<T> =
|
||||
typeof SERIALIZED_RELATION_BRAND extends keyof T ? true : false;
|
||||
+16
@@ -66,4 +66,20 @@ type Assertions = [
|
||||
'rel'
|
||||
>
|
||||
>,
|
||||
|
||||
// Types with string index signatures should return never
|
||||
// (string index signatures shouldn't be mistaken for the brand)
|
||||
Expect<
|
||||
Equal<ExtractSerializedRelationProperties<Record<string, string>>, never>
|
||||
>,
|
||||
Expect<
|
||||
Equal<
|
||||
ExtractSerializedRelationProperties<
|
||||
Record<string, { type: string; description?: string }>
|
||||
>,
|
||||
never
|
||||
>
|
||||
>,
|
||||
];
|
||||
|
||||
|
||||
|
||||
@@ -107,6 +107,7 @@ export type { FromTo } from './FromToType';
|
||||
export { HTTPMethod } from './HttpMethod';
|
||||
export type { IsEmptyRecord } from './IsEmptyRecord.type';
|
||||
export type { IsExactly } from './IsExactly';
|
||||
export type { IsSerializedRelation } from './IsSerializedRelation.type';
|
||||
export type { LogicFunctionEvent } from './LogicFunctionEvent';
|
||||
export { MessageParticipantRole } from './MessageParticipantRole';
|
||||
export type { ModifiedProperties } from './ModifiedProperties';
|
||||
|
||||
Reference in New Issue
Block a user