[BREAKING-CHANGE] Centralize system View viewField side effect (#23081)

# Introduction

Closes https://github.com/twentyhq/core-team-issues/issues/2669

Part of the `isSystemSideEffect` engine-ownership effort. Until now, a
custom object's default **INDEX** table view (`All {objectLabelPlural}`)
and its view fields were built imperatively in `ObjectMetadataService`
with random `v4()` identifiers, while `twenty-standard` authored its own
copies with hardcoded literals. The two never converged, an object
rename could drift the view, and nothing marked these rows as
engine-owned.

This PR makes the metadata side-effect engine the **single owner** of
the INDEX view and its view fields, on name-free deterministic
identifiers, for custom and standard objects alike.

## Core design

- **Name-free deterministic identity.** The INDEX view identifier
derives from `object identifier + ViewKey.INDEX`
(`getSystemViewUniversalIdentifier`); each view-field identifier derives
from `view identifier + field identifier`
(`getViewFieldUniversalIdentifier`). An object rename (with a pinned
object identifier) keeps the same view, losslessly.
- **`isSystemSideEffect: true` is provenance.** Every INDEX view / view
field the engine emits is flagged system-owned, so manifest deletion
inference never drops it. The flag follows the view: a view field
inherits its parent view's flag.
- **The engine is the sole owner of the INDEX view.** It always emits
it; a caller providing one with the same derived identifier is a genuine
conflict surfaced by the engine's reserved-identifier collision, not
silently deferred.

## Changes

### Shared (`twenty-shared`)

- `getIndexViewUniversalIdentifier` →
`getSystemViewUniversalIdentifier`, now taking a `viewKey` (generalizes
to any singleton engine-owned view).
- Standard field identifiers extracted into a new
`STANDARD_OBJECT_FIELDS` constant, so both an object's `fields` and its
INDEX view read the same field identifiers.
- `buildStandardObjectIndexView` derives the standard INDEX view +
view-field identifiers from `STANDARD_OBJECT_FIELDS`, replacing the
hardcoded literals in `standard-object.constant.ts`.

### Metadata side-effect engine (custom objects)

- **`objectSystemFieldsAndIndexViewOnCreate`** (replaces
`objectSystemFieldsOnCreate`): on object creation, provisions the 7
reserved system fields **and** the INDEX view with one view field per
displayable system field, all `isSystemSideEffect: true`.
- **`fieldIndexViewFieldOnCreate`** (new): on field creation, provisions
the field's INDEX view field. Object created in the same batch →
visible, positioned before the system view fields; pre-existing object →
hidden, appended (preserving the historical `createOneField` behavior).
Both branches resolve the INDEX view by its derived identifier (single
map access, never a scan).
- **`fieldSystemViewFieldsOnDelete`** (new): on field deletion,
cascade-deletes every engine-owned view field displaying it.
- **`objectSystemSideEffectsOnDelete`** (extended): now also
cascade-deletes the object's engine-owned views and their view fields
(in addition to system fields, indexes, searchFieldMetadata). Every
lookup walks a foreign-key aggregator down from the deleted object, so
the work is proportional to what the object owns, never to workspace
size.
- Object-create and field-create positions are derived from the same
caller-input field list, so the INDEX view layout is contiguous with no
handler-ordering dependency.
- `view` / `viewField` added to the side-effect companion metadata names
for `fieldMetadata` and `objectMetadata`.

### Reserved-identifier invariant

A caller can never define an entity whose identifier collides with one a
system side effect produces: caller inputs are forced
`isSystemSideEffect: false` at every entry point (API and app-manifest
transpilers), and the engine raises
`RESERVED_SYSTEM_UNIVERSAL_IDENTIFIER`, aborting the operation, when a
system emission lands on a caller-claimed identifier. Covered by a new
engine-level test.

### Caller-side provisioning removed

The imperative INDEX view + view-field provisioning is removed from
`ObjectMetadataService.createOneObject`. The record-page `FIELDS_WIDGET`
view is intentionally left caller-side and deferred to the follow-up
(see below).

### `twenty-standard` convergence

Standard INDEX views and their view fields converge on the same
derived-identifier + `isSystemSideEffect: true` scheme as the engine.
`twenty-standard` syncs through the from/to migration path (which never
runs the side-effect engine), so it authors this INDEX surface itself,
matching what the engine produces for custom objects.

## Rollout

Two `2.26.0` workspace commands, running after the `2.25`
messageCampaign commands:

- `upgrade:2-26:reconcile-index-view-universal-identifier` re-owns the
INDEX views of the **twenty-standard and workspace-custom applications**
and all their view fields to the derived identifiers with
`isSystemSideEffect: true`, in a single per-workspace transaction. Each
view field identifier is keyed on the application of the **displayed
field** (an app or user column on a standard INDEX view converges too).
Soft-deleted views and view fields are skipped: one can coexist with an
active successor on the same derivation inputs and both would derive the
same identifier. Children reference the view by primary key, so the
re-own is lossless.
- `upgrade:2-26:demote-and-backfill-application-index-view` handles
**manifest-installed applications**, which never had their INDEX view
auto-provisioned: every caller-authored INDEX view of another
application is demoted to `key: null` (a plain additional view under its
manifest identifier), then every application object gets the
engine-owned INDEX view and its full view-field layout backfilled
through the migration pipeline's legacy path (no side-effect expansion),
views committed before view fields across applications since a view
field belongs to the application owning its field. Idempotent and
retry-safe: engine-owned INDEX views are neither demoted nor
re-backfilled, and view creation and view-field creation are gated
independently, so a retry after a partial failure still backfills the
missing view fields of an already-committed view.

Both support `--dry-run` and invalidate the full flat-maps closure
(parents aggregate the re-owned identifiers, children resolve them as
universal foreign keys, and page-layout widget universal configurations
resolve view PKs at cache-build time).

The `2.25` `upgrade:2-25:add-message-campaign-name-field` command is
adapted to resolve the campaign INDEX view by its INDEX key on the
object instead of by universal identifier: it now runs before the
reconcile, on workspaces still holding legacy identifiers.

## ⚠️ Breaking change

This PR **mutates 187 previously hardcoded universal identifiers** — the
standard objects' INDEX views and their view fields (the literals
removed from `standard-object.constant.ts`), now derived.

- **Handled by the `2.26` commands above** for all existing workspaces.
- **The INDEX key is now engine-reserved.** The flat view validator
rejects caller-created INDEX views (API and manifest inputs are forced
`isSystemSideEffect: false`) and enforces a single non-deleted INDEX
view per object; `view.key` is no longer a comparable/updatable
property, so no writer can promote or demote a view after creation.
`ViewManifest.key` is deprecated and ignored (manifest views are always
additional views, so old apps keep syncing and demoted views are not
promoted back); the REST/GraphQL create path now rejects `key: INDEX`.
In-repo example apps (`hello-world`, `document-generator`) no longer
declare it.
- **12 declared-but-never-seeded standard INDEX view field identifiers
deleted** (the former `preservedViewFields` on `timelineActivity`,
`workflowRun` and `workspaceMember`): after the reconcile, no workspace
row references them.
- **`computeFlatViewFieldsToCreate` now derives view field identifiers**
instead of drawing `v4()` ones, which also changes what the committed
`1-23` record-page backfill produces going forward (deliberate,
documented in-code).
- **Record-page views and view fields are not affected** (identifiers
unchanged).
- **In-repo apps: `twenty-last-contact` updated.** It was the only app
declaring explicit INDEX view fields (10 columns across `allPeople` /
`allCompanies` / `allOpportunities`) through manifest `viewFields`.
Those target identifiers are now engine-owned and derived, so the
manifest inputs no longer resolve and install failed with `View not
found`. The app now declares only its fields; the engine's
`fieldIndexViewFieldOnCreate` provisions the matching INDEX view field
automatically. No other app under `packages/twenty-apps` references any
of the 187 mutated identifiers, and apps that target standard views
point at record-page views (e.g. `real-estate` →
`opportunityRecordPageFields`) or their own objects (`twenty-partners`),
all unchanged.

### Loss of granularity for app maintainers

The engine now owns the INDEX view field of every field a caller adds to
an object, so app maintainers lose direct control over those columns.
Previously an app could target the engine-owned INDEX view with an
explicit manifest `viewField` and set its `position` and `isVisible`.
Now `fieldIndexViewFieldOnCreate` appends a **hidden** view field in
caller-input order on field creation, so:

- Columns an app previously showed at a **dedicated position** and
**visible** (e.g. `twenty-last-contact`'s last-contact columns) become
**hidden** and **appended in input order** after install.
- There is currently **no manifest way to override** the
engine-provisioned INDEX view field's position, visibility, or size.

This is a deliberate regression accepted for the sake of
single-ownership, and app maintainers should expect their INDEX columns
to move/hide after upgrading. A follow-up override API will let
maintainers reclaim per-field control over the engine-provisioned INDEX
view field.

## Testing

- Unit specs for each handler: object create (system fields + INDEX
view/view fields, override, position offset), field create (same-batch
vs existing-object, non-displayable noop, no-INDEX-view noop), field
delete, object delete (fields/indexes/searchFieldMetadata/views/view
fields cascade, reverse-relation view field on another object).
- Engine-level test for the reserved-identifier collision.
- `twenty-standard` guard test that its INDEX views/view fields stay on
the derived scheme and stay system-owned.
- Integration test: full engine provisioning of the INDEX view/view
fields on object creation, same view id preserved across an object
rename, and cascade delete on object deletion.

## Follow-up

The full record-page stack (record-page view, its view fields, view
field groups, page layout / tab / widget) is still built imperatively
and moves into the engine in
https://github.com/twentyhq/core-team-issues/issues/2721.
This commit is contained in:
Paul Rastoin
2026-07-29 15:32:21 +02:00
committed by GitHub
parent a0281f635b
commit 0c545bcdeb
92 changed files with 7794 additions and 3428 deletions
@@ -0,0 +1,15 @@
import { getFieldsWidgetViewUniversalIdentifier } from '@/application/deterministic-identifier/get-fields-widget-view-universal-identifier.util';
const APP = '11111111-1111-4111-8111-111111111111';
const WIDGET = '88888888-8888-4888-8888-888888888888';
describe('getFieldsWidgetViewUniversalIdentifier', () => {
it('derives a deterministic id from its 1:1 FIELDS page-layout widget', () => {
expect(
getFieldsWidgetViewUniversalIdentifier({
applicationUniversalIdentifier: APP,
pageLayoutWidgetUniversalIdentifier: WIDGET,
}),
).toBe('5f45a1bd-97df-56f7-a8ad-7839ef0045b5');
});
});
@@ -0,0 +1,17 @@
import { getSystemViewUniversalIdentifier } from '@/application/deterministic-identifier/get-system-view-universal-identifier.util';
import { ViewKey } from '@/types/ViewKey';
const APP = '11111111-1111-4111-8111-111111111111';
const OBJECT = '22222222-2222-4222-8222-222222222222';
describe('getSystemViewUniversalIdentifier', () => {
it('derives a deterministic id from the stable INDEX view key within its object', () => {
expect(
getSystemViewUniversalIdentifier({
applicationUniversalIdentifier: APP,
objectUniversalIdentifier: OBJECT,
viewKey: ViewKey.INDEX,
}),
).toBe('3803a536-0158-554c-bfb4-e5492323e57f');
});
});
@@ -1,12 +1,7 @@
import {
getFieldsWidgetViewUniversalIdentifier,
getIndexViewUniversalIdentifier,
getViewUniversalIdentifier,
} from '@/application/deterministic-identifier/get-view-universal-identifier.util';
import { getViewUniversalIdentifier } from '@/application/deterministic-identifier/get-view-universal-identifier.util';
const APP = '11111111-1111-4111-8111-111111111111';
const OBJECT = '22222222-2222-4222-8222-222222222222';
const WIDGET = '88888888-8888-4888-8888-888888888888';
describe('getViewUniversalIdentifier', () => {
it('derives a deterministic id from the view name within its object', () => {
@@ -19,25 +14,3 @@ describe('getViewUniversalIdentifier', () => {
).toBe('125140c3-eca9-560d-9020-dad4ac1ebab6');
});
});
describe('getIndexViewUniversalIdentifier', () => {
it('derives a deterministic id from the stable INDEX view key within its object', () => {
expect(
getIndexViewUniversalIdentifier({
applicationUniversalIdentifier: APP,
objectUniversalIdentifier: OBJECT,
}),
).toBe('3803a536-0158-554c-bfb4-e5492323e57f');
});
});
describe('getFieldsWidgetViewUniversalIdentifier', () => {
it('derives a deterministic id from its 1:1 FIELDS page-layout widget', () => {
expect(
getFieldsWidgetViewUniversalIdentifier({
applicationUniversalIdentifier: APP,
pageLayoutWidgetUniversalIdentifier: WIDGET,
}),
).toBe('5f45a1bd-97df-56f7-a8ad-7839ef0045b5');
});
});
@@ -0,0 +1,14 @@
import { computeDeterministicUuid } from '@/application/deterministic-identifier/compute-deterministic-uuid.util';
export const getFieldsWidgetViewUniversalIdentifier = ({
applicationUniversalIdentifier,
pageLayoutWidgetUniversalIdentifier,
}: {
applicationUniversalIdentifier: string;
pageLayoutWidgetUniversalIdentifier: string;
}): string =>
computeDeterministicUuid({
entityNamespace: 'view',
value: pageLayoutWidgetUniversalIdentifier,
applicationUniversalIdentifier,
});
@@ -0,0 +1,17 @@
import { computeDeterministicUuid } from '@/application/deterministic-identifier/compute-deterministic-uuid.util';
import { type ViewKey } from '@/types/ViewKey';
export const getSystemViewUniversalIdentifier = ({
applicationUniversalIdentifier,
objectUniversalIdentifier,
viewKey,
}: {
applicationUniversalIdentifier: string;
objectUniversalIdentifier: string;
viewKey: ViewKey;
}): string =>
computeDeterministicUuid({
entityNamespace: 'view',
value: `${objectUniversalIdentifier}:${viewKey}`,
applicationUniversalIdentifier,
});
@@ -1,7 +1,5 @@
import { computeDeterministicUuid } from '@/application/deterministic-identifier/compute-deterministic-uuid.util';
import { ViewKey } from '@/types/ViewKey';
// A view is identified by its name within its object.
export const getViewUniversalIdentifier = ({
applicationUniversalIdentifier,
objectUniversalIdentifier,
@@ -16,33 +14,3 @@ export const getViewUniversalIdentifier = ({
value: `${objectUniversalIdentifier}:${name}`,
applicationUniversalIdentifier,
});
// The INDEX view is an object's singleton main table view; its name is
// server-generated, so it is keyed by the stable INDEX view key.
export const getIndexViewUniversalIdentifier = ({
applicationUniversalIdentifier,
objectUniversalIdentifier,
}: {
applicationUniversalIdentifier: string;
objectUniversalIdentifier: string;
}): string =>
computeDeterministicUuid({
entityNamespace: 'view',
value: `${objectUniversalIdentifier}:${ViewKey.INDEX}`,
applicationUniversalIdentifier,
});
// A fields-widget view is 1:1 with its FIELDS page-layout widget, so it is keyed
// by that widget's deterministic universalIdentifier (its name is server-generated).
export const getFieldsWidgetViewUniversalIdentifier = ({
applicationUniversalIdentifier,
pageLayoutWidgetUniversalIdentifier,
}: {
applicationUniversalIdentifier: string;
pageLayoutWidgetUniversalIdentifier: string;
}): string =>
computeDeterministicUuid({
entityNamespace: 'view',
value: pageLayoutWidgetUniversalIdentifier,
applicationUniversalIdentifier,
});
@@ -54,6 +54,7 @@ export {
export { getConnectionProviderUniversalIdentifier } from './deterministic-identifier/get-connection-provider-universal-identifier.util';
export { getFieldPermissionUniversalIdentifier } from './deterministic-identifier/get-field-permission-universal-identifier.util';
export { getFieldUniversalIdentifier } from './deterministic-identifier/get-field-universal-identifier.util';
export { getFieldsWidgetViewUniversalIdentifier } from './deterministic-identifier/get-fields-widget-view-universal-identifier.util';
export { getFrontComponentUniversalIdentifier } from './deterministic-identifier/get-front-component-universal-identifier.util';
export { getIndexUniversalIdentifier } from './deterministic-identifier/get-index-universal-identifier.util';
export { getLogicFunctionUniversalIdentifier } from './deterministic-identifier/get-logic-function-universal-identifier.util';
@@ -79,16 +80,13 @@ export { getSearchFieldUniversalIdentifier } from './deterministic-identifier/ge
export { getSelectOptionUniversalIdentifier } from './deterministic-identifier/get-select-option-universal-identifier.util';
export { getSkillUniversalIdentifier } from './deterministic-identifier/get-skill-universal-identifier.util';
export { getSystemRelationFieldUniversalIdentifier } from './deterministic-identifier/get-system-relation-field-universal-identifier.util';
export { getSystemViewUniversalIdentifier } from './deterministic-identifier/get-system-view-universal-identifier.util';
export { getViewFieldGroupUniversalIdentifier } from './deterministic-identifier/get-view-field-group-universal-identifier.util';
export { getViewFieldUniversalIdentifier } from './deterministic-identifier/get-view-field-universal-identifier.util';
export { getViewFilterUniversalIdentifier } from './deterministic-identifier/get-view-filter-universal-identifier.util';
export { getViewGroupUniversalIdentifier } from './deterministic-identifier/get-view-group-universal-identifier.util';
export { getViewSortUniversalIdentifier } from './deterministic-identifier/get-view-sort-universal-identifier.util';
export {
getViewUniversalIdentifier,
getIndexViewUniversalIdentifier,
getFieldsWidgetViewUniversalIdentifier,
} from './deterministic-identifier/get-view-universal-identifier.util';
export { getViewUniversalIdentifier } from './deterministic-identifier/get-view-universal-identifier.util';
export { SyncableEntity } from './enums/syncable-entities.enum';
export type {
RegularFieldManifest,
@@ -68,6 +68,11 @@ export type ViewManifest = SyncableEntityOptions & {
name: string;
objectUniversalIdentifier: string;
type?: ViewType;
/**
* @deprecated The INDEX key is reserved for the engine-owned default view,
* which the server provisions automatically for every object. This field is
* ignored: manifest views are always created as additional views.
*/
key?: ViewKey;
icon?: string;
position?: number;
@@ -93,40 +93,40 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-bd3d-4c60-8dca-571c71d4447a",
"views": {
"allAttachments": {
"universalIdentifier": "3f7f3363-7087-44cc-902d-5e8904262316",
"universalIdentifier": "e0c5bfc8-2aa8-5407-9d7e-f374055914b2",
"viewFields": {
"createdAt": {
"universalIdentifier": "6c092c26-b1cb-488f-ae2e-5af4bec1162b",
"universalIdentifier": "cd0ab629-435f-5d59-9b14-1d2ee00954d8",
},
"createdBy": {
"universalIdentifier": "fa363372-0fdf-4bb3-bdf1-0ead354b9225",
"universalIdentifier": "9c0456cf-ab42-596b-b381-048cf5718117",
},
"file": {
"universalIdentifier": "873cf114-5477-4b62-9023-7ea6ad69fbe5",
"universalIdentifier": "2c641732-02a0-5aeb-9262-ff60973b7cf2",
},
"name": {
"universalIdentifier": "be56712f-d7a6-4fbe-b92b-d750f0708a0a",
"universalIdentifier": "d5a4f58e-abf1-52ce-a315-ea7b18e4a946",
},
"targetCompany": {
"universalIdentifier": "b335ad04-059e-4c36-8666-f40431849044",
"universalIdentifier": "7f76f6c5-078d-5064-89b4-e0042ee4e169",
},
"targetDashboard": {
"universalIdentifier": "bcc6d6e1-7c0b-4291-9270-66e42024d8dd",
"universalIdentifier": "4f1ae4ae-c1c9-5b2c-8f6f-9435171fca48",
},
"targetNote": {
"universalIdentifier": "fc8dba49-bcf2-41b8-a435-0c4a3bbf2af6",
"universalIdentifier": "6e24a74a-6d3d-54ce-afd0-7c55daf79d81",
},
"targetOpportunity": {
"universalIdentifier": "15f2d457-dc09-4c52-bf2a-47083d6bf017",
"universalIdentifier": "4e0a4cf7-8e45-5688-90a6-da6d67544f72",
},
"targetPerson": {
"universalIdentifier": "73a4c3a7-c7f9-4ed6-a2b6-117d7efad0f3",
"universalIdentifier": "8cff29b2-23e8-5190-93da-f1b22faea495",
},
"targetTask": {
"universalIdentifier": "c2913c5e-6cc6-438d-9c2f-3212a9b2a82b",
"universalIdentifier": "cc9c44ea-c27e-5f57-9094-85cf14dae3e2",
},
"targetWorkflow": {
"universalIdentifier": "11fcf58b-dbab-42dd-be67-689462111070",
"universalIdentifier": "75d1d092-412f-57b1-9e74-e3f8285a3f0c",
},
},
},
@@ -173,16 +173,16 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-0408-4f38-b8a8-4d5e3e26e24d",
"views": {
"allBlocklists": {
"universalIdentifier": "5a98e88c-67c2-4f61-a5ab-a0d3d6a836bb",
"universalIdentifier": "2ee7be0b-4112-5543-9f29-04c933fd4f98",
"viewFields": {
"createdAt": {
"universalIdentifier": "e7cfcf05-2676-4d43-9eee-4da1016b12ff",
"universalIdentifier": "fc86c1d0-a6f1-58c4-b32c-ddbffdeda2da",
},
"handle": {
"universalIdentifier": "155ae00d-0def-4f62-9473-8a8efa209eee",
"universalIdentifier": "07282d15-ed89-5504-9904-cd242125e9f2",
},
"workspaceMember": {
"universalIdentifier": "05a2f0b9-f2ef-4729-bc42-9e2ad2a34fb2",
"universalIdentifier": "20253618-79e4-57e8-b18f-f506657d5132",
},
},
},
@@ -260,19 +260,19 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-491b-4aaa-9825-afd1bae6ae00",
"views": {
"allCalendarChannelEventAssociations": {
"universalIdentifier": "001893be-c06c-4ba1-9f18-53bd26f0179f",
"universalIdentifier": "66887c1c-c33a-52b6-8dd1-0714e504ffec",
"viewFields": {
"calendarChannelId": {
"universalIdentifier": "e3adffd2-d820-4c89-912c-34908d90057e",
"universalIdentifier": "6504f7e7-3a66-54b2-adc1-53d90fc7d9e3",
},
"calendarEvent": {
"universalIdentifier": "35656a84-ecb8-4075-a610-8b538d6f8120",
"universalIdentifier": "9be9bb56-f65d-53ee-a6e6-4d01a6e9cb58",
},
"createdAt": {
"universalIdentifier": "8ca74f2f-210b-4afc-81f0-506047400e82",
"universalIdentifier": "2ee9fd11-c7a6-54c8-af41-572ed8cecbd7",
},
"eventExternalId": {
"universalIdentifier": "f779d7e8-f1d8-44a7-b0ef-4409c9b6b466",
"universalIdentifier": "55ea0442-7664-5da2-bc21-d02e101acdcc",
},
},
},
@@ -382,31 +382,31 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
"views": {
"allCalendarEvents": {
"universalIdentifier": "20202020-c001-4c01-8c01-ca1ebe0ca001",
"universalIdentifier": "d581f9a1-1546-5eef-b5a4-4c7a088dc6fa",
"viewFields": {
"conferenceLink": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf06",
"universalIdentifier": "caee37ae-989a-5d95-ad26-e42530d5a65c",
},
"createdAt": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf08",
"universalIdentifier": "0a502413-f875-5c1d-aa60-93e6f412568e",
},
"endsAt": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf03",
"universalIdentifier": "65fbb3d7-e21c-52f6-a90c-38a424d05284",
},
"isCanceled": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf07",
"universalIdentifier": "ef47c862-92b5-5d72-8e3c-7806244b0a70",
},
"isFullDay": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf04",
"universalIdentifier": "b3f5e6c6-80bf-5ef3-b8d7-1bc521ef8054",
},
"location": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf05",
"universalIdentifier": "ac181cfc-c9cb-50f5-89eb-19c01615b0dc",
},
"startsAt": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf02",
"universalIdentifier": "38902ac0-92dd-5889-bcc2-0e3956a7f18d",
},
"title": {
"universalIdentifier": "20202020-cf01-4c01-8c01-ca1ebe0caf01",
"universalIdentifier": "292e2bd9-118e-56a2-bafc-e182f4f323a7",
},
},
},
@@ -523,31 +523,31 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-a1c3-47a6-9732-27e5b1e8436d",
"views": {
"allCalendarEventParticipants": {
"universalIdentifier": "5228d634-6b69-4a43-be5c-e778fa6fe779",
"universalIdentifier": "23b1277b-8859-54ea-9106-9e6d43e5adc4",
"viewFields": {
"calendarEvent": {
"universalIdentifier": "d9c2f346-b83b-48ae-98d0-e344f97248cd",
"universalIdentifier": "5ef7cac8-d293-559f-88a7-5a4d0234c4c5",
},
"createdAt": {
"universalIdentifier": "63d9d40d-e40c-410c-a14c-2f36c64c3e69",
"universalIdentifier": "41f8cf98-cd93-500d-9b9c-1e1af2e6c3cb",
},
"displayName": {
"universalIdentifier": "3cadc470-9231-4027-9bbe-60e934edb483",
"universalIdentifier": "f96e757e-aa84-5c05-8922-9f962eb3854f",
},
"handle": {
"universalIdentifier": "4140bd68-55e8-475c-8724-7f9f97634a9f",
"universalIdentifier": "e3c1165d-aa09-5636-ac37-a391bacc602e",
},
"isOrganizer": {
"universalIdentifier": "684972f9-c5fe-4fff-bdec-2fc5511c938c",
"universalIdentifier": "949e222c-dbe7-5696-b386-ed3a82d8b452",
},
"person": {
"universalIdentifier": "86546244-9e3d-40e4-87cd-cbc82a353d2e",
"universalIdentifier": "e236d415-822a-5847-a90c-f0699eeb5cc7",
},
"responseStatus": {
"universalIdentifier": "dd0ab0bd-7f33-48fa-9461-fb5d085a2f9f",
"universalIdentifier": "0f3e3c0c-d8f9-57d9-99d5-66407347f210",
},
"workspaceMember": {
"universalIdentifier": "542141b0-ac85-4c43-867b-8d7f559b07ae",
"universalIdentifier": "e54eca2e-7fd9-5743-a514-348067775949",
},
},
},
@@ -667,19 +667,19 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "ce19efb9-710f-45b2-b141-473abbeea60b",
"views": {
"allCallRecordings": {
"universalIdentifier": "c395b55e-88f0-4d5b-a1fb-0d38b50e0b19",
"universalIdentifier": "6676d746-71e4-5dff-9bf1-418b92c26253",
"viewFields": {
"recordingRequestStatus": {
"universalIdentifier": "3bdedacd-0fd5-4175-8d28-2fe41bb5aa77",
"universalIdentifier": "883d1aca-4113-50ab-b83e-e2e2292bb5aa",
},
"startedAt": {
"universalIdentifier": "3b96351f-66ed-4fa6-acb6-698647573af7",
"universalIdentifier": "23d91b8e-e413-5e10-b818-17c3359fe068",
},
"status": {
"universalIdentifier": "6c4a81a2-d9c1-4f82-984c-f97e083ca710",
"universalIdentifier": "c7e2829f-4eba-5d7f-a1c7-a18ed8bd8025",
},
"title": {
"universalIdentifier": "b1d5051b-071d-4514-93cf-704724cdc8f6",
"universalIdentifier": "fcf0cedc-6d25-53ed-a587-cfb4b0958071",
},
},
},
@@ -799,28 +799,28 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
"views": {
"allCompanies": {
"universalIdentifier": "20202020-a001-4a01-8a01-c0aba11c0001",
"universalIdentifier": "cb8dc074-a42f-520b-85e5-ab85a1b40b20",
"viewFields": {
"accountOwner": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf004",
"universalIdentifier": "90b29c8d-d6a3-57be-8f3b-879f2807a0a7",
},
"address": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf008",
"universalIdentifier": "68cd0e8b-f730-54f5-90a0-45798bb5bb70",
},
"createdAt": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf005",
"universalIdentifier": "b8b2c693-4f3e-5471-afe2-1bd70dcd9b16",
},
"createdBy": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf003",
"universalIdentifier": "ec94701d-acce-58b5-bd81-75d585a68cf7",
},
"domainName": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf002",
"universalIdentifier": "4b4afe40-aa94-5bca-92a3-b84ccb846811",
},
"linkedinLink": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf007",
"universalIdentifier": "fa5a7f00-9751-5ab1-a410-fe144fedd2dc",
},
"name": {
"universalIdentifier": "20202020-af01-4a01-8a01-c0aba11cf001",
"universalIdentifier": "87bbfcc6-3be8-58a5-852c-f02c9c9bc009",
},
},
},
@@ -937,19 +937,19 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-3840-4b6d-9425-0c5188b05ca8",
"views": {
"allDashboards": {
"universalIdentifier": "20202020-a012-4a12-8a12-da5ab0b0a001",
"universalIdentifier": "0769edd6-ff42-5c4b-80c4-8aa1d07afba6",
"viewFields": {
"createdAt": {
"universalIdentifier": "20202020-af12-4a12-8a12-da5ab0b0af03",
"universalIdentifier": "f586827d-ed83-51bc-a862-741bd45ead77",
},
"createdBy": {
"universalIdentifier": "20202020-af12-4a12-8a12-da5ab0b0af02",
"universalIdentifier": "79f57be6-3262-517b-b592-4e791be5806e",
},
"title": {
"universalIdentifier": "20202020-af12-4a12-8a12-da5ab0b0af01",
"universalIdentifier": "e0fd54ca-2197-5ba8-ac87-9b7b39f359d0",
},
"updatedAt": {
"universalIdentifier": "20202020-af12-4a12-8a12-da5ab0b0af04",
"universalIdentifier": "d37846b6-01a9-54f9-ab44-43a39375974d",
},
},
},
@@ -1023,28 +1023,28 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
"views": {
"allMessages": {
"universalIdentifier": "20202020-d001-4d01-8d01-ae55a9e5a001",
"universalIdentifier": "8ac6d466-4071-5ce9-b635-5162034fa3f5",
"viewFields": {
"createdAt": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af07",
"universalIdentifier": "b214ac38-da59-5c1c-ae7e-189dc11f3f37",
},
"headerMessageId": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af05",
"universalIdentifier": "9139b1ad-8555-571c-8433-f038de5a3c82",
},
"messageParticipants": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af03",
"universalIdentifier": "3ad5730a-168c-5d32-be43-71c982ce9505",
},
"messageThread": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af02",
"universalIdentifier": "5072b4d6-d708-5cb5-a97a-7ae2a12b1337",
},
"receivedAt": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af04",
"universalIdentifier": "c8df5f80-0d07-5ecd-ba69-8f975bbdc51a",
},
"subject": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af01",
"universalIdentifier": "dfe53214-95ef-5dae-9c94-bf0c008f5c5d",
},
"text": {
"universalIdentifier": "20202020-df01-4d01-8d01-ae55a9e5af06",
"universalIdentifier": "1aeb24ca-72db-5735-ab13-f9bd99cab092",
},
},
},
@@ -1136,43 +1136,43 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "238acb94-dd4c-4036-bc55-19b99d821efd",
"views": {
"allMessageCampaigns": {
"universalIdentifier": "ffedb368-33f0-43a7-b84e-e622b4e97be9",
"universalIdentifier": "8094a87e-310b-58e7-9c05-a76c59ac6535",
"viewFields": {
"bouncedCount": {
"universalIdentifier": "135d3fb9-bc45-4426-980b-9836ed792e3a",
"universalIdentifier": "3c273c7f-b577-5213-8597-198dac6fdae1",
},
"complainedCount": {
"universalIdentifier": "9957dc6d-05ae-4829-ae7d-7cdf9239cdd0",
"universalIdentifier": "30317d2b-5212-56be-a5fe-0ab15722dde3",
},
"createdAt": {
"universalIdentifier": "6dffa47d-3128-4d54-924a-4f67676116c2",
"universalIdentifier": "88484379-8afd-5f7c-ab3c-7d937bb7ed13",
},
"failedCount": {
"universalIdentifier": "ad346c8e-f462-499e-89c8-da01d5460dc6",
"universalIdentifier": "2f44ac38-194f-56a7-bd94-a292db4bc210",
},
"fromAddress": {
"universalIdentifier": "553a0ea6-1f55-4143-a2d0-8c1ad0cf3dd1",
"universalIdentifier": "2ebb7a5d-e03d-5c6e-955f-4efb99fffb46",
},
"list": {
"universalIdentifier": "c0bf6a48-8695-4520-81e6-7462d35033b5",
"universalIdentifier": "13936b8a-0135-5ac3-81d1-f6a11826451e",
},
"name": {
"universalIdentifier": "4d40646c-853d-48e6-8ddb-81e6dedabc99",
"universalIdentifier": "5a224d5d-9ae7-53c8-ad6d-720bb62a087b",
},
"recipients": {
"universalIdentifier": "2f99f444-4af3-44fd-b08d-46955c4ac2a2",
"universalIdentifier": "40f278c1-2716-5324-8035-c14ea62a4eb7",
},
"sentAt": {
"universalIdentifier": "7f4a9d81-afac-4d27-98de-0a2da65114f7",
"universalIdentifier": "a9389297-3927-5364-8c9d-4bcb8039020e",
},
"sentCount": {
"universalIdentifier": "0be62e57-3955-49bd-a9ef-8f82f7a6e9aa",
"universalIdentifier": "e55b655a-038e-5257-ab2c-f2966900d2de",
},
"status": {
"universalIdentifier": "ef35df97-b1a5-4f16-8b85-5751e5019f63",
"universalIdentifier": "68714967-d906-5082-af8c-2791705ce682",
},
"subject": {
"universalIdentifier": "b017c851-e38d-4a81-ab38-0fb10e9f239e",
"universalIdentifier": "2a4fe259-612f-5d10-a451-a047e605917c",
},
},
},
@@ -1268,22 +1268,22 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-ad1e-4127-bccb-d83ae04d2ccb",
"views": {
"allMessageChannelMessageAssociations": {
"universalIdentifier": "a4f465ac-d5cb-4f24-93ac-7a24bafd398e",
"universalIdentifier": "fda3d57b-b54b-57be-af68-f9857f58577c",
"viewFields": {
"createdAt": {
"universalIdentifier": "af239abd-2c55-4108-a9d8-b5a67f6ca2e2",
"universalIdentifier": "32690396-1e7d-5b95-ad30-94c0c8914957",
},
"direction": {
"universalIdentifier": "ca38195e-985c-4880-85e0-26fa143c1ec7",
"universalIdentifier": "c9603fb3-9cef-5747-8d99-86592bff5f3d",
},
"message": {
"universalIdentifier": "f9f2de0d-3db5-402b-a733-53be6a4667c8",
"universalIdentifier": "9346a2f9-eff0-5909-af3e-12e52e6eef3a",
},
"messageChannelId": {
"universalIdentifier": "b86e652b-04ce-4089-9f71-e190eaf5b798",
"universalIdentifier": "5c6fdb16-a932-53f7-99d6-29e118a06f75",
},
"messageExternalId": {
"universalIdentifier": "7fb9801d-ca3d-4b2d-8d55-c922fcf7fefd",
"universalIdentifier": "ce797f5c-ea26-50fc-8d72-2dac766dc498",
},
},
},
@@ -1367,16 +1367,16 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-a1b0-40b0-8ab0-5b6c7d8e9f0a",
"views": {
"allMessageChannelMessageAssociationMessageFolders": {
"universalIdentifier": "775610fe-f1d1-4959-bdc3-0b437059cfeb",
"universalIdentifier": "982c43ec-d2af-5197-aad9-c61f4365a91b",
"viewFields": {
"createdAt": {
"universalIdentifier": "9da7637e-25c7-4101-8169-b5f6ff159690",
"universalIdentifier": "63b9774c-fd0e-5c17-a1c4-84ca9845f79c",
},
"messageChannelMessageAssociation": {
"universalIdentifier": "1251e67a-e795-4bc2-a468-6cfc838b6a0a",
"universalIdentifier": "7f87dc1b-efea-5286-be19-27b171a21a7e",
},
"messageFolderId": {
"universalIdentifier": "aff2203d-6439-43b8-9cb4-55e8d78bba43",
"universalIdentifier": "e608de61-b9fe-5747-a224-ab1c32290997",
},
},
},
@@ -1454,19 +1454,19 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "826561ea-4816-411c-baa0-eec5e6ca8866",
"views": {
"allMessageLists": {
"universalIdentifier": "c72bae18-75e9-4cb0-baeb-379d3529b98f",
"universalIdentifier": "75e21a3c-6c76-58ec-9f14-b2e9ecc93204",
"viewFields": {
"campaigns": {
"universalIdentifier": "037030a2-9dad-4bfd-957a-313b362172b4",
"universalIdentifier": "8fd26964-23a7-5913-b431-1b83c03bfdfe",
},
"createdAt": {
"universalIdentifier": "29f3e7de-c40b-4597-8568-7318c146e4da",
"universalIdentifier": "69d178f4-f4b8-5bc2-a01b-bfc21f3a753a",
},
"members": {
"universalIdentifier": "6d314c4b-215a-4094-963a-ff9dd8221aea",
"universalIdentifier": "8e64ce89-0910-58df-a896-ccbe514f3913",
},
"name": {
"universalIdentifier": "c9767580-34e6-420b-923d-b4abd8c13d96",
"universalIdentifier": "9deb8cdc-2734-541f-a6c2-d37e144d4747",
},
},
},
@@ -1580,28 +1580,28 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-a433-4456-aa2d-fd9cb26b774a",
"views": {
"allMessageParticipants": {
"universalIdentifier": "8b7fbe7d-dae0-4285-8bdc-ec078a4de870",
"universalIdentifier": "9ffa51b2-4eef-52a7-9761-10b2d2ca8716",
"viewFields": {
"createdAt": {
"universalIdentifier": "636ff7b6-86b8-49fc-9442-39f4c24ff424",
"universalIdentifier": "9995f355-7956-5f8c-917f-7a3390fd417d",
},
"displayName": {
"universalIdentifier": "8d0c8202-b57f-4450-a090-a7eb26aa2299",
"universalIdentifier": "dd4ef6d0-a1d6-5618-a583-d77222d6a768",
},
"handle": {
"universalIdentifier": "abcbb5d9-b8c2-46bb-b3cc-ea035be8f3be",
"universalIdentifier": "1eb7f5a3-7e3b-5f9b-9362-27b99b1ca88f",
},
"message": {
"universalIdentifier": "ca491a31-8659-4202-9476-f0f72efc80b5",
"universalIdentifier": "a6ae59bd-a5ef-5210-b0bf-ebbcb0386e93",
},
"person": {
"universalIdentifier": "26d0f3f1-43d3-425c-930c-81147451d0f8",
"universalIdentifier": "78872b33-6bba-5cf3-bef0-bfaf528e6877",
},
"role": {
"universalIdentifier": "55b74f7e-7c58-4fce-a44b-a8d9671ec541",
"universalIdentifier": "009f68a7-695c-582b-833e-501af34480ff",
},
"workspaceMember": {
"universalIdentifier": "df62dcbc-c22d-4d34-9fa5-6f70bae02161",
"universalIdentifier": "ca7bd6d7-939d-59eb-bd2d-73777e28c9a5",
},
},
},
@@ -1681,19 +1681,19 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-849a-4c3e-84f5-a25a7d802271",
"views": {
"allMessageThreads": {
"universalIdentifier": "20202020-d002-4d02-8d02-ae55a9ba2002",
"universalIdentifier": "0f667621-896c-5b8e-8359-3c7c1f8ee1d8",
"viewFields": {
"createdAt": {
"universalIdentifier": "20202020-df02-4d02-8d02-ae55a9ba2f02",
"universalIdentifier": "98c4c4b8-509c-57a4-b1ba-f66de2df38a2",
},
"messages": {
"universalIdentifier": "20202020-df02-4d02-8d02-ae55a9ba2f01",
"universalIdentifier": "0f61a257-5110-5f67-9315-42da5355a6e9",
},
"subject": {
"universalIdentifier": "e5f0d32b-2b6a-47bc-b3bd-f32c96594ec1",
"universalIdentifier": "7074b6e0-abd9-5f2c-bf3b-3c834ef37c1d",
},
"updatedAt": {
"universalIdentifier": "af2c6ac9-7083-4609-8172-d518441f5e9e",
"universalIdentifier": "cd336056-36de-525b-af30-c5c6c38b917b",
},
},
},
@@ -1749,22 +1749,22 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-0b00-45cd-b6f6-6cd806fc6804",
"views": {
"allNotes": {
"universalIdentifier": "20202020-a005-4a05-8a05-a0be5a11a000",
"universalIdentifier": "2bfba20b-7cfa-5d3c-b683-cf9abde2359d",
"viewFields": {
"bodyV2": {
"universalIdentifier": "20202020-af05-4a05-8a05-a0be5a11af02",
"universalIdentifier": "3a923b53-057d-52ee-9b12-43ccbe9b9fc2",
},
"createdAt": {
"universalIdentifier": "20202020-af05-4a05-8a05-a0be5a11af04",
"universalIdentifier": "6c04d549-a0fb-50ea-8132-557c61ad6f58",
},
"createdBy": {
"universalIdentifier": "20202020-af05-4a05-8a05-a0be5a11af03",
"universalIdentifier": "414f18ff-5ce5-589b-8ff3-fe7cad4b0e75",
},
"noteTargets": {
"universalIdentifier": "20202020-af05-4a05-8a05-a0be5a11af01",
"universalIdentifier": "1be85e89-a527-5225-a315-3c3fddfdaf86",
},
"title": {
"universalIdentifier": "20202020-af05-4a05-8a05-a0be5a11af00",
"universalIdentifier": "55d3619b-d72e-5f2b-8f79-a4ad5106dd76",
},
},
},
@@ -1868,22 +1868,22 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-fff0-4b44-be82-bda313884400",
"views": {
"allNoteTargets": {
"universalIdentifier": "d124d587-ef78-402b-9341-7673e6cea033",
"universalIdentifier": "3962cec0-e2f6-5d27-ab3c-40a5dd6279d0",
"viewFields": {
"id": {
"universalIdentifier": "f2d912fe-7c6f-4a9c-b808-b7b5a18d2818",
"universalIdentifier": "e296fb5c-74f5-5924-8506-3b16639564c9",
},
"note": {
"universalIdentifier": "9d4ac173-d32b-4a44-9dbd-8a47ab844f98",
"universalIdentifier": "de9a35c2-dd69-5b62-94ca-006fc7c4c28f",
},
"targetCompany": {
"universalIdentifier": "a9c7f370-4b22-4f29-8e3f-678e91a59576",
"universalIdentifier": "e8175481-58d2-5c1d-a6b4-118448c78073",
},
"targetOpportunity": {
"universalIdentifier": "3efeb162-cd03-458b-9c7b-47032d045204",
"universalIdentifier": "eb132124-1725-5528-affc-e4996415e01f",
},
"targetPerson": {
"universalIdentifier": "b6f67de5-c5cf-4235-b740-a6a007c8eae3",
"universalIdentifier": "48f31dbf-75fc-5780-a58a-960d9ce5c18b",
},
},
},
@@ -1966,25 +1966,25 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
"views": {
"allOpportunities": {
"universalIdentifier": "20202020-a003-4a03-8a03-0aa0b1ca1ba0",
"universalIdentifier": "d024c8c9-3021-53d0-b612-9da81b02736f",
"viewFields": {
"amount": {
"universalIdentifier": "20202020-af03-4a03-8a03-0aa0b1ca1bb0",
"universalIdentifier": "22e16aff-d1b4-59ce-902b-fee1f4adb79c",
},
"closeDate": {
"universalIdentifier": "20202020-af03-4a03-8a03-0aa0b1ca1bb2",
"universalIdentifier": "20b2d9f9-8ad9-59db-8a62-2576692c9ad9",
},
"company": {
"universalIdentifier": "20202020-af03-4a03-8a03-0aa0b1ca1bb3",
"universalIdentifier": "d0ac287f-801b-54c5-ba49-c842a5e7140c",
},
"createdBy": {
"universalIdentifier": "20202020-af03-4a03-8a03-0aa0b1ca1bb1",
"universalIdentifier": "fe527f0f-1690-5077-9b9e-cebaa7c4c5d1",
},
"name": {
"universalIdentifier": "20202020-af03-4a03-8a03-0aa0b1ca1baf",
"universalIdentifier": "4a52d5c5-0243-5c57-ab5e-6d1395beb2cf",
},
"pointOfContact": {
"universalIdentifier": "20202020-af03-4a03-8a03-0aa0b1ca1bb4",
"universalIdentifier": "51fbe12a-46c1-50d2-8163-5a50542c600e",
},
},
},
@@ -2177,31 +2177,31 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
"views": {
"allPeople": {
"universalIdentifier": "20202020-a002-4a02-8a02-ae0a1ea11a00",
"universalIdentifier": "0cda0ad4-74da-5ccd-975c-a0e4db43a05a",
"viewFields": {
"company": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af3",
"universalIdentifier": "3530ea58-3f8f-5e5f-a17a-f68d4ad867ba",
},
"createdAt": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af5",
"universalIdentifier": "114a1b7f-71c5-5277-a4e7-b2379d900a99",
},
"createdBy": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af2",
"universalIdentifier": "de1a471e-8ae4-533f-870a-c462561b02d2",
},
"emails": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af1",
"universalIdentifier": "5731e6bb-b5dc-5793-aaa5-386b0da99fd5",
},
"jobTitle": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af7",
"universalIdentifier": "a036c9bc-4e8e-5384-8598-48ed4e516fc6",
},
"linkedinLink": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af8",
"universalIdentifier": "42014c11-5951-59eb-b525-bf14d5570eab",
},
"name": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af0",
"universalIdentifier": "899d55b0-dd24-534e-af40-65d08b9073ce",
},
"phones": {
"universalIdentifier": "20202020-af02-4a02-8a02-ae0a1ea11af4",
"universalIdentifier": "565f0a13-140e-5c59-86b1-7d0ebd18e9dd",
},
},
},
@@ -2342,31 +2342,31 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-1ba1-48ba-bc83-ef7e5990ed10",
"views": {
"allTasks": {
"universalIdentifier": "20202020-a006-4a06-8a06-ba5ca11a1ea0",
"universalIdentifier": "ca2db697-077a-5f45-81e1-513aea4752a1",
"viewFields": {
"assignee": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb4",
"universalIdentifier": "1244827a-ea11-532b-9722-d862948426e5",
},
"bodyV2": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb5",
"universalIdentifier": "a2c8a8f0-2b25-57db-9a25-a8e1beee93a1",
},
"createdAt": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb6",
"universalIdentifier": "98414831-dc54-51a4-a6a7-4144e0d124ae",
},
"createdBy": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb2",
"universalIdentifier": "422888eb-d12d-5096-9b3e-7899cf4722e9",
},
"dueAt": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb3",
"universalIdentifier": "92a126a5-2072-5cfd-b3e1-e0a327358056",
},
"status": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb0",
"universalIdentifier": "6527420a-3345-5581-bb51-f4210f31ef3a",
},
"taskTargets": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eb1",
"universalIdentifier": "2714ec81-03f5-5915-9d5f-1bec691fc1b6",
},
"title": {
"universalIdentifier": "20202020-af06-4a06-8a06-ba5ca11a1eaf",
"universalIdentifier": "1480d069-9159-51ae-b316-5bc1a3f04235",
},
},
},
@@ -2555,22 +2555,22 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-5a9a-44e8-95df-771cd06d0fb1",
"views": {
"allTaskTargets": {
"universalIdentifier": "1dbf1d24-6cca-4f55-ae2f-e3d1b425a495",
"universalIdentifier": "dea38ca0-b564-5ae1-b662-9ce388668438",
"viewFields": {
"id": {
"universalIdentifier": "a49287c9-8aa6-4fca-9ec5-08d643f7239f",
"universalIdentifier": "d1aa56de-7a8a-5670-9cc5-c2c159a4ff4d",
},
"targetCompany": {
"universalIdentifier": "e9fa1305-4ba2-41c5-9198-fdc622b69f90",
"universalIdentifier": "47a3f1f8-e2ce-5a7c-af00-36dda03fbc44",
},
"targetOpportunity": {
"universalIdentifier": "526f3354-34d6-4e7e-a870-5f99c28353c2",
"universalIdentifier": "2c09e527-cf94-5e74-9e23-fb4550c7cf18",
},
"targetPerson": {
"universalIdentifier": "cadc7a33-1527-4ef8-ac00-7ed0b54d1bae",
"universalIdentifier": "611b9723-3be8-5470-8baf-5201053a38f0",
},
"task": {
"universalIdentifier": "1f79839e-42f6-4a69-839a-369e21a7497d",
"universalIdentifier": "634c7721-c9d6-5ada-943f-914065531425",
},
},
},
@@ -2697,49 +2697,43 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-6736-4337-b5c4-8b39fae325a5",
"views": {
"allTimelineActivities": {
"universalIdentifier": "20202020-b101-4b01-8b01-ba5cc01aa001",
"universalIdentifier": "28d3e8a9-e840-5034-ade2-b752bc8eb25d",
"viewFields": {
"happensAt": {
"universalIdentifier": "20202020-bf01-4b01-8b01-ba5cc01aa012",
},
"linkedRecordCachedName": {
"universalIdentifier": "20202020-bf01-4b01-8b01-ba5cc01aa017",
"universalIdentifier": "3ccb9611-f9ec-56c5-82df-f12f7e26e694",
},
"name": {
"universalIdentifier": "20202020-bf01-4b01-8b01-ba5cc01aa011",
},
"properties": {
"universalIdentifier": "20202020-bf01-4b01-8b01-ba5cc01aa019",
"universalIdentifier": "821f0d94-72e0-5b04-ba97-50538f5a73c2",
},
"targetCompany": {
"universalIdentifier": "2015825f-0786-4b0d-88a7-dfce1b4b1c1a",
"universalIdentifier": "d271d5b4-86ad-513d-a042-d4f8a9c41665",
},
"targetDashboard": {
"universalIdentifier": "538847e8-ab09-407c-a433-505f6d7be7a1",
"universalIdentifier": "b899313f-2e84-51c2-8322-a02bb695ec91",
},
"targetNote": {
"universalIdentifier": "ab74ed52-0195-4b65-987a-8367c07ee222",
"universalIdentifier": "fd6171eb-8bb7-5d3d-a7f7-bd0ebf972f90",
},
"targetOpportunity": {
"universalIdentifier": "f7b5ced9-eba6-4454-8849-7a92d27c11ca",
"universalIdentifier": "a53f262e-4810-55bc-9e47-f9b7bc9a4da7",
},
"targetPerson": {
"universalIdentifier": "37b38a8b-abd7-4f72-92d2-ad82bbef0296",
"universalIdentifier": "c5bd0e0d-20aa-5112-8517-df71c63e5726",
},
"targetTask": {
"universalIdentifier": "3899138d-e6fa-414c-9432-214c9b797ebb",
"universalIdentifier": "3e21cd2a-77ca-5e49-90be-4532dd804c24",
},
"targetWorkflow": {
"universalIdentifier": "d2c3ddc3-afad-40b9-a2cb-d2765f2f5691",
"universalIdentifier": "8e0e94b7-9c2a-5fda-bbfe-2604a0f9cbb4",
},
"targetWorkflowRun": {
"universalIdentifier": "97910946-04f0-4634-804e-880bc0019225",
"universalIdentifier": "13fff327-8fbe-5a91-8d95-4a9ca455cfe9",
},
"targetWorkflowVersion": {
"universalIdentifier": "4a7e3213-afd5-4691-8bba-0a10e8697afb",
"universalIdentifier": "c4aa8b50-d9bb-5395-a90a-fa0d36312634",
},
"workspaceMember": {
"universalIdentifier": "20202020-bf01-4b01-8b01-ba5cc01aa013",
"universalIdentifier": "09d2d7d9-6809-561b-9dc7-1588b6a18673",
},
},
},
@@ -2807,25 +2801,25 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-62be-406c-b9ca-8caa50d51392",
"views": {
"allWorkflows": {
"universalIdentifier": "20202020-a009-4a09-8a09-a0bcf10aa11a",
"universalIdentifier": "84dddf6b-edfa-55c4-ab1d-886602c1ca38",
"viewFields": {
"createdBy": {
"universalIdentifier": "20202020-af09-4a09-8a09-a0bcf10aa11d",
"universalIdentifier": "982cf2c6-a9a2-5557-9733-e3124168ee9f",
},
"name": {
"universalIdentifier": "20202020-af09-4a09-8a09-a0bcf10aa11a",
"universalIdentifier": "d0c96ceb-e6f7-562d-b859-35341481cdf2",
},
"runs": {
"universalIdentifier": "20202020-af09-4a09-8a09-a0bcf10aa11f",
"universalIdentifier": "869394ba-f9b4-5ce2-8312-b9a9827baea8",
},
"statuses": {
"universalIdentifier": "20202020-af09-4a09-8a09-a0bcf10aa11b",
"universalIdentifier": "47e57811-bc0b-5b77-9936-384590672b71",
},
"updatedAt": {
"universalIdentifier": "20202020-af09-4a09-8a09-a0bcf10aa11c",
"universalIdentifier": "22bc20fd-c132-50e0-9bff-b0a405e729db",
},
"versions": {
"universalIdentifier": "20202020-af09-4a09-8a09-a0bcf10aa11e",
"universalIdentifier": "4978149a-4ed7-5d59-aafb-2dd69b6cd6fe",
},
},
},
@@ -2875,16 +2869,16 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-3319-4234-a34c-7f3b9d2e4d1f",
"views": {
"allWorkflowAutomatedTriggers": {
"universalIdentifier": "a0a9ef79-3d42-417a-8555-3ee54c18ea51",
"universalIdentifier": "d53c1b59-4f9c-5647-aaf5-ac8197ca1c3f",
"viewFields": {
"createdAt": {
"universalIdentifier": "bb35e66a-2a1e-416b-8105-5749d91ab65f",
"universalIdentifier": "5897f02c-e29d-5085-9bbe-60c48a8360b5",
},
"type": {
"universalIdentifier": "689b4749-aa40-489a-bf0b-475a197ca2e6",
"universalIdentifier": "f4456853-dad8-57e8-81a4-6987477a40f7",
},
"workflow": {
"universalIdentifier": "e5a46195-06fe-4f47-8844-128e35151d37",
"universalIdentifier": "53a781ed-4cd6-58fd-8de9-26e5cc7f01a7",
},
},
},
@@ -2986,25 +2980,16 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-4e28-4e95-a9d7-6c00874f843c",
"views": {
"allWorkflowRuns": {
"universalIdentifier": "20202020-a011-4a11-8a11-a0bcf10abca5",
"universalIdentifier": "7f1e3269-5de1-56e9-b89f-4cccaf4d53d6",
"viewFields": {
"createdBy": {
"universalIdentifier": "20202020-af11-4a11-8a11-a0bcf10abcb3",
},
"name": {
"universalIdentifier": "20202020-af11-4a11-8a11-a0bcf10abcaf",
},
"startedAt": {
"universalIdentifier": "20202020-af11-4a11-8a11-a0bcf10abcb2",
"universalIdentifier": "b1ae1446-834a-54bb-b995-04644ee4f0cf",
},
"status": {
"universalIdentifier": "20202020-af11-4a11-8a11-a0bcf10abcb1",
"universalIdentifier": "f62369bb-a4cc-5d88-ac8e-7740ea318837",
},
"workflow": {
"universalIdentifier": "20202020-af11-4a11-8a11-a0bcf10abcb0",
},
"workflowVersion": {
"universalIdentifier": "20202020-af11-4a11-8a11-a0bcf10abcb4",
"universalIdentifier": "1c323f33-aa9a-5975-8a60-095817bf6412",
},
},
},
@@ -3121,22 +3106,22 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-d65d-4ab9-9344-d77bfb376a3d",
"views": {
"allWorkflowVersions": {
"universalIdentifier": "20202020-a010-4a10-8a10-a0bcf10aae15",
"universalIdentifier": "a305b346-a83c-5bdd-880b-7a8e71310bf3",
"viewFields": {
"name": {
"universalIdentifier": "20202020-af10-4a10-8a10-a0bcf10aaeaf",
"universalIdentifier": "84a34cf6-7fd8-5972-894d-bc21e026f334",
},
"runs": {
"universalIdentifier": "20202020-af10-4a10-8a10-a0bcf10aaeb3",
"universalIdentifier": "255ab204-2ebe-582c-bfbd-4a846490d721",
},
"status": {
"universalIdentifier": "20202020-af10-4a10-8a10-a0bcf10aaeb1",
"universalIdentifier": "6ec4080f-d57e-5837-8f99-b36cebbb2fde",
},
"updatedAt": {
"universalIdentifier": "20202020-af10-4a10-8a10-a0bcf10aaeb2",
"universalIdentifier": "604b9aaa-ed58-5e44-869a-0e6402c00c64",
},
"workflow": {
"universalIdentifier": "20202020-af10-4a10-8a10-a0bcf10aaeb0",
"universalIdentifier": "9c66dd1e-1b6d-5ad9-9e81-25c4c0c20799",
},
},
},
@@ -3280,40 +3265,19 @@ exports[`STANDARD_OBJECTS universal identifiers should never change without an e
"universalIdentifier": "20202020-3319-4234-a34c-82d5c0e881a6",
"views": {
"allWorkspaceMembers": {
"universalIdentifier": "20202020-e001-4e01-8e01-a0bcaeabe100",
"universalIdentifier": "55546e30-498e-51f8-bcf2-14617c1fd8aa",
"viewFields": {
"assignedTasks": {
"universalIdentifier": "af16226e-6375-4676-8bd9-9d1a57076fc4",
},
"avatarUrl": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f2",
},
"colorScheme": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f3",
"universalIdentifier": "d401db50-821d-540d-852f-d5ee06d7b2ed",
},
"createdAt": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f8",
},
"dateFormat": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f6",
},
"locale": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f4",
"universalIdentifier": "03129632-0c81-576f-884f-65d366c2ca3a",
},
"name": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f0",
"universalIdentifier": "7af9ed3a-b187-5dad-b8c6-451b50fed4d8",
},
"ownedOpportunities": {
"universalIdentifier": "8a0503f3-ba61-453e-86dc-6c79f7bc235b",
},
"timeFormat": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f7",
},
"timeZone": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f5",
},
"userEmail": {
"universalIdentifier": "20202020-ef01-4e01-8e01-a0bcaeabe1f1",
"universalIdentifier": "e15281a1-9f03-5b59-87d9-7f6a5b7a8d99",
},
},
},
File diff suppressed because it is too large Load Diff
@@ -1,11 +1,17 @@
// Object universal identifiers referenced from another object's declaration
// (default relation builders need both the host and the source object
// identifiers, and an object literal cannot reference its sibling keys).
// Each STANDARD_OBJECTS entry involved in the default relations reads its own
// universalIdentifier from this record so there is a single source of truth.
// Single source of truth for standard object universal identifiers: an object
// identifier is referenced from its own STANDARD_OBJECTS entry, from its
// STANDARD_OBJECT_FIELDS entry (system fields and INDEX view derivation), and
// sometimes from another object's declaration (default relation builders need
// both the host and the source object identifiers, and an object literal
// cannot reference its sibling keys).
export const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = {
timelineActivity: '20202020-6736-4337-b5c4-8b39fae325a5',
attachment: '20202020-bd3d-4c60-8dca-571c71d4447a',
blocklist: '20202020-0408-4f38-b8a8-4d5e3e26e24d',
calendarChannelEventAssociation: '20202020-491b-4aaa-9825-afd1bae6ae00',
calendarEvent: '20202020-8f1d-4eef-9f85-0d1965e27221',
calendarEventParticipant: '20202020-a1c3-47a6-9732-27e5b1e8436d',
callRecording: 'ce19efb9-710f-45b2-b141-473abbeea60b',
noteTarget: '20202020-fff0-4b44-be82-bda313884400',
taskTarget: '20202020-5a9a-44e8-95df-771cd06d0fb1',
person: '20202020-e674-48e5-a542-72570eee7213',
@@ -14,11 +20,20 @@ export const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = {
note: '20202020-0b00-45cd-b6f6-6cd806fc6804',
task: '20202020-1ba1-48ba-bc83-ef7e5990ed10',
workflow: '20202020-62be-406c-b9ca-8caa50d51392',
workflowAutomatedTrigger: '20202020-3319-4234-a34c-7f3b9d2e4d1f',
workflowVersion: '20202020-d65d-4ab9-9344-d77bfb376a3d',
workflowRun: '20202020-4e28-4e95-a9d7-6c00874f843c',
workspaceMember: '20202020-3319-4234-a34c-82d5c0e881a6',
dashboard: '20202020-3840-4b6d-9425-0c5188b05ca8',
message: '20202020-3f6b-4425-80ab-e468899ab4b2',
messageChannelMessageAssociation: '20202020-ad1e-4127-bccb-d83ae04d2ccb',
messageChannelMessageAssociationMessageFolder:
'20202020-a1b0-40b0-8ab0-5b6c7d8e9f0a',
messageList: '826561ea-4816-411c-baa0-eec5e6ca8866',
messageListMember: '27773d24-8ce3-40f8-aa6c-1f590f2c08d2',
messageCampaign: '238acb94-dd4c-4036-bc55-19b99d821efd',
messageParticipant: '20202020-a433-4456-aa2d-fd9cb26b774a',
messageThread: '20202020-849a-4c3e-84f5-a25a7d802271',
} as const;
export type StandardObjectWithUniversalIdentifierName =
File diff suppressed because it is too large Load Diff
@@ -16,6 +16,7 @@ export { ALL_METADATA_NAME } from './constants/all-metadata-name.constant';
export { DEFAULT_RELATIONS_OBJECTS_STANDARD_IDS } from './constants/default-relations-object-standard-ids.constant';
export { IDENTIFIER_MAX_CHAR_LENGTH } from './constants/identifier-max-char-length.constant';
export { RESERVED_METADATA_NAME_KEYWORDS } from './constants/reserved-metadata-name-keywords.constant';
export { STANDARD_OBJECT_FIELDS } from './constants/standard-object-fields.constant';
export type { StandardObjectWithUniversalIdentifierName } from './constants/standard-object-universal-identifiers.constant';
export { STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from './constants/standard-object-universal-identifiers.constant';
export { STANDARD_OBJECTS } from './constants/standard-object.constant';
@@ -0,0 +1,57 @@
import { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER } from '@/application/constants/TwentyStandardApplicationUniversalIdentifier';
import { getSystemViewUniversalIdentifier } from '@/application/deterministic-identifier/get-system-view-universal-identifier.util';
import { getViewFieldUniversalIdentifier } from '@/application/deterministic-identifier/get-view-field-universal-identifier.util';
import { ViewKey } from '@/types/ViewKey';
type StandardViewFieldUniversalIdentifier = { universalIdentifier: string };
export const buildStandardObjectIndexView = <
const TViewFieldName extends string,
>({
objectUniversalIdentifier,
fields,
viewFieldNames,
}: {
objectUniversalIdentifier: string;
fields: Record<string, StandardViewFieldUniversalIdentifier>;
viewFieldNames: readonly TViewFieldName[];
}): {
universalIdentifier: string;
viewFields: Record<TViewFieldName, StandardViewFieldUniversalIdentifier>;
} => {
const viewUniversalIdentifier = getSystemViewUniversalIdentifier({
applicationUniversalIdentifier:
TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER,
objectUniversalIdentifier,
viewKey: ViewKey.INDEX,
});
const viewFields = Object.fromEntries(
viewFieldNames.map((viewFieldName) => {
const field = fields[viewFieldName];
if (field === undefined) {
throw new Error(
`Missing field "${viewFieldName}" for the INDEX view of object ${objectUniversalIdentifier}`,
);
}
return [
viewFieldName,
{
universalIdentifier: getViewFieldUniversalIdentifier({
applicationUniversalIdentifier:
TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER,
viewUniversalIdentifier,
fieldMetadataUniversalIdentifier: field.universalIdentifier,
}),
},
];
}),
) as Record<TViewFieldName, StandardViewFieldUniversalIdentifier>;
return {
universalIdentifier: viewUniversalIdentifier,
viewFields,
};
};