@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 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,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/index.js');
@@ -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,4 @@
1
+ export declare function serve(options: {
2
+ port: number;
3
+ dir: string;
4
+ }): Promise<void>;
@@ -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":"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"}
@@ -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
+ }