@objectql/cli 1.8.3 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +157 -1
  2. package/dist/commands/ai.js +4 -3
  3. package/dist/commands/ai.js.map +1 -1
  4. package/dist/commands/build.d.ts +12 -0
  5. package/dist/commands/build.js +119 -0
  6. package/dist/commands/build.js.map +1 -0
  7. package/dist/commands/database-push.d.ts +5 -0
  8. package/dist/commands/database-push.js +15 -0
  9. package/dist/commands/database-push.js.map +1 -0
  10. package/dist/commands/dev.d.ts +11 -0
  11. package/dist/commands/dev.js +111 -0
  12. package/dist/commands/dev.js.map +1 -0
  13. package/dist/commands/doctor.d.ts +4 -0
  14. package/dist/commands/doctor.js +37 -0
  15. package/dist/commands/doctor.js.map +1 -0
  16. package/dist/commands/format.d.ts +9 -0
  17. package/dist/commands/format.js +137 -0
  18. package/dist/commands/format.js.map +1 -0
  19. package/dist/commands/init.js +31 -30
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/lint.d.ts +9 -0
  22. package/dist/commands/lint.js +120 -0
  23. package/dist/commands/lint.js.map +1 -0
  24. package/dist/commands/new.js +0 -52
  25. package/dist/commands/new.js.map +1 -1
  26. package/dist/commands/serve.d.ts +2 -0
  27. package/dist/commands/serve.js +122 -46
  28. package/dist/commands/serve.js.map +1 -1
  29. package/dist/commands/start.d.ts +12 -0
  30. package/dist/commands/start.js +134 -0
  31. package/dist/commands/start.js.map +1 -0
  32. package/dist/commands/test.d.ts +10 -0
  33. package/dist/commands/test.js +120 -0
  34. package/dist/commands/test.js.map +1 -0
  35. package/dist/index.js +189 -149
  36. package/dist/index.js.map +1 -1
  37. package/package.json +13 -8
  38. package/templates/hello-world/.vscode/extensions.json +7 -0
  39. package/templates/hello-world/CHANGELOG.md +41 -0
  40. package/templates/hello-world/README.md +29 -0
  41. package/templates/hello-world/package.json +24 -0
  42. package/templates/hello-world/src/index.ts +58 -0
  43. package/templates/hello-world/tsconfig.json +10 -0
  44. package/templates/starter/.vscode/extensions.json +7 -0
  45. package/{CHANGELOG.md → templates/starter/CHANGELOG.md} +47 -41
  46. package/templates/starter/README.md +17 -0
  47. package/templates/starter/__tests__/projects-hooks-actions.test.ts +490 -0
  48. package/templates/starter/jest.config.js +16 -0
  49. package/templates/starter/package.json +52 -0
  50. package/templates/starter/src/README.pages.md +110 -0
  51. package/templates/starter/src/demo.app.yml +4 -0
  52. package/templates/starter/src/i18n/zh-CN/projects.json +22 -0
  53. package/templates/starter/src/modules/kitchen-sink/kitchen_sink.data.yml +18 -0
  54. package/templates/starter/src/modules/kitchen-sink/kitchen_sink.object.yml +156 -0
  55. package/templates/starter/src/modules/projects/project_approval.workflow.yml +51 -0
  56. package/templates/starter/src/modules/projects/projects.action.ts +472 -0
  57. package/templates/starter/src/modules/projects/projects.data.yml +13 -0
  58. package/templates/starter/src/modules/projects/projects.hook.ts +339 -0
  59. package/templates/starter/src/modules/projects/projects.object.yml +148 -0
  60. package/templates/starter/src/modules/projects/projects.permission.yml +141 -0
  61. package/templates/starter/src/modules/projects/projects.validation.yml +37 -0
  62. package/templates/starter/src/modules/tasks/tasks.data.yml +23 -0
  63. package/templates/starter/src/modules/tasks/tasks.object.yml +34 -0
  64. package/templates/starter/src/modules/tasks/tasks.permission.yml +167 -0
  65. package/templates/starter/src/seed.ts +55 -0
  66. package/templates/starter/src/types/index.ts +3 -0
  67. package/templates/starter/src/types/kitchen_sink.ts +101 -0
  68. package/templates/starter/src/types/projects.ts +49 -0
  69. package/templates/starter/src/types/tasks.ts +33 -0
  70. package/templates/starter/tsconfig.json +11 -0
  71. package/templates/starter/tsconfig.tsbuildinfo +1 -0
  72. package/AI_EXAMPLES.md +0 -154
  73. package/AI_IMPLEMENTATION_SUMMARY.md +0 -509
  74. package/AI_TUTORIAL.md +0 -144
  75. package/IMPLEMENTATION_SUMMARY.md +0 -437
  76. package/USAGE_EXAMPLES.md +0 -951
  77. package/__tests__/commands.test.ts +0 -316
  78. package/dist/commands/studio.d.ts +0 -5
  79. package/dist/commands/studio.js +0 -364
  80. package/dist/commands/studio.js.map +0 -1
  81. package/jest.config.js +0 -19
  82. package/src/commands/ai.ts +0 -508
  83. package/src/commands/generate.ts +0 -135
  84. package/src/commands/i18n.ts +0 -303
  85. package/src/commands/init.ts +0 -191
  86. package/src/commands/migrate.ts +0 -314
  87. package/src/commands/new.ts +0 -273
  88. package/src/commands/repl.ts +0 -120
  89. package/src/commands/serve.ts +0 -96
  90. package/src/commands/studio.ts +0 -354
  91. package/src/commands/sync.ts +0 -328
  92. package/src/index.ts +0 -274
  93. package/tsconfig.json +0 -15
  94. package/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"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"}
