a735e3dfef
# Introduction
- fix twenty-apps hello world deps lockfile
- improve error response format in application resolver
- fixed tests by adding applicationId back to serverless function
service v2
## New log format
We should have a tmp logs folder where we write the errors so the user
can see the whole of them such as what's done in yarn logs
```ts
console.log
✓ Client generated successfully!
at GenerateService.generateClient (src/services/generate.service.ts:58:13)
console.log
Generated files at: /Users/paulrastoin/ws/twenty/packages/twenty-apps/hello-world/generated
at GenerateService.generateClient (src/services/generate.service.ts:59:13)
console.error
❌ Serverless functions Sync failed: {
message: 'Multiple validation errors occurred while creating serverless function',
extensions: {
code: 'METADATA_VALIDATION_FAILED',
errors: {
fieldMetadata: [],
objectMetadata: [],
view: [],
viewField: [],
viewGroup: [],
index: [],
serverlessFunction: [Array],
cronTrigger: [],
databaseEventTrigger: [],
routeTrigger: [],
viewFilter: []
},
summary: {
invalidViewFilter: 0,
invalidObjectMetadata: 0,
invalidView: 0,
invalidViewField: 0,
invalidIndex: 0,
invalidServerlessFunction: 0,
invalidDatabaseEventTrigger: 0,
invalidCronTrigger: 0,
invalidRouteTrigger: 0,
invalidFieldMetadata: 0,
invalidViewGroup: 0,
totalErrors: 0
},
message: 'Validation failed for 0 object(s) and 0 field(s)',
userFriendlyMessage: 'Validation failed for 0 object(s) and 0 field(s)'
}
}
63 | JSON.stringify(serverlessSyncResult.error, null, 2),
64 | );
> 65 | console.error(
| ^
66 | chalk.red('❌ Serverless functions Sync failed:'),
67 | serverlessSyncResult.error,
68 | );
at AppSyncCommand.synchronize (src/commands/app-sync.command.ts:65:15)
at async AppSyncCommand.execute (src/commands/app-sync.command.ts:21:14)
at async Object.<anonymous> (src/__tests__/e2e/applications-install-delete-reinstall.e2e-spec.ts:28:22)
```
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import { generate } from '@genql/cli';
|
|
import chalk from 'chalk';
|
|
import { join, resolve } from 'path';
|
|
import { ApiService } from './api.service';
|
|
import { ConfigService } from './config.service';
|
|
|
|
export const GENERATED_FOLDER_NAME = 'generated';
|
|
|
|
export class GenerateService {
|
|
private configService: ConfigService;
|
|
private apiService: ApiService;
|
|
|
|
constructor() {
|
|
this.configService = new ConfigService();
|
|
this.apiService = new ApiService();
|
|
}
|
|
|
|
async generateClient(appPath: string): Promise<void> {
|
|
const outputPath = join(appPath, GENERATED_FOLDER_NAME);
|
|
|
|
console.log(chalk.blue('📦 Generating Twenty client...'));
|
|
console.log(chalk.gray(`📁 Output Path: ${outputPath}`));
|
|
console.log('');
|
|
const config = await this.configService.getConfig();
|
|
|
|
const url = config.apiUrl;
|
|
const token = config.apiKey;
|
|
|
|
if (!url || !token) {
|
|
console.log(
|
|
chalk.yellow(
|
|
'⚠️ Skipping Client generation: API URL or token not configured',
|
|
),
|
|
);
|
|
return;
|
|
}
|
|
|
|
console.log(chalk.gray(`API URL: ${url}`));
|
|
console.log(chalk.gray(`Output: ${outputPath}`));
|
|
|
|
const getSchemaResponse = await this.apiService.getSchema();
|
|
if (!getSchemaResponse.success) {
|
|
return;
|
|
}
|
|
const { data: schema } = getSchemaResponse;
|
|
|
|
await generate({
|
|
schema,
|
|
output: resolve(outputPath),
|
|
scalarTypes: {
|
|
DateTime: 'string',
|
|
JSON: 'Record<string, unknown>',
|
|
UUID: 'string',
|
|
},
|
|
verbose: true,
|
|
});
|
|
|
|
console.log(chalk.green('✓ Client generated successfully!'));
|
|
console.log(chalk.gray(`Generated files at: ${outputPath}`));
|
|
}
|
|
}
|