@objectql/cli 0.2.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.
- package/CHANGELOG.md +15 -0
- package/README.md +46 -0
- package/bin/objectql +2 -0
- package/dist/commands/generate.d.ts +1 -0
- package/dist/commands/generate.js +149 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/repl.d.ts +1 -0
- package/dist/commands/repl.js +143 -0
- package/dist/commands/repl.js.map +1 -0
- package/dist/commands/serve.d.ts +4 -0
- package/dist/commands/serve.js +125 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/package.json +30 -0
- package/src/commands/generate.ts +131 -0
- package/src/commands/repl.ts +120 -0
- package/src/commands/serve.ts +94 -0
- package/src/index.ts +47 -0
- package/tsconfig.json +8 -0
- package/tsconfig.tsbuildinfo +1 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# @objectql/cli
|
|
2
|
+
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 7df2977: ęå objectos
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [7df2977]
|
|
12
|
+
- @objectql/core@1.2.0
|
|
13
|
+
- @objectql/driver-knex@1.2.0
|
|
14
|
+
- @objectql/server@0.2.0
|
|
15
|
+
- @objectql/types@1.2.0
|
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# @objectql/cli
|
|
2
|
+
|
|
3
|
+
Command Line Interface for ObjectQL.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @objectql/cli
|
|
9
|
+
# OR
|
|
10
|
+
pnpm add -D @objectql/cli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Commands
|
|
14
|
+
|
|
15
|
+
### `generate` (alias: `g`)
|
|
16
|
+
|
|
17
|
+
Generate TypeScript interfaces from your `object.yml` definitions.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
objectql generate -s src -o src/generated
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### `serve` (alias: `s`)
|
|
24
|
+
|
|
25
|
+
Start a lightweight development server with an in-memory database. Perfect for rapid prototyping without setting up a backend project.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Start server in current directory (port 3000)
|
|
29
|
+
objectql serve
|
|
30
|
+
|
|
31
|
+
# Specify options
|
|
32
|
+
objectql serve --dir ./src/schema --port 8080
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The server exposes:
|
|
36
|
+
* **Web Console (Swagger UI)**: `http://localhost:<port>/swagger` (GET) - Interactive API explorer.
|
|
37
|
+
* **JSON API Endpoint**: `http://localhost:<port>/` (POST)
|
|
38
|
+
* **OpenAPI Spec**: `http://localhost:<port>/openapi.json` (GET)
|
|
39
|
+
|
|
40
|
+
### `repl` (alias: `r`)
|
|
41
|
+
|
|
42
|
+
Start an interactive shell to query your data.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
objectql repl
|
|
46
|
+
```
|
package/bin/objectql
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateTypes(sourceDir: string, outputDir: string): Promise<void>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generateTypes = generateTypes;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
43
|
+
const yaml = __importStar(require("js-yaml"));
|
|
44
|
+
async function generateTypes(sourceDir, outputDir) {
|
|
45
|
+
console.log(`Searching for objects in ${sourceDir}...`);
|
|
46
|
+
const files = await (0, fast_glob_1.default)(['**/*.object.yml', '**/*.object.yaml'], {
|
|
47
|
+
cwd: sourceDir,
|
|
48
|
+
absolute: true,
|
|
49
|
+
ignore: ['**/node_modules/**']
|
|
50
|
+
});
|
|
51
|
+
if (files.length === 0) {
|
|
52
|
+
console.log('No object files found.');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Ensure output dir exists
|
|
56
|
+
if (!fs.existsSync(outputDir)) {
|
|
57
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
const indexContent = [];
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
62
|
+
try {
|
|
63
|
+
const schema = yaml.load(content);
|
|
64
|
+
if (!schema || !schema.name)
|
|
65
|
+
continue;
|
|
66
|
+
const typeName = toPascalCase(schema.name);
|
|
67
|
+
const typeDefinition = generateInterface(typeName, schema);
|
|
68
|
+
const outPath = path.join(outputDir, `${schema.name}.ts`);
|
|
69
|
+
fs.writeFileSync(outPath, typeDefinition);
|
|
70
|
+
console.log(`Generated ${schema.name}.ts`);
|
|
71
|
+
indexContent.push(`export * from './${schema.name}';`);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.error(`Failed to parse ${file}:`, e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Generate index.ts
|
|
78
|
+
fs.writeFileSync(path.join(outputDir, 'index.ts'), indexContent.join('\n'));
|
|
79
|
+
console.log(`Generated types in ${outputDir}`);
|
|
80
|
+
}
|
|
81
|
+
function generateInterface(typeName, schema) {
|
|
82
|
+
const fields = schema.fields || {};
|
|
83
|
+
const lines = [
|
|
84
|
+
`// Auto-generated by ObjectQL. DO NOT EDIT.`,
|
|
85
|
+
`import { ObjectDoc } from '@objectql/types';`, // Assuming a base type exists or we define it
|
|
86
|
+
``,
|
|
87
|
+
`export interface ${typeName} extends ObjectDoc {`
|
|
88
|
+
];
|
|
89
|
+
for (const [key, field] of Object.entries(fields)) {
|
|
90
|
+
const fieldName = field.name || key;
|
|
91
|
+
const isOptional = !field.required;
|
|
92
|
+
const tsType = mapFieldTypeToTs(field);
|
|
93
|
+
// Add JSDoc
|
|
94
|
+
if (field.label || field.description) {
|
|
95
|
+
lines.push(` /**`);
|
|
96
|
+
if (field.label)
|
|
97
|
+
lines.push(` * ${field.label}`);
|
|
98
|
+
if (field.description)
|
|
99
|
+
lines.push(` * ${field.description}`);
|
|
100
|
+
lines.push(` */`);
|
|
101
|
+
}
|
|
102
|
+
lines.push(` ${fieldName}${isOptional ? '?' : ''}: ${tsType};`);
|
|
103
|
+
}
|
|
104
|
+
lines.push(`}`);
|
|
105
|
+
lines.push(``);
|
|
106
|
+
return lines.join('\n');
|
|
107
|
+
}
|
|
108
|
+
function mapFieldTypeToTs(field) {
|
|
109
|
+
switch (field.type) {
|
|
110
|
+
case 'text':
|
|
111
|
+
case 'textarea':
|
|
112
|
+
case 'markdown':
|
|
113
|
+
case 'html':
|
|
114
|
+
case 'email':
|
|
115
|
+
case 'phone':
|
|
116
|
+
case 'url':
|
|
117
|
+
case 'password':
|
|
118
|
+
case 'select': // Could be stricter if options are strings
|
|
119
|
+
return 'string';
|
|
120
|
+
case 'number':
|
|
121
|
+
case 'currency':
|
|
122
|
+
case 'percent':
|
|
123
|
+
case 'auto_number':
|
|
124
|
+
return 'number';
|
|
125
|
+
case 'boolean':
|
|
126
|
+
return 'boolean';
|
|
127
|
+
case 'date':
|
|
128
|
+
case 'datetime':
|
|
129
|
+
case 'time':
|
|
130
|
+
return 'Date | string';
|
|
131
|
+
case 'vector':
|
|
132
|
+
return 'number[]';
|
|
133
|
+
case 'file':
|
|
134
|
+
case 'image':
|
|
135
|
+
return field.multiple ? 'any[]' : 'any'; // Simplified for now
|
|
136
|
+
case 'object':
|
|
137
|
+
case 'location':
|
|
138
|
+
return 'any';
|
|
139
|
+
case 'lookup':
|
|
140
|
+
case 'master_detail':
|
|
141
|
+
return 'string | number'; // The ID
|
|
142
|
+
default:
|
|
143
|
+
return 'any';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function toPascalCase(str) {
|
|
147
|
+
return str.replace(/(^\w|_\w)/g, m => m.replace('_', '').toUpperCase());
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startRepl(configPath?: string): Promise<void>;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startRepl = startRepl;
|
|
37
|
+
const repl = __importStar(require("repl"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const core_1 = require("@objectql/core");
|
|
41
|
+
const ts_node_1 = require("ts-node");
|
|
42
|
+
async function startRepl(configPath) {
|
|
43
|
+
const cwd = process.cwd();
|
|
44
|
+
// Register ts-node to handle TS config loading
|
|
45
|
+
(0, ts_node_1.register)({
|
|
46
|
+
transpileOnly: true,
|
|
47
|
+
compilerOptions: {
|
|
48
|
+
module: "commonjs"
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// 1. Resolve Config File
|
|
52
|
+
let configFile = configPath;
|
|
53
|
+
if (!configFile) {
|
|
54
|
+
const potentialFiles = ['objectql.config.ts', 'objectql.config.js'];
|
|
55
|
+
for (const file of potentialFiles) {
|
|
56
|
+
if (fs.existsSync(path.join(cwd, file))) {
|
|
57
|
+
configFile = file;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!configFile) {
|
|
63
|
+
console.error("ā No configuration file found (objectql.config.ts/js).");
|
|
64
|
+
console.log("Please create one that exports an ObjectQL instance.");
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
console.log(`š Loading configuration from ${configFile}...`);
|
|
68
|
+
try {
|
|
69
|
+
const configModule = require(path.join(cwd, configFile));
|
|
70
|
+
// Support default export or named export 'app' or 'objectql' or 'db'
|
|
71
|
+
const app = configModule.default || configModule.app || configModule.objectql || configModule.db;
|
|
72
|
+
if (!(app instanceof core_1.ObjectQL)) {
|
|
73
|
+
console.error("ā The config file must export an instance of 'ObjectQL' as default or 'app'/'db'.");
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
// 2. Init ObjectQL
|
|
77
|
+
await app.init();
|
|
78
|
+
console.log("ā
ObjectQL Initialized.");
|
|
79
|
+
// 3. Start REPL
|
|
80
|
+
const r = repl.start({
|
|
81
|
+
prompt: 'objectql> ',
|
|
82
|
+
useColors: true
|
|
83
|
+
});
|
|
84
|
+
// Enable Auto-Await for Promises
|
|
85
|
+
const defaultEval = r.eval;
|
|
86
|
+
r.eval = (cmd, context, filename, callback) => {
|
|
87
|
+
defaultEval.call(r, cmd, context, filename, async (err, result) => {
|
|
88
|
+
if (err)
|
|
89
|
+
return callback(err, null);
|
|
90
|
+
if (result && typeof result.then === 'function') {
|
|
91
|
+
try {
|
|
92
|
+
const value = await result;
|
|
93
|
+
callback(null, value);
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
callback(e, null);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
callback(null, result);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
// 4. Inject Context
|
|
105
|
+
r.context.app = app;
|
|
106
|
+
r.context.db = app; // Alias for db
|
|
107
|
+
r.context.object = (name) => app.getObject(name);
|
|
108
|
+
// Helper to get a repo quickly: tasks.find() instead of app.object('tasks').find()
|
|
109
|
+
const objects = app.metadata.list('object');
|
|
110
|
+
for (const obj of objects) {
|
|
111
|
+
// Inject repositories as top-level globals if valid identifiers
|
|
112
|
+
if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(obj.name)) {
|
|
113
|
+
// We use a getter to lazily create context with system privileges
|
|
114
|
+
Object.defineProperty(r.context, obj.name, {
|
|
115
|
+
get: () => {
|
|
116
|
+
// HACK: We need to construct a repository.
|
|
117
|
+
// Since `ObjectRepository` is exported from `@objectql/core`, we can use it if we import it.
|
|
118
|
+
// But `app` is passed from user land. We can rely on `require('@objectql/core')` here.
|
|
119
|
+
const { ObjectRepository } = require('@objectql/core');
|
|
120
|
+
const replContext = {
|
|
121
|
+
roles: ['admin'],
|
|
122
|
+
isSystem: true,
|
|
123
|
+
userId: 'REPL'
|
|
124
|
+
};
|
|
125
|
+
replContext.object = (n) => new ObjectRepository(n, replContext, app);
|
|
126
|
+
replContext.transaction = async (cb) => cb(replContext);
|
|
127
|
+
replContext.sudo = () => replContext;
|
|
128
|
+
return new ObjectRepository(obj.name, replContext, app);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
console.log(`\nAvailable Objects: ${objects.map((o) => o.name).join(', ')}`);
|
|
134
|
+
console.log(`Usage: tasks.find() (Auto-await enabled)`);
|
|
135
|
+
// Fix for REPL sometimes not showing prompt immediately
|
|
136
|
+
r.displayPrompt();
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error("Failed to load or start:", error);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.serve = serve;
|
|
40
|
+
const core_1 = require("@objectql/core");
|
|
41
|
+
const driver_knex_1 = require("@objectql/driver-knex");
|
|
42
|
+
const server_1 = require("@objectql/server");
|
|
43
|
+
const http_1 = require("http");
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const CONSOLE_HTML = `
|
|
47
|
+
<!DOCTYPE html>
|
|
48
|
+
<html lang="en">
|
|
49
|
+
<head>
|
|
50
|
+
<meta charset="utf-8" />
|
|
51
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
52
|
+
<title>ObjectQL Swagger UI</title>
|
|
53
|
+
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui.css" />
|
|
54
|
+
<style>
|
|
55
|
+
body { margin: 0; padding: 0; }
|
|
56
|
+
</style>
|
|
57
|
+
</head>
|
|
58
|
+
<body>
|
|
59
|
+
<div id="swagger-ui"></div>
|
|
60
|
+
<script src="https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui-bundle.js" crossorigin></script>
|
|
61
|
+
<script>
|
|
62
|
+
window.onload = () => {
|
|
63
|
+
window.ui = SwaggerUIBundle({
|
|
64
|
+
url: '/openapi.json',
|
|
65
|
+
dom_id: '#swagger-ui',
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
</script>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
71
|
+
`;
|
|
72
|
+
async function serve(options) {
|
|
73
|
+
console.log(chalk_1.default.blue('Starting ObjectQL Dev Server...'));
|
|
74
|
+
const rootDir = path.resolve(process.cwd(), options.dir);
|
|
75
|
+
console.log(chalk_1.default.gray(`Loading schema from: ${rootDir}`));
|
|
76
|
+
// 1. Init ObjectQL with in-memory SQLite for Dev
|
|
77
|
+
const app = new core_1.ObjectQL({
|
|
78
|
+
datasources: {
|
|
79
|
+
default: new driver_knex_1.KnexDriver({
|
|
80
|
+
client: 'sqlite3',
|
|
81
|
+
connection: {
|
|
82
|
+
filename: ':memory:' // Or local file './dev.db'
|
|
83
|
+
},
|
|
84
|
+
useNullAsDefault: true
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// 2. Load Schema
|
|
89
|
+
try {
|
|
90
|
+
app.loadFromDirectory(rootDir);
|
|
91
|
+
await app.init();
|
|
92
|
+
console.log(chalk_1.default.green('ā
Schema loaded successfully.'));
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
console.error(chalk_1.default.red('ā Failed to load schema:'), e.message);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
// 3. Create Handler
|
|
99
|
+
const internalHandler = (0, server_1.createNodeHandler)(app);
|
|
100
|
+
// 4. Start Server
|
|
101
|
+
const server = (0, http_1.createServer)(async (req, res) => {
|
|
102
|
+
// Serve Swagger UI
|
|
103
|
+
if (req.method === 'GET' && (req.url === '/swagger' || req.url === '/swagger/')) {
|
|
104
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
105
|
+
res.end(CONSOLE_HTML);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Redirect / to /swagger for better DX
|
|
109
|
+
if (req.method === 'GET' && req.url === '/') {
|
|
110
|
+
res.writeHead(302, { 'Location': '/swagger' });
|
|
111
|
+
res.end();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Delegate to API Handler
|
|
115
|
+
await internalHandler(req, res);
|
|
116
|
+
});
|
|
117
|
+
server.listen(options.port, () => {
|
|
118
|
+
console.log(chalk_1.default.green(`\nš Server ready at http://localhost:${options.port}`));
|
|
119
|
+
console.log(chalk_1.default.green(`š Swagger UI: http://localhost:${options.port}/swagger`));
|
|
120
|
+
console.log(chalk_1.default.blue(`š OpenAPI Spec: http://localhost:${options.port}/openapi.json`));
|
|
121
|
+
console.log(chalk_1.default.gray('\nTry a curl command:'));
|
|
122
|
+
console.log(`curl -X POST http://localhost:${options.port} -H "Content-Type: application/json" -d '{"op": "find", "object": "YourObject", "args": {}}'`);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,sBA2DC;AA7FD,yCAA0C;AAC1C,uDAAmD;AACnD,6CAAqD;AACrD,+BAAoC;AACpC,2CAA6B;AAC7B,kDAA0B;AAE1B,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,CAAC;AAEK,KAAK,UAAU,KAAK,CAAC,OAAsC;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC,CAAC;IAE3D,iDAAiD;IACjD,MAAM,GAAG,GAAG,IAAI,eAAQ,CAAC;QACrB,WAAW,EAAE;YACT,OAAO,EAAE,IAAI,wBAAU,CAAC;gBACpB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE;oBACR,QAAQ,EAAE,UAAU,CAAC,2BAA2B;iBACnD;gBACD,gBAAgB,EAAE,IAAI;aACzB,CAAC;SACL;KACJ,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,CAAC;QACD,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,oBAAoB;IACpB,MAAM,eAAe,GAAG,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAC;IAE/C,kBAAkB;IAClB,MAAM,MAAM,GAAG,IAAA,mBAAY,EAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,mBAAmB;QACnB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,GAAG,KAAK,WAAW,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACtB,OAAO;QACX,CAAC;QAED,uCAAuC;QACvC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/C,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,0BAA0B;QAC1B,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,yCAAyC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qCAAqC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iCAAiC,OAAO,CAAC,IAAI,8FAA8F,CAAC,CAAC;IAC7J,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commander_1 = require("commander");
|
|
4
|
+
const generate_1 = require("./commands/generate");
|
|
5
|
+
const repl_1 = require("./commands/repl");
|
|
6
|
+
const serve_1 = require("./commands/serve");
|
|
7
|
+
const program = new commander_1.Command();
|
|
8
|
+
program
|
|
9
|
+
.name('objectql')
|
|
10
|
+
.description('ObjectQL CLI tool')
|
|
11
|
+
.version('0.1.0');
|
|
12
|
+
program
|
|
13
|
+
.command('generate')
|
|
14
|
+
.alias('g')
|
|
15
|
+
.description('Generate TypeScript interfaces from ObjectQL schema files')
|
|
16
|
+
.option('-s, --source <path>', 'Source directory containing *.object.yml', '.')
|
|
17
|
+
.option('-o, --output <path>', 'Output directory for generated types', './src/generated')
|
|
18
|
+
.action(async (options) => {
|
|
19
|
+
try {
|
|
20
|
+
await (0, generate_1.generateTypes)(options.source, options.output);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error(error);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
program
|
|
28
|
+
.command('repl')
|
|
29
|
+
.alias('r')
|
|
30
|
+
.description('Start an interactive shell (REPL) to query the database')
|
|
31
|
+
.option('-c, --config <path>', 'Path to objectql.config.ts/js')
|
|
32
|
+
.action(async (options) => {
|
|
33
|
+
await (0, repl_1.startRepl)(options.config);
|
|
34
|
+
});
|
|
35
|
+
program
|
|
36
|
+
.command('serve')
|
|
37
|
+
.alias('s')
|
|
38
|
+
.description('Start a development server')
|
|
39
|
+
.option('-p, --port <number>', 'Port to listen on', '3000')
|
|
40
|
+
.option('-d, --dir <path>', 'Directory containing schema', '.')
|
|
41
|
+
.action(async (options) => {
|
|
42
|
+
await (0, serve_1.serve)({ port: parseInt(options.port), dir: options.dir });
|
|
43
|
+
});
|
|
44
|
+
program.parse();
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,kDAAoD;AACpD,0CAA4C;AAC5C,4CAAyC;AAEzC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,mBAAmB,CAAC;KAChC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACF,OAAO,CAAC,UAAU,CAAC;KACnB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,qBAAqB,EAAE,0CAA0C,EAAE,GAAG,CAAC;KAC9E,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,EAAE,iBAAiB,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,IAAI,CAAC;QACD,MAAM,IAAA,wBAAa,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,MAAM,IAAA,gBAAS,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,CAAC;KAC1D,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,MAAM,IAAA,aAAK,EAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@objectql/cli",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"bin": {
|
|
6
|
+
"objectql": "./bin/objectql"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"sqlite3": "^5.1.7",
|
|
10
|
+
"commander": "^11.0.0",
|
|
11
|
+
"chalk": "^4.1.2",
|
|
12
|
+
"fast-glob": "^3.3.0",
|
|
13
|
+
"js-yaml": "^4.1.0",
|
|
14
|
+
"prettier": "^3.0.0",
|
|
15
|
+
"ts-node": "^10.9.1",
|
|
16
|
+
"@objectql/types": "1.2.0",
|
|
17
|
+
"@objectql/core": "1.2.0",
|
|
18
|
+
"@objectql/server": "0.2.0",
|
|
19
|
+
"@objectql/driver-knex": "1.2.0"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"typescript": "^5.0.0",
|
|
23
|
+
"@types/node": "^20.0.0",
|
|
24
|
+
"@types/js-yaml": "^4.0.5"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"watch": "tsc -w"
|
|
29
|
+
}
|
|
30
|
+
}
|