package/jest.config.js DELETED
@@ -1,19 +0,0 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- testEnvironment: 'node',
4
- testMatch: ['**/__tests__/**/*.test.ts'],
5
- moduleNameMapper: {
6
- '^@objectql/types$': '<rootDir>/../../foundation/types/src',
7
- '^@objectql/core$': '<rootDir>/../../foundation/core/src',
8
- '^@objectql/driver-sql$': '<rootDir>/../../drivers/sql/src',
9
- '^@objectql/driver-mongo$': '<rootDir>/../../drivers/mongo/src',
10
- '^@objectql/sdk$': '<rootDir>/../../drivers/sdk/src',
11
- '^@objectql/platform-node$': '<rootDir>/../../foundation/platform-node/src',
12
- '^@objectql/server$': '<rootDir>/../../runtime/server/src',
13
- },
14
- transform: {
15
- '^.+\\.ts$': ['ts-jest', {
16
- isolatedModules: true,
17
- }],
18
- },
19
- };
@@ -1,508 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as yaml from 'js-yaml';
4
- import * as readline from 'readline';
5
- import chalk from 'chalk';
6
- import OpenAI from 'openai';
7
- import { Validator, ObjectQLAgent } from '@objectql/core';
8
- import { glob } from 'fast-glob';
9
-
10
- /**
11
- * Create an ObjectQL AI agent instance
12
- */
13
- export function createAgent(apiKey: string): ObjectQLAgent {
14
- return new ObjectQLAgent({ apiKey });
15
- }
16
-
17
- interface GenerateOptions {
18
- description: string;
19
- output?: string;
20
- type?: 'basic' | 'complete' | 'custom';
21
- }
22
-
23
- interface ValidateOptions {
24
- path: string;
25
- fix?: boolean;
26
- verbose?: boolean;
27
- }
28
-
29
- interface ChatOptions {
30
- initialPrompt?: string;
31
- }
32
-
33
- interface ConversationalOptions {
34
- output?: string;
35
- }
36
-
37
- /**
38
- * Conversational generation with step-by-step refinement
39
- */
40
- export async function aiConversational(options: ConversationalOptions): Promise<void> {
41
- const apiKey = process.env.OPENAI_API_KEY;
42
- if (!apiKey) {
43
- console.error(chalk.red('Error: OPENAI_API_KEY environment variable is not set.'));
44
- console.log(chalk.yellow('\nPlease set your OpenAI API key:'));
45
- console.log(chalk.cyan(' export OPENAI_API_KEY=your-api-key-here'));
46
- process.exit(1);
47
- }
48
-
49
- const outputDir = options.output || './src';
50
- const agent = createAgent(apiKey);
51
-
52
- console.log(chalk.blue('💬 ObjectQL Conversational Generator\n'));
53
- console.log(chalk.gray('Build your application step by step through conversation.'));
54
- console.log(chalk.gray('Type "done" to finish and save, "exit" to quit without saving.\n'));
55
-
56
- const rl = readline.createInterface({
57
- input: process.stdin,
58
- output: process.stdout,
59
- });
60
-
61
- let conversationHistory: any[] = [];
62
- let currentApp: any = null;
63
- let fileCount = 0;
64
-
65
- const askQuestion = () => {
66
- const prompt = currentApp
67
- ? chalk.cyan('\nWhat would you like to change or add? ')
68
- : chalk.cyan('Describe your application: ');
69
-
70
- rl.question(prompt, async (input: string) => {
71
- if (input.toLowerCase() === 'exit') {
72
- console.log(chalk.blue('\n👋 Goodbye! No files were saved.'));
73
- rl.close();
74
- return;
75
- }
76
-
77
- if (input.toLowerCase() === 'done') {
78
- if (!currentApp || !currentApp.files || currentApp.files.length === 0) {
79
- console.log(chalk.yellow('\n⚠️ No application generated yet. Continue the conversation or type "exit" to quit.'));
80
- askQuestion();
81
- return;
82
- }
83
-
84
- // Save files
85
- console.log(chalk.yellow('\n💾 Saving files...'));
86
-
87
- if (!fs.existsSync(outputDir)) {
88
- fs.mkdirSync(outputDir, { recursive: true });
89
- }
90
-
91
- for (const file of currentApp.files) {
92
- const filePath = path.join(outputDir, file.filename);
93
- const fileDir = path.dirname(filePath);
94
-
95
- if (!fs.existsSync(fileDir)) {
96
- fs.mkdirSync(fileDir, { recursive: true });
97
- }
98
-
99
- fs.writeFileSync(filePath, file.content);
100
- console.log(chalk.green(` ✓ ${file.filename}`));
101
- }
102
-
103
- console.log(chalk.blue(`\n✅ Application saved to: ${outputDir}`));
104
- console.log(chalk.gray('\nNext steps:'));
105
- console.log(chalk.cyan(' 1. Review the generated files'));
106
- console.log(chalk.cyan(' 2. Run: objectql ai validate ' + outputDir));
107
- console.log(chalk.cyan(' 3. Test with: objectql serve --dir ' + outputDir));
108
-
109
- rl.close();
110
- return;
111
- }
112
-
113
- if (!input.trim()) {
114
- askQuestion();
115
- return;
116
- }
117
-
118
- console.log(chalk.yellow('\n⏳ Generating...'));
119
-
120
- try {
121
- const result = await agent.generateConversational({
122
- message: input,
123
- conversationHistory,
124
- currentApp,
125
- });
126
-
127
- if (!result.success) {
128
- console.error(chalk.red('\n❌ Error:'), result.errors?.join(', ') || 'Unknown error');
129
- askQuestion();
130
- return;
131
- }
132
-
133
- conversationHistory = result.conversationHistory;
134
- currentApp = result;
135
- fileCount = result.files.length;
136
-
137
- console.log(chalk.green(`\n✅ Generated/Updated ${fileCount} file(s):`));
138
-
139
- // Group files by type
140
- const filesByType: Record<string, string[]> = {};
141
- result.files.forEach(f => {
142
- if (!filesByType[f.type]) filesByType[f.type] = [];
143
- filesByType[f.type].push(f.filename);
144
- });
145
-
146
- Object.entries(filesByType).forEach(([type, files]) => {
147
- console.log(chalk.cyan(` ${type}:`), files.join(', '));
148
- });
149
-
150
- // Show suggestions
151
- if (result.suggestions && result.suggestions.length > 0) {
152
- console.log(chalk.blue('\n💡 Suggestions:'));
153
- result.suggestions.forEach(s => console.log(chalk.gray(` • ${s}`)));
154
- }
155
-
156
- console.log(chalk.gray('\nYou can now:'));
157
- console.log(chalk.gray(' • Request changes (e.g., "Add email validation to user")'));
158
- console.log(chalk.gray(' • Add features (e.g., "Add a workflow for approval")'));
159
- console.log(chalk.gray(' • Type "done" to save files'));
160
- console.log(chalk.gray(' • Type "exit" to quit without saving'));
161
-
162
- } catch (error) {
163
- console.error(chalk.red('\n❌ Error:'), error instanceof Error ? error.message : 'Unknown error');
164
- }
165
-
166
- askQuestion();
167
- });
168
- };
169
-
170
- askQuestion();
171
- }
172
-
173
- /**
174
- * Generate application metadata using AI
175
- */
176
- export async function aiGenerate(options: GenerateOptions): Promise<void> {
177
- const apiKey = process.env.OPENAI_API_KEY;
178
- if (!apiKey) {
179
- console.error(chalk.red('Error: OPENAI_API_KEY environment variable is not set.'));
180
- console.log(chalk.yellow('\nPlease set your OpenAI API key:'));
181
- console.log(chalk.cyan(' export OPENAI_API_KEY=your-api-key-here'));
182
- process.exit(1);
183
- }
184
-
185
- const outputDir = options.output || './src';
186
-
187
- console.log(chalk.blue('🤖 ObjectQL AI Generator\n'));
188
- console.log(chalk.gray(`Description: ${options.description}`));
189
- console.log(chalk.gray(`Output directory: ${outputDir}\n`));
190
-
191
- console.log(chalk.yellow('⏳ Generating metadata...'));
192
-
193
- try {
194
- const agent = createAgent(apiKey);
195
- const result = await agent.generateApp({
196
- description: options.description,
197
- type: options.type || 'custom',
198
- });
199
-
200
- if (!result.success || result.files.length === 0) {
201
- console.log(chalk.yellow('\n⚠️ No valid metadata files generated.'));
202
- if (result.errors) {
203
- result.errors.forEach(err => console.error(chalk.red(` Error: ${err}`)));
204
- }
205
- if (result.rawResponse) {
206
- console.log(chalk.gray('\nResponse:'));
207
- console.log(result.rawResponse);
208
- }
209
- return;
210
- }
211
-
212
- // Create output directory if it doesn't exist
213
- if (!fs.existsSync(outputDir)) {
214
- fs.mkdirSync(outputDir, { recursive: true });
215
- }
216
-
217
- // Write files
218
- console.log(chalk.green('\n✅ Generated files:'));
219
- for (const file of result.files) {
220
- const filePath = path.join(outputDir, file.filename);
221
- const fileDir = path.dirname(filePath);
222
-
223
- if (!fs.existsSync(fileDir)) {
224
- fs.mkdirSync(fileDir, { recursive: true });
225
- }
226
-
227
- fs.writeFileSync(filePath, file.content);
228
- console.log(chalk.green(` ✓ ${file.filename} (${file.type})`));
229
- }
230
-
231
- console.log(chalk.blue(`\n📁 Files written to: ${outputDir}`));
232
- console.log(chalk.gray('\nNext steps:'));
233
- console.log(chalk.cyan(' 1. Review the generated files'));
234
- console.log(chalk.cyan(' 2. Run: objectql ai validate <path>'));
235
- console.log(chalk.cyan(' 3. Test with: objectql serve'));
236
-
237
- } catch (error) {
238
- console.error(chalk.red('\n❌ Error generating metadata:'));
239
- if (error instanceof Error) {
240
- console.error(chalk.red(error.message));
241
- }
242
- process.exit(1);
243
- }
244
- }
245
-
246
- /**
247
- * Validate metadata files using AI
248
- */
249
- export async function aiValidate(options: ValidateOptions): Promise<void> {
250
- const apiKey = process.env.OPENAI_API_KEY;
251
-
252
- if (!apiKey) {
253
- console.error(chalk.red('Error: OPENAI_API_KEY environment variable is not set.'));
254
- console.log(chalk.yellow('\nNote: AI validation requires OpenAI API key.'));
255
- console.log(chalk.yellow('Falling back to basic validation...\n'));
256
- await basicValidate(options);
257
- return;
258
- }
259
-
260
- console.log(chalk.blue('🔍 ObjectQL AI Validator\n'));
261
-
262
- // Find all metadata files
263
- const patterns = [
264
- '**/*.object.yml',
265
- '**/*.validation.yml',
266
- '**/*.form.yml',
267
- '**/*.view.yml',
268
- '**/*.page.yml',
269
- '**/*.action.yml',
270
- ];
271
-
272
- const files = await glob(patterns, {
273
- cwd: options.path,
274
- absolute: true,
275
- ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
276
- });
277
-
278
- if (files.length === 0) {
279
- console.log(chalk.yellow('No metadata files found.'));
280
- return;
281
- }
282
-
283
- console.log(chalk.gray(`Found ${files.length} metadata file(s)\n`));
284
-
285
- const agent = createAgent(apiKey);
286
- let errorCount = 0;
287
- let warningCount = 0;
288
-
289
- for (const filePath of files) {
290
- const relativePath = path.relative(options.path, filePath);
291
- console.log(chalk.cyan(`\n📄 ${relativePath}`));
292
-
293
- try {
294
- const content = fs.readFileSync(filePath, 'utf-8');
295
-
296
- // Validate using AI agent
297
- const result = await agent.validateMetadata({
298
- metadata: content,
299
- filename: relativePath,
300
- checkBusinessLogic: true,
301
- checkPerformance: true,
302
- checkSecurity: true,
303
- });
304
-
305
- // Display results
306
- if (result.errors.length > 0) {
307
- result.errors.forEach(error => {
308
- console.log(chalk.red(` ❌ ERROR: ${error.message}`));
309
- if (error.location) {
310
- console.log(chalk.gray(` Location: ${error.location}`));
311
- }
312
- });
313
- errorCount += result.errors.length;
314
- }
315
-
316
- if (result.warnings.length > 0) {
317
- result.warnings.forEach(warning => {
318
- console.log(chalk.yellow(` ⚠️ WARNING: ${warning.message}`));
319
- if (warning.suggestion) {
320
- console.log(chalk.gray(` Suggestion: ${warning.suggestion}`));
321
- }
322
- });
323
- warningCount += result.warnings.length;
324
- }
325
-
326
- if (options.verbose && result.info.length > 0) {
327
- result.info.forEach(info => {
328
- console.log(chalk.blue(` ℹ️ INFO: ${info.message}`));
329
- });
330
- }
331
-
332
- if (result.valid && result.warnings.length === 0) {
333
- console.log(chalk.green(' ✓ No issues found'));
334
- }
335
-
336
- } catch (error) {
337
- console.log(chalk.red(` ❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
338
- errorCount++;
339
- }
340
- }
341
-
342
- // Summary
343
- console.log(chalk.blue('\n' + '='.repeat(60)));
344
- console.log(chalk.blue('Validation Summary:'));
345
- console.log(chalk.gray(` Files checked: ${files.length}`));
346
-
347
- if (errorCount > 0) {
348
- console.log(chalk.red(` Errors: ${errorCount}`));
349
- }
350
- if (warningCount > 0) {
351
- console.log(chalk.yellow(` Warnings: ${warningCount}`));
352
- }
353
- if (errorCount === 0 && warningCount === 0) {
354
- console.log(chalk.green(' ✓ All files validated successfully!'));
355
- }
356
-
357
- if (errorCount > 0) {
358
- process.exit(1);
359
- }
360
- }
361
-
362
- /**
363
- * Basic validation without AI (fallback)
364
- */
365
- async function basicValidate(options: ValidateOptions): Promise<void> {
366
- const patterns = [
367
- '**/*.object.yml',
368
- '**/*.validation.yml',
369
- ];
370
-
371
- const files = await glob(patterns, {
372
- cwd: options.path,
373
- absolute: true,
374
- ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
375
- });
376
-
377
- if (files.length === 0) {
378
- console.log(chalk.yellow('No metadata files found.'));
379
- return;
380
- }
381
-
382
- console.log(chalk.gray(`Found ${files.length} metadata file(s)\n`));
383
-
384
- let errorCount = 0;
385
- const validator = new Validator({ language: 'en' });
386
-
387
- for (const filePath of files) {
388
- const relativePath = path.relative(options.path, filePath);
389
- console.log(chalk.cyan(`📄 ${relativePath}`));
390
-
391
- try {
392
- const content = fs.readFileSync(filePath, 'utf-8');
393
- const data = yaml.load(content) as any;
394
-
395
- // Validate YAML structure
396
- if (!data || typeof data !== 'object') {
397
- console.log(chalk.red(' ❌ Invalid YAML structure'));
398
- errorCount++;
399
- continue;
400
- }
401
-
402
- // Validate based on file type
403
- if (filePath.endsWith('.validation.yml')) {
404
- if (!data.rules || !Array.isArray(data.rules)) {
405
- console.log(chalk.yellow(' ⚠️ No validation rules found'));
406
- } else {
407
- console.log(chalk.green(` ✓ ${data.rules.length} validation rule(s) found`));
408
- }
409
- } else if (filePath.endsWith('.object.yml')) {
410
- if (!data.fields || typeof data.fields !== 'object') {
411
- console.log(chalk.red(' ❌ No fields defined'));
412
- errorCount++;
413
- } else {
414
- const fieldCount = Object.keys(data.fields).length;
415
- console.log(chalk.green(` ✓ ${fieldCount} field(s) defined`));
416
- }
417
- }
418
-
419
- } catch (error) {
420
- console.log(chalk.red(` ❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
421
- errorCount++;
422
- }
423
- }
424
-
425
- console.log(chalk.blue('\n' + '='.repeat(60)));
426
- if (errorCount === 0) {
427
- console.log(chalk.green('✓ Basic validation passed'));
428
- } else {
429
- console.log(chalk.red(`❌ Found ${errorCount} error(s)`));
430
- process.exit(1);
431
- }
432
- }
433
-
434
- /**
435
- * Interactive AI chat for metadata assistance
436
- */
437
- export async function aiChat(options: ChatOptions): Promise<void> {
438
- const apiKey = process.env.OPENAI_API_KEY;
439
- if (!apiKey) {
440
- console.error(chalk.red('Error: OPENAI_API_KEY environment variable is not set.'));
441
- process.exit(1);
442
- }
443
-
444
- const openai = new OpenAI({ apiKey });
445
-
446
- console.log(chalk.blue('💬 ObjectQL AI Assistant\n'));
447
- console.log(chalk.gray('Ask me anything about ObjectQL metadata, data modeling, or best practices.'));
448
- console.log(chalk.gray('Type "exit" to quit.\n'));
449
-
450
- const rl = readline.createInterface({
451
- input: process.stdin,
452
- output: process.stdout,
453
- });
454
-
455
- const systemPrompt = `You are an expert ObjectQL architect and consultant. Help users with:
456
- - ObjectQL metadata specifications
457
- - Data modeling best practices
458
- - Validation rules and business logic
459
- - Relationships and field types
460
- - Application architecture
461
- - Performance and security considerations
462
-
463
- Provide clear, actionable advice with examples when appropriate.`;
464
-
465
- const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
466
- { role: 'system', content: systemPrompt }
467
- ];
468
-
469
- if (options.initialPrompt) {
470
- messages.push({ role: 'user', content: options.initialPrompt });
471
- }
472
-
473
- const askQuestion = () => {
474
- rl.question(chalk.cyan('You: '), async (input: string) => {
475
- if (input.toLowerCase() === 'exit') {
476
- console.log(chalk.blue('\nGoodbye! 👋'));
477
- rl.close();
478
- return;
479
- }
480
-
481
- if (!input.trim()) {
482
- askQuestion();
483
- return;
484
- }
485
-
486
- messages.push({ role: 'user', content: input });
487
-
488
- try {
489
- const completion = await openai.chat.completions.create({
490
- model: process.env.OPENAI_MODEL || 'gpt-4',
491
- messages: messages,
492
- temperature: 0.7,
493
- });
494
-
495
- const response = completion.choices[0]?.message?.content || 'No response';
496
- messages.push({ role: 'assistant', content: response });
497
-
498
- console.log(chalk.green('\nAssistant: ') + response + '\n');
499
- } catch (error) {
500
- console.error(chalk.red('\nError: ') + (error instanceof Error ? error.message : 'Unknown error') + '\n');
501
- }
502
-
503
- askQuestion();
504
- });
505
- };
506
-
507
- askQuestion();
508
- }
@@ -1,135 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { loadObjectConfigs } from '@objectql/platform-node';
4
- import { ObjectConfig, FieldConfig } from '@objectql/types';
5
-
6
- export async function generateTypes(sourceDir: string, outputDir: string) {
7
- console.log(`Searching for objects in ${sourceDir}...`);
8
-
9
- // Use Loader to get Merged Objects (Flat list)
10
- let schemas: Record<string, ObjectConfig>;
11
- try {
12
- schemas = loadObjectConfigs(sourceDir);
13
- } catch (e) {
14
- console.error('Failed to load object configs:', e);
15
- return;
16
- }
17
-
18
- if (Object.keys(schemas).length === 0) {
19
- console.log('No object files found.');
20
- return;
21
- }
22
-
23
- // Ensure output dir exists
24
- if (!fs.existsSync(outputDir)) {
25
- fs.mkdirSync(outputDir, { recursive: true });
26
- }
27
-
28
- const indexContent: string[] = [];
29
-
30
- for (const [name, schema] of Object.entries(schemas)) {
31
- try {
32
- const typeName = toPascalCase(name);
33
- const typeDefinition = generateInterface(typeName, schema);
34
-
35
- // Generate flat files based on Object Name
36
- // e.g. User.ts, CrmContact.ts
37
- // We lose original directory structure but gain correct merged types.
38
- // This is arguably better for "Generated Types" which are usually a flat library.
39
-
40
- const fileName = `${name}.ts`;
41
- const outPath = path.join(outputDir, fileName);
42
- fs.writeFileSync(outPath, typeDefinition);
43
- console.log(`Generated ${fileName}`);
44
-
45
- indexContent.push(`export * from './${name}';`);
46
- } catch (e) {
47
- console.error(`Failed to generate type for ${name}:`, e);
48
- }
49
- }
50
-
51
- // Generate index.ts
52
- fs.writeFileSync(path.join(outputDir, 'index.ts'), indexContent.join('\n'));
53
- console.log(`Generated types in ${outputDir}`);
54
- }
55
-
56
- function generateInterface(typeName: string, schema: ObjectConfig): string {
57
- const fields = schema.fields || {};
58
- const lines = [
59
- `// Auto-generated by ObjectQL. DO NOT EDIT.`,
60
- `import { ObjectDoc } from '@objectql/types';`, // Assuming a base type exists or we define it
61
- ``,
62
- `export interface ${typeName} extends ObjectDoc {`
63
- ];
64
-
65
- for (const [key, field] of Object.entries(fields)) {
66
- const fieldName = field.name || key;
67
- const isOptional = !field.required;
68
- const tsType = mapFieldTypeToTs(field);
69
-
70
- // Add JSDoc
71
- if (field.label || field.description) {
72
- lines.push(` /**`);
73
- if (field.label) lines.push(` * ${field.label}`);
74
- if (field.description) lines.push(` * ${field.description}`);
75
- lines.push(` */`);
76
- }
77
-
78
- lines.push(` ${fieldName}${isOptional ? '?' : ''}: ${tsType};`);
79
- }
80
-
81
- lines.push(`}`);
82
- lines.push(``);
83
- return lines.join('\n');
84
- }
85
-
86
- function mapFieldTypeToTs(field: FieldConfig): string {
87
- switch (field.type) {
88
- case 'text':
89
- case 'textarea':
90
- case 'markdown':
91
- case 'html':
92
- case 'email':
93
- case 'phone':
94
- case 'url':
95
- case 'password':
96
- case 'select': // Could be stricter if options are strings
97
- return 'string';
98
-
99
- case 'number':
100
- case 'currency':
101
- case 'percent':
102
- case 'auto_number':
103
- return 'number';
104
-
105
- case 'boolean':
106
- return 'boolean';
107
-
108
- case 'date':
109
- case 'datetime':
110
- case 'time':
111
- return 'Date | string';
112
-
113
- case 'vector':
114
- return 'number[]';
115
-
116
- case 'file':
117
- case 'image':
118
- return field.multiple ? 'any[]' : 'any'; // Simplified for now
119
-
120
- case 'object':
121
- case 'location':
122
- return 'any';
123
-
124
- case 'lookup':
125
- case 'master_detail':
126
- return 'string | number'; // The ID
127
-
128
- default:
129
- return 'any';
130
- }
131
- }
132
-
133
- function toPascalCase(str: string): string {
134
- return str.replace(/(^\w|_\w)/g, m => m.replace('_', '').toUpperCase());
135
- }