+37
@@ -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() }),
|
||||
}));
|
||||
Reference in New Issue
Block a user