Fix ci + improvements (#17795)

as title
This commit is contained in:
martmull
2026-02-10 11:48:10 +01:00
committed by GitHub
parent ee0474e287
commit 52fe21c04b
26 changed files with 182 additions and 248 deletions
@@ -0,0 +1,37 @@
import { AppDevCommand } from '@/cli/commands/app/app-dev';
import * as fs from 'fs-extra';
import { join } from 'path';
import { OUTPUT_DIR } from 'twenty-shared/application';
export type RunAppDevResult = {
success: boolean;
};
export const runAppDevInProcess = async (options: {
appPath: string;
timeout?: number;
}): Promise<RunAppDevResult> => {
const { appPath, timeout = 30_000 } = options;
const manifestPath = join(appPath, OUTPUT_DIR, 'manifest.json');
const command = new AppDevCommand();
await command.execute({ appPath });
const startTime = Date.now();
while (Date.now() - startTime < timeout) {
if (await fs.pathExists(manifestPath)) {
// Small delay to let any pending writes finish
await new Promise((resolve) => setTimeout(resolve, 500));
await command.close();
return { success: true };
}
await new Promise((resolve) => setTimeout(resolve, 100));
}
await command.close();
return { success: false };
};
@@ -1,22 +0,0 @@
import {
runCliCommand,
type RunCliCommandResult,
} from './run-cli-command.util';
export type RunAppDevOptions = {
appPath: string;
timeout?: number;
};
export const runAppDev = (
options: RunAppDevOptions,
): Promise<RunCliCommandResult> => {
const { appPath, timeout = 60_000 } = options;
return runCliCommand({
command: 'app:dev',
args: [appPath],
waitForOutput: ['✓ Synced'],
timeout,
});
};
@@ -23,7 +23,7 @@ export type RunCliCommandResult = {
export const runCliCommand = (
options: RunCliCommandOptions,
): Promise<RunCliCommandResult> => {
const { command, args = [], waitForOutput, timeout = 60_000 } = options;
const { command, args = [], waitForOutput, timeout = 30_000 } = options;
return new Promise((resolve) => {
// Run from CLI directory to use twenty-sdk's tsconfig paths
@@ -43,6 +43,7 @@ export const runCliCommand = (
let output = '';
const timeoutId = setTimeout(() => {
child.kill();
console.log(`RunCliCommand ${command} timeout after ${timeout / 1_000}s`);
resolve({ success: false, output });
}, timeout);
@@ -76,11 +77,7 @@ export const runCliCommand = (
child.on('close', (code) => {
clearTimeout(timeoutId);
if (waitForOutputs.length === 0) {
resolve({ success: code === 0, output });
} else {
resolve({ success: false, output });
}
resolve({ success: code === 0, output });
});
child.on('error', () => {
@@ -0,0 +1,33 @@
import { vi } from 'vitest';
const mockApiService = {
validateAuth: vi.fn().mockResolvedValue({ authValid: true, serverUp: true }),
checkApplicationExist: vi
.fn()
.mockResolvedValue({ success: true, data: false }),
createApplication: vi
.fn()
.mockResolvedValue({ success: true, data: { id: 'mock-id' } }),
syncApplication: vi.fn().mockResolvedValue({ success: true, data: true }),
uploadFile: vi.fn().mockResolvedValue({ success: true, data: true }),
};
vi.mock('@/cli/utilities/api/api-service', () => ({
ApiService: class {
validateAuth = mockApiService.validateAuth;
checkApplicationExist = mockApiService.checkApplicationExist;
createApplication = mockApiService.createApplication;
syncApplication = mockApiService.syncApplication;
uploadFile = mockApiService.uploadFile;
},
}));
vi.mock('@/cli/utilities/file/file-uploader', () => ({
FileUploader: class {
uploadFile = vi.fn().mockResolvedValue({ success: true, data: true });
},
}));
vi.mock('@/cli/utilities/dev/dev-ui', () => ({
renderDevUI: vi.fn().mockResolvedValue({ unmount: vi.fn() }),
}));