@objectql/cli 1.8.2 → 1.8.4
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.
- package/CHANGELOG.md +27 -0
- package/README.md +229 -0
- package/USAGE_EXAMPLES.md +147 -0
- package/__tests__/commands.test.ts +274 -1
- package/dist/commands/ai.js +4 -3
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/build.d.ts +12 -0
- package/dist/commands/build.js +119 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +9 -0
- package/dist/commands/dev.js +23 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/format.d.ts +9 -0
- package/dist/commands/format.js +137 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/lint.d.ts +9 -0
- package/dist/commands/lint.js +120 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/new.js +5 -52
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/start.d.ts +11 -0
- package/dist/commands/start.js +119 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/sync.d.ts +14 -0
- package/dist/commands/sync.js +314 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/test.d.ts +10 -0
- package/dist/commands/test.js +120 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/index.js +109 -14
- package/dist/index.js.map +1 -1
- package/jest.config.js +19 -0
- package/package.json +7 -7
- package/src/commands/ai.ts +4 -3
- package/src/commands/build.ts +98 -0
- package/src/commands/dev.ts +23 -0
- package/src/commands/format.ts +110 -0
- package/src/commands/lint.ts +98 -0
- package/src/commands/new.ts +5 -52
- package/src/commands/start.ts +100 -0
- package/src/commands/sync.ts +328 -0
- package/src/commands/test.ts +98 -0
- package/src/index.ts +114 -14
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/commands/studio.d.ts +0 -5
- package/dist/commands/studio.js +0 -364
- package/dist/commands/studio.js.map +0 -1
- package/src/commands/studio.ts +0 -354
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,kDAAoD;AACpD,0CAA4C;AAC5C,4CAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectql/cli",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.4",
|
|
4
4
|
"description": "Command-line interface for ObjectQL - Code generation, migrations, REPL, and AI-powered development tools",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"objectql",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"ts-node": "^10.9.1",
|
|
30
30
|
"openai": "^4.28.0",
|
|
31
31
|
"dotenv": "^16.4.5",
|
|
32
|
-
"@objectql/types": "1.8.
|
|
33
|
-
"@objectql/
|
|
34
|
-
"@objectql/
|
|
35
|
-
"@objectql/driver-sql": "1.8.
|
|
36
|
-
"@objectql/platform-node": "1.8.
|
|
32
|
+
"@objectql/types": "1.8.4",
|
|
33
|
+
"@objectql/server": "1.8.4",
|
|
34
|
+
"@objectql/core": "1.8.4",
|
|
35
|
+
"@objectql/driver-sql": "1.8.4",
|
|
36
|
+
"@objectql/platform-node": "1.8.4"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"typescript": "^5.0.0",
|
|
@@ -43,6 +43,6 @@
|
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc",
|
|
45
45
|
"watch": "tsc -w",
|
|
46
|
-
"
|
|
46
|
+
"test": "jest"
|
|
47
47
|
}
|
|
48
48
|
}
|
package/src/commands/ai.ts
CHANGED
|
@@ -263,10 +263,11 @@ export async function aiValidate(options: ValidateOptions): Promise<void> {
|
|
|
263
263
|
const patterns = [
|
|
264
264
|
'**/*.object.yml',
|
|
265
265
|
'**/*.validation.yml',
|
|
266
|
-
'**/*.form.yml',
|
|
267
|
-
'**/*.view.yml',
|
|
268
|
-
'**/*.page.yml',
|
|
269
266
|
'**/*.action.yml',
|
|
267
|
+
'**/*.hook.yml',
|
|
268
|
+
'**/*.permission.yml',
|
|
269
|
+
'**/*.workflow.yml',
|
|
270
|
+
'**/*.data.yml',
|
|
270
271
|
];
|
|
271
272
|
|
|
272
273
|
const files = await glob(patterns, {
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { ObjectQL } from '@objectql/core';
|
|
2
|
+
import { ObjectLoader } from '@objectql/platform-node';
|
|
3
|
+
import { generateTypes } from './generate';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import glob from 'fast-glob';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
|
|
9
|
+
interface BuildOptions {
|
|
10
|
+
dir?: string;
|
|
11
|
+
output?: string;
|
|
12
|
+
types?: boolean;
|
|
13
|
+
validate?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Build command - validates metadata and generates TypeScript types
|
|
18
|
+
* Prepares the project for production deployment
|
|
19
|
+
*/
|
|
20
|
+
export async function build(options: BuildOptions) {
|
|
21
|
+
console.log(chalk.blue('🔨 Building ObjectQL project...\n'));
|
|
22
|
+
|
|
23
|
+
const rootDir = path.resolve(process.cwd(), options.dir || '.');
|
|
24
|
+
const outputDir = path.resolve(process.cwd(), options.output || './dist');
|
|
25
|
+
|
|
26
|
+
// Step 1: Validate metadata
|
|
27
|
+
if (options.validate !== false) {
|
|
28
|
+
console.log(chalk.cyan('1️⃣ Validating metadata files...'));
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const app = new ObjectQL({ datasources: {} });
|
|
32
|
+
const loader = new ObjectLoader(app.metadata);
|
|
33
|
+
loader.load(rootDir);
|
|
34
|
+
console.log(chalk.green(' ✅ Metadata validation passed\n'));
|
|
35
|
+
} catch (e: any) {
|
|
36
|
+
console.error(chalk.red(' ❌ Metadata validation failed:'), e.message);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Step 2: Generate TypeScript types
|
|
42
|
+
if (options.types !== false) {
|
|
43
|
+
console.log(chalk.cyan('2️⃣ Generating TypeScript types...'));
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const typesOutput = path.join(outputDir, 'types');
|
|
47
|
+
await generateTypes(rootDir, typesOutput);
|
|
48
|
+
console.log(chalk.green(` ✅ Types generated at ${typesOutput}\n`));
|
|
49
|
+
} catch (e: any) {
|
|
50
|
+
console.error(chalk.red(' ❌ Type generation failed:'), e.message);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Step 3: Copy metadata files to dist
|
|
56
|
+
console.log(chalk.cyan('3️⃣ Copying metadata files...'));
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
// Ensure output directory exists
|
|
60
|
+
if (!fs.existsSync(outputDir)) {
|
|
61
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Copy .yml files
|
|
65
|
+
const metadataPatterns = [
|
|
66
|
+
'**/*.object.yml',
|
|
67
|
+
'**/*.validation.yml',
|
|
68
|
+
'**/*.permission.yml',
|
|
69
|
+
'**/*.hook.yml',
|
|
70
|
+
'**/*.action.yml',
|
|
71
|
+
'**/*.app.yml'
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
let fileCount = 0;
|
|
75
|
+
const files = await glob(metadataPatterns, { cwd: rootDir });
|
|
76
|
+
|
|
77
|
+
for (const file of files) {
|
|
78
|
+
const srcPath = path.join(rootDir, file);
|
|
79
|
+
const destPath = path.join(outputDir, file);
|
|
80
|
+
const destDir = path.dirname(destPath);
|
|
81
|
+
|
|
82
|
+
if (!fs.existsSync(destDir)) {
|
|
83
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fs.copyFileSync(srcPath, destPath);
|
|
87
|
+
fileCount++;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
console.log(chalk.green(` ✅ Copied ${fileCount} metadata files\n`));
|
|
91
|
+
} catch (e: any) {
|
|
92
|
+
console.error(chalk.red(' ❌ Failed to copy metadata files:'), e.message);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log(chalk.green.bold('✨ Build completed successfully!\n'));
|
|
97
|
+
console.log(chalk.gray(`Output directory: ${outputDir}`));
|
|
98
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { serve } from './serve';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Start development server with hot reload
|
|
6
|
+
* This is an enhanced version of the serve command for development workflow
|
|
7
|
+
*/
|
|
8
|
+
export async function dev(options: {
|
|
9
|
+
port: number;
|
|
10
|
+
dir: string;
|
|
11
|
+
watch?: boolean;
|
|
12
|
+
}) {
|
|
13
|
+
console.log(chalk.cyan('🚀 Starting ObjectQL Development Server...\n'));
|
|
14
|
+
|
|
15
|
+
// For now, delegate to serve command
|
|
16
|
+
// In future, can add file watching and auto-reload
|
|
17
|
+
await serve({ port: options.port, dir: options.dir });
|
|
18
|
+
|
|
19
|
+
if (options.watch !== false) {
|
|
20
|
+
console.log(chalk.yellow('\n👀 Watching for file changes... (Not yet implemented)'));
|
|
21
|
+
console.log(chalk.gray(' Tip: Use --no-watch to disable file watching'));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import * as yaml from 'js-yaml';
|
|
5
|
+
import glob from 'fast-glob';
|
|
6
|
+
|
|
7
|
+
// Naming convention regex
|
|
8
|
+
const VALID_NAME_REGEX = /^[a-z][a-z0-9_]*$/;
|
|
9
|
+
|
|
10
|
+
interface FormatOptions {
|
|
11
|
+
dir?: string;
|
|
12
|
+
check?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Format command - formats metadata files using Prettier
|
|
17
|
+
*/
|
|
18
|
+
export async function format(options: FormatOptions) {
|
|
19
|
+
console.log(chalk.blue('🎨 Formatting ObjectQL metadata files...\n'));
|
|
20
|
+
|
|
21
|
+
const rootDir = path.resolve(process.cwd(), options.dir || '.');
|
|
22
|
+
let formattedCount = 0;
|
|
23
|
+
let unchangedCount = 0;
|
|
24
|
+
let errorCount = 0;
|
|
25
|
+
|
|
26
|
+
// Load Prettier once at the start
|
|
27
|
+
let prettier: any;
|
|
28
|
+
try {
|
|
29
|
+
prettier = await import('prettier');
|
|
30
|
+
} catch (e) {
|
|
31
|
+
console.error(chalk.red('❌ Prettier is not installed. Install it with: npm install --save-dev prettier'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const files = await glob(['**/*.yml', '**/*.yaml'], {
|
|
37
|
+
cwd: rootDir,
|
|
38
|
+
ignore: ['node_modules/**', 'dist/**', 'build/**']
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
console.log(chalk.cyan(`Found ${files.length} YAML file(s)\n`));
|
|
42
|
+
|
|
43
|
+
for (const file of files) {
|
|
44
|
+
const filePath = path.join(rootDir, file);
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
48
|
+
|
|
49
|
+
// Parse to validate YAML
|
|
50
|
+
yaml.load(content);
|
|
51
|
+
|
|
52
|
+
// Format with Prettier
|
|
53
|
+
const formatted = await prettier.format(content, {
|
|
54
|
+
parser: 'yaml',
|
|
55
|
+
printWidth: 80,
|
|
56
|
+
tabWidth: 2,
|
|
57
|
+
singleQuote: true
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
if (content !== formatted) {
|
|
61
|
+
if (options.check) {
|
|
62
|
+
console.log(chalk.yellow(` ⚠️ ${file} needs formatting`));
|
|
63
|
+
formattedCount++;
|
|
64
|
+
} else {
|
|
65
|
+
fs.writeFileSync(filePath, formatted, 'utf-8');
|
|
66
|
+
console.log(chalk.green(` ✅ ${file}`));
|
|
67
|
+
formattedCount++;
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
unchangedCount++;
|
|
71
|
+
if (!options.check) {
|
|
72
|
+
console.log(chalk.gray(` ✓ ${file}`));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} catch (e: any) {
|
|
76
|
+
console.error(chalk.red(` ❌ ${file}: ${e.message}`));
|
|
77
|
+
errorCount++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
console.log('');
|
|
82
|
+
|
|
83
|
+
// Summary
|
|
84
|
+
if (options.check) {
|
|
85
|
+
if (formattedCount > 0) {
|
|
86
|
+
console.log(chalk.yellow.bold(`⚠️ ${formattedCount} file(s) need formatting`));
|
|
87
|
+
console.log(chalk.gray('Run without --check to format files\n'));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
} else {
|
|
90
|
+
console.log(chalk.green.bold('✅ All files are properly formatted!\n'));
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
console.log(chalk.cyan('Summary:'));
|
|
94
|
+
console.log(chalk.green(` ✅ Formatted: ${formattedCount}`));
|
|
95
|
+
console.log(chalk.gray(` ✓ Unchanged: ${unchangedCount}`));
|
|
96
|
+
if (errorCount > 0) {
|
|
97
|
+
console.log(chalk.red(` ❌ Errors: ${errorCount}`));
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
|
|
101
|
+
if (errorCount > 0) {
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
} catch (e: any) {
|
|
107
|
+
console.error(chalk.red('❌ Format failed:'), e.message);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { ObjectQL } from '@objectql/core';
|
|
2
|
+
import { ObjectLoader } from '@objectql/platform-node';
|
|
3
|
+
import { ObjectConfig, FieldConfig } from '@objectql/types';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
|
|
7
|
+
// Naming convention regex
|
|
8
|
+
const VALID_NAME_REGEX = /^[a-z][a-z0-9_]*$/;
|
|
9
|
+
|
|
10
|
+
interface LintOptions {
|
|
11
|
+
dir?: string;
|
|
12
|
+
fix?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Lint command - validates metadata files for correctness and best practices
|
|
17
|
+
*/
|
|
18
|
+
export async function lint(options: LintOptions) {
|
|
19
|
+
console.log(chalk.blue('🔍 Linting ObjectQL metadata files...\n'));
|
|
20
|
+
|
|
21
|
+
const rootDir = path.resolve(process.cwd(), options.dir || '.');
|
|
22
|
+
let hasErrors = false;
|
|
23
|
+
let hasWarnings = false;
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const app = new ObjectQL({ datasources: {} });
|
|
27
|
+
const loader = new ObjectLoader(app.metadata);
|
|
28
|
+
|
|
29
|
+
console.log(chalk.cyan('Loading metadata files...'));
|
|
30
|
+
loader.load(rootDir);
|
|
31
|
+
|
|
32
|
+
const objects = app.metadata.list('object');
|
|
33
|
+
|
|
34
|
+
console.log(chalk.green(`✅ Found ${objects.length} object(s)\n`));
|
|
35
|
+
|
|
36
|
+
// Validate each object
|
|
37
|
+
for (const obj of objects) {
|
|
38
|
+
const objectConfig = obj as ObjectConfig;
|
|
39
|
+
const name = objectConfig.name;
|
|
40
|
+
console.log(chalk.cyan(`Checking object: ${name}`));
|
|
41
|
+
|
|
42
|
+
// Check naming convention (lowercase with underscores)
|
|
43
|
+
if (!VALID_NAME_REGEX.test(name)) {
|
|
44
|
+
console.log(chalk.red(` ❌ Invalid name format: "${name}" should be lowercase with underscores`));
|
|
45
|
+
hasErrors = true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Check if label exists
|
|
49
|
+
if (!objectConfig.label) {
|
|
50
|
+
console.log(chalk.yellow(` ⚠️ Missing label for object "${name}"`));
|
|
51
|
+
hasWarnings = true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check fields
|
|
55
|
+
const fieldCount = Object.keys(objectConfig.fields || {}).length;
|
|
56
|
+
if (fieldCount === 0) {
|
|
57
|
+
console.log(chalk.yellow(` ⚠️ Object "${name}" has no fields defined`));
|
|
58
|
+
hasWarnings = true;
|
|
59
|
+
} else {
|
|
60
|
+
console.log(chalk.gray(` ℹ️ ${fieldCount} field(s) defined`));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Validate field names
|
|
64
|
+
for (const [fieldName, field] of Object.entries(objectConfig.fields || {})) {
|
|
65
|
+
if (!VALID_NAME_REGEX.test(fieldName)) {
|
|
66
|
+
console.log(chalk.red(` ❌ Invalid field name: "${fieldName}" should be lowercase with underscores`));
|
|
67
|
+
hasErrors = true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const fieldConfig = field as FieldConfig;
|
|
71
|
+
// Check for required label on fields
|
|
72
|
+
if (!fieldConfig.label) {
|
|
73
|
+
console.log(chalk.yellow(` ⚠️ Field "${fieldName}" missing label`));
|
|
74
|
+
hasWarnings = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
console.log('');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Summary
|
|
82
|
+
if (hasErrors) {
|
|
83
|
+
console.log(chalk.red.bold('❌ Linting failed with errors\n'));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
} else if (hasWarnings) {
|
|
86
|
+
console.log(chalk.yellow.bold('⚠️ Linting completed with warnings\n'));
|
|
87
|
+
} else {
|
|
88
|
+
console.log(chalk.green.bold('✅ Linting passed - no issues found!\n'));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
} catch (e: any) {
|
|
92
|
+
console.error(chalk.red('❌ Linting failed:'), e.message);
|
|
93
|
+
if (e.stack) {
|
|
94
|
+
console.error(chalk.gray(e.stack));
|
|
95
|
+
}
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
package/src/commands/new.ts
CHANGED
|
@@ -11,16 +11,11 @@ interface NewOptions {
|
|
|
11
11
|
|
|
12
12
|
const METADATA_TYPES = [
|
|
13
13
|
'object',
|
|
14
|
-
'view',
|
|
15
|
-
'form',
|
|
16
|
-
'page',
|
|
17
14
|
'action',
|
|
18
15
|
'hook',
|
|
19
16
|
'permission',
|
|
20
17
|
'validation',
|
|
21
18
|
'workflow',
|
|
22
|
-
'report',
|
|
23
|
-
'menu',
|
|
24
19
|
'data'
|
|
25
20
|
];
|
|
26
21
|
|
|
@@ -35,41 +30,17 @@ const TEMPLATES: Record<string, any> = {
|
|
|
35
30
|
}
|
|
36
31
|
}
|
|
37
32
|
},
|
|
38
|
-
view: {
|
|
39
|
-
label: '{{label}} View',
|
|
40
|
-
object: '{{objectName}}',
|
|
41
|
-
columns: [
|
|
42
|
-
{ field: 'name', label: 'Name' }
|
|
43
|
-
]
|
|
44
|
-
},
|
|
45
|
-
form: {
|
|
46
|
-
label: '{{label}} Form',
|
|
47
|
-
object: '{{objectName}}',
|
|
48
|
-
layout: {
|
|
49
|
-
sections: [
|
|
50
|
-
{
|
|
51
|
-
label: 'Basic Information',
|
|
52
|
-
fields: ['name']
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
page: {
|
|
58
|
-
label: '{{label}} Page',
|
|
59
|
-
type: 'standard',
|
|
60
|
-
components: [
|
|
61
|
-
{
|
|
62
|
-
type: 'title',
|
|
63
|
-
text: '{{label}}'
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
},
|
|
67
33
|
action: {
|
|
68
34
|
label: '{{label}} Action',
|
|
69
35
|
object: '{{objectName}}',
|
|
70
36
|
type: 'record',
|
|
71
37
|
handler: 'action_{{name}}'
|
|
72
38
|
},
|
|
39
|
+
hook: {
|
|
40
|
+
label: '{{label}} Hook',
|
|
41
|
+
object: '{{objectName}}',
|
|
42
|
+
triggers: ['before_insert', 'after_insert']
|
|
43
|
+
},
|
|
73
44
|
permission: {
|
|
74
45
|
label: '{{label}} Permissions',
|
|
75
46
|
object: '{{objectName}}',
|
|
@@ -113,24 +84,6 @@ const TEMPLATES: Record<string, any> = {
|
|
|
113
84
|
}
|
|
114
85
|
]
|
|
115
86
|
},
|
|
116
|
-
report: {
|
|
117
|
-
label: '{{label}} Report',
|
|
118
|
-
type: 'tabular',
|
|
119
|
-
object: '{{objectName}}',
|
|
120
|
-
columns: [
|
|
121
|
-
{ field: 'name', label: 'Name' }
|
|
122
|
-
]
|
|
123
|
-
},
|
|
124
|
-
menu: {
|
|
125
|
-
label: '{{label}} Menu',
|
|
126
|
-
items: [
|
|
127
|
-
{
|
|
128
|
-
label: 'Home',
|
|
129
|
-
page: 'home',
|
|
130
|
-
icon: 'home'
|
|
131
|
-
}
|
|
132
|
-
]
|
|
133
|
-
},
|
|
134
87
|
data: {
|
|
135
88
|
label: '{{label}} Data',
|
|
136
89
|
object: '{{objectName}}',
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ObjectQL } from '@objectql/core';
|
|
2
|
+
import { SqlDriver } from '@objectql/driver-sql';
|
|
3
|
+
import { ObjectLoader } from '@objectql/platform-node';
|
|
4
|
+
import { createNodeHandler } from '@objectql/server';
|
|
5
|
+
import { createServer } from 'http';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
|
|
10
|
+
interface StartOptions {
|
|
11
|
+
port: number;
|
|
12
|
+
dir: string;
|
|
13
|
+
config?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Flexible config type that handles both ObjectQLConfig and custom config formats
|
|
17
|
+
interface LoadedConfig {
|
|
18
|
+
datasources?: Record<string, any>;
|
|
19
|
+
datasource?: Record<string, any>;
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Start production server
|
|
25
|
+
* Loads configuration from objectql.config.ts/js if available
|
|
26
|
+
*/
|
|
27
|
+
export async function start(options: StartOptions) {
|
|
28
|
+
console.log(chalk.blue('Starting ObjectQL Production Server...'));
|
|
29
|
+
|
|
30
|
+
const rootDir = path.resolve(process.cwd(), options.dir);
|
|
31
|
+
console.log(chalk.gray(`Loading schema from: ${rootDir}`));
|
|
32
|
+
|
|
33
|
+
// Try to load configuration
|
|
34
|
+
let config: LoadedConfig | null = null;
|
|
35
|
+
const configPath = options.config || path.join(process.cwd(), 'objectql.config.ts');
|
|
36
|
+
|
|
37
|
+
if (fs.existsSync(configPath)) {
|
|
38
|
+
try {
|
|
39
|
+
console.log(chalk.gray(`Loading config from: ${configPath}`));
|
|
40
|
+
// Use require for .js files or ts-node for .ts files
|
|
41
|
+
if (configPath.endsWith('.ts')) {
|
|
42
|
+
require('ts-node/register');
|
|
43
|
+
}
|
|
44
|
+
const loadedModule = require(configPath);
|
|
45
|
+
// Handle both default export and direct export
|
|
46
|
+
config = loadedModule.default || loadedModule;
|
|
47
|
+
} catch (e: any) {
|
|
48
|
+
console.warn(chalk.yellow(`⚠️ Failed to load config: ${e.message}`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Initialize datasource from config or use default SQLite
|
|
53
|
+
// Note: Config files may use 'datasource' (singular) while ObjectQLConfig uses 'datasources' (plural)
|
|
54
|
+
const datasourceConfig = config?.datasources?.default || config?.datasource?.default || {
|
|
55
|
+
client: 'sqlite3',
|
|
56
|
+
connection: {
|
|
57
|
+
filename: process.env.DATABASE_FILE || './objectql.db'
|
|
58
|
+
},
|
|
59
|
+
useNullAsDefault: true
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const driver = new SqlDriver(datasourceConfig);
|
|
63
|
+
const app = new ObjectQL({
|
|
64
|
+
datasources: { default: driver }
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Load Schema
|
|
68
|
+
try {
|
|
69
|
+
const loader = new ObjectLoader(app.metadata);
|
|
70
|
+
loader.load(rootDir);
|
|
71
|
+
await app.init();
|
|
72
|
+
console.log(chalk.green('✅ Schema loaded successfully.'));
|
|
73
|
+
} catch (e: any) {
|
|
74
|
+
console.error(chalk.red('❌ Failed to load schema:'), e.message);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Create Handler
|
|
79
|
+
const handler = createNodeHandler(app);
|
|
80
|
+
|
|
81
|
+
// Start Server
|
|
82
|
+
const server = createServer(async (req, res) => {
|
|
83
|
+
await handler(req, res);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
server.listen(options.port, () => {
|
|
87
|
+
console.log(chalk.green(`\n✅ Server started in production mode`));
|
|
88
|
+
console.log(chalk.green(`🚀 API endpoint: http://localhost:${options.port}`));
|
|
89
|
+
console.log(chalk.blue(`📖 OpenAPI Spec: http://localhost:${options.port}/openapi.json`));
|
|
90
|
+
|
|
91
|
+
// Handle graceful shutdown
|
|
92
|
+
process.on('SIGTERM', () => {
|
|
93
|
+
console.log(chalk.yellow('\n⚠️ SIGTERM received, shutting down gracefully...'));
|
|
94
|
+
server.close(() => {
|
|
95
|
+
console.log(chalk.green('✅ Server closed'));
|
|
96
|
+
process.exit(0);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|