Update manifest structure (#17547)

Move all sync entities in an `entities` key. Rename functions to
logicFunctions

```json
{
  application: {
    ...
  },
  entities: {
    objects: [],
    logicFunctions: [],
    ...
  }
}
```
This commit is contained in:
martmull
2026-01-30 16:26:45 +01:00
committed by GitHub
parent bc022f82cb
commit f46da3eefd
162 changed files with 2555 additions and 3778 deletions
@@ -1,16 +1,16 @@
import {
type ManifestBuildResult,
runManifestBuild,
updateManifestChecksum,
} from '@/cli/utilities/build/manifest/manifest-build';
updateManifestChecksums,
} from '@/cli/utilities/build/manifest/update-manifest-checksums';
import { writeManifestToOutput } from '@/cli/utilities/build/manifest/manifest-writer';
import { ApiService } from '@/cli/utilities/api/api-service';
import { FileUploader } from '@/cli/utilities/file/file-uploader';
import { type FileFolder } from 'twenty-shared/types';
import { validateManifest } from '@/cli/utilities/build/manifest/manifest-validate';
import type { Location } from 'esbuild';
import { type DevUiStateManager } from '@/cli/utilities/dev/dev-ui-state-manager';
import { type EventName } from 'chokidar/handler.js';
import { buildManifest } from '@/cli/utilities/build/manifest/manifest-build';
import { validateManifest } from '@/cli/utilities/build/manifest/validate-manifest';
export type DevModeOrchestratorOptions = {
appPath: string;
@@ -232,21 +232,38 @@ export class DevModeOrchestrator {
manifestStatus: 'building',
});
const result = await runManifestBuild(this.appPath);
const result = await buildManifest(this.appPath);
if (result.error || !result.manifest) {
if (result.errors.length > 0 || !result.manifest) {
for (const error of result.errors) {
this.uiStateManager.addEvent({
message: error,
status: 'error',
});
}
this.uiStateManager.updateManifestState({
manifestStatus: 'error',
});
this.uiStateManager.addEvent({
message: result.error ?? 'Unknown error',
status: 'error',
error: result.errors[result.errors.length - 1],
});
return;
}
const validation = validateManifest(result.manifest);
if (!validation.isValid) {
for (const e of validation.errors) {
this.uiStateManager.addEvent({
message: e,
status: 'error',
});
this.uiStateManager.updateManifestState({
manifestStatus: 'error',
error: e,
});
}
return;
}
this.uiStateManager.updateManifestState({
appName: result.manifest.application.displayName,
});
@@ -255,25 +272,10 @@ export class DevModeOrchestrator {
manifestFilePaths: result.filePaths,
});
if (!validation.isValid) {
for (const e of validation.errors) {
this.uiStateManager.addEvent({
message: `${e.path}: ${e.message}`,
status: 'error',
});
this.uiStateManager.updateManifestState({
manifestStatus: 'error',
});
}
return;
}
if (validation.warnings.length > 0) {
for (const warning of validation.warnings) {
const path = warning.path ? `${warning.path}: ` : '';
this.uiStateManager.addEvent({
message: `${path}${warning.message}`,
message: `${warning}`,
status: 'warning',
});
}
@@ -304,7 +306,7 @@ export class DevModeOrchestrator {
await Promise.all(this.activeUploads);
}
const manifest = updateManifestChecksum({
const manifest = updateManifestChecksums({
manifest: result.manifest,
builtFileInfos: this.builtFileInfos,
});
@@ -344,7 +346,7 @@ export class DevModeOrchestrator {
});
} else {
this.uiStateManager.addEvent({
message: `Sync failed: ${JSON.stringify(syncResult.error, null, 2)}`,
message: `Sync failed with error ${JSON.stringify(syncResult.error, null, 2)}`,
status: 'error',
});
this.uiStateManager.updateManifestState({
@@ -353,7 +355,7 @@ export class DevModeOrchestrator {
}
} catch (error) {
this.uiStateManager.addEvent({
message: `Sync failed: ${JSON.stringify(error, null, 2)}`,
message: `Sync failed with error ${JSON.stringify(error, null, 2)}`,
status: 'error',
});
this.uiStateManager.updateManifestState({
@@ -6,7 +6,7 @@ import {
type UiEvent,
type DevUiState,
} from '@/cli/utilities/dev/dev-ui-state';
import { type EntityFilePaths } from '@/cli/utilities/build/manifest/manifest-build';
import type { EntityFilePaths } from '@/cli/utilities/build/manifest/manifest-extract-config';
const MAX_EVENT_NUMBER = 200;
@@ -92,7 +92,7 @@ export class DevUiStateManager {
...this.state,
...(manifestStatus ? { manifestStatus } : {}),
...(appName ? { appName } : {}),
...(error ? { error } : {}),
...(error ? { error } : { error: undefined }),
};
this.notify();
@@ -104,16 +104,14 @@ export class DevUiStateManager {
switch (entityType) {
case 'objects':
return SyncableEntity.Object;
case 'objectExtensions':
return SyncableEntity.ObjectExtension;
case 'functions':
return SyncableEntity.Function;
case 'fields':
return SyncableEntity.Field;
case 'logicFunctions':
return SyncableEntity.LogicFunction;
case 'frontComponents':
return SyncableEntity.FrontComponent;
case 'roles':
return SyncableEntity.Role;
case 'assets':
return SyncableEntity.PublicAsset;
default:
return;
}
@@ -26,11 +26,10 @@ const STATUS_COLORS: Record<FileStatus, string> = {
const ENTITY_LABELS: Record<SyncableEntity, string> = {
[SyncableEntity.Object]: 'Objects',
[SyncableEntity.ObjectExtension]: 'Object Extensions',
[SyncableEntity.Function]: 'Functions',
[SyncableEntity.FrontComponent]: 'Front Components',
[SyncableEntity.Field]: 'Fields',
[SyncableEntity.LogicFunction]: 'Logic functions',
[SyncableEntity.FrontComponent]: 'Front components',
[SyncableEntity.Role]: 'Roles',
[SyncableEntity.PublicAsset]: 'Public Assets',
};
const ENTITY_ORDER = Object.keys(ENTITY_LABELS) as SyncableEntity[];
@@ -194,7 +193,7 @@ export const renderDevUI = async (
return (
<Text color={config.color}>
{icon ?? ''}
{icon ? `${icon} ` : ''}
{config.text}
{snapshot.error && `: ${snapshot.error}`}
</Text>