@objectql/server 0.2.1 → 1.4.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/dist/metadata.js CHANGED
@@ -1,6 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMetadataHandler = createMetadataHandler;
4
+ const types_1 = require("./types");
5
+ function readBody(req) {
6
+ return new Promise((resolve, reject) => {
7
+ let body = '';
8
+ req.on('data', chunk => body += chunk.toString());
9
+ req.on('end', () => {
10
+ if (!body)
11
+ return resolve({});
12
+ try {
13
+ resolve(JSON.parse(body));
14
+ }
15
+ catch (e) {
16
+ reject(e);
17
+ }
18
+ });
19
+ req.on('error', reject);
20
+ });
21
+ }
4
22
  /**
5
23
  * Creates a handler for metadata endpoints.
6
24
  * These endpoints expose information about registered objects.
@@ -9,9 +27,10 @@ function createMetadataHandler(app) {
9
27
  return async (req, res) => {
10
28
  // Parse the URL
11
29
  const url = req.url || '';
30
+ const method = req.method;
12
31
  // CORS headers for development
13
32
  res.setHeader('Access-Control-Allow-Origin', '*');
14
- res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
33
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');
15
34
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
16
35
  if (req.method === 'OPTIONS') {
17
36
  res.statusCode = 200;
@@ -19,14 +38,15 @@ function createMetadataHandler(app) {
19
38
  return;
20
39
  }
21
40
  try {
22
- // GET /api/metadata/objects - List all objects
23
- if (url === '/api/metadata/objects') {
41
+ // GET /api/metadata or /api/metadata/objects - List all objects
42
+ if (method === 'GET' && (url === '/api/metadata' || url === '/api/metadata/objects')) {
24
43
  const configs = app.getConfigs();
25
44
  const objects = Object.values(configs).map(obj => ({
26
45
  name: obj.name,
27
46
  label: obj.label || obj.name,
28
47
  icon: obj.icon,
29
- fields: obj.fields ? Object.keys(obj.fields) : []
48
+ description: obj.description,
49
+ fields: obj.fields || {}
30
50
  }));
31
51
  res.setHeader('Content-Type', 'application/json');
32
52
  res.statusCode = 200;
@@ -34,13 +54,18 @@ function createMetadataHandler(app) {
34
54
  return;
35
55
  }
36
56
  // GET /api/metadata/objects/:name - Get object details
37
- const match = url.match(/^\/api\/metadata\/objects\/([^\/]+)$/);
38
- if (match) {
39
- const objectName = match[1];
57
+ const objectMatch = url.match(/^\/api\/metadata\/objects\/([^\/\?]+)$/);
58
+ if (method === 'GET' && objectMatch) {
59
+ const objectName = objectMatch[1];
40
60
  const metadata = app.getObject(objectName);
41
61
  if (!metadata) {
42
62
  res.statusCode = 404;
43
- res.end(JSON.stringify({ error: 'Object not found' }));
63
+ res.end(JSON.stringify({
64
+ error: {
65
+ code: types_1.ErrorCode.NOT_FOUND,
66
+ message: `Object '${objectName}' not found`
67
+ }
68
+ }));
44
69
  return;
45
70
  }
46
71
  // Convert fields object to array
@@ -50,7 +75,14 @@ function createMetadataHandler(app) {
50
75
  type: field.type,
51
76
  label: field.label,
52
77
  required: field.required,
53
- defaultValue: field.defaultValue
78
+ defaultValue: field.defaultValue,
79
+ unique: field.unique,
80
+ options: field.options,
81
+ min: field.min,
82
+ max: field.max,
83
+ min_length: field.min_length,
84
+ max_length: field.max_length,
85
+ regex: field.regex
54
86
  }))
55
87
  : [];
56
88
  res.setHeader('Content-Type', 'application/json');
@@ -61,14 +93,123 @@ function createMetadataHandler(app) {
61
93
  }));
62
94
  return;
63
95
  }
96
+ // GET /api/metadata/objects/:name/fields/:field - Get field metadata
97
+ const fieldMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/fields\/([^\/\?]+)$/);
98
+ if (method === 'GET' && fieldMatch) {
99
+ const [, objectName, fieldName] = fieldMatch;
100
+ const metadata = app.getObject(objectName);
101
+ if (!metadata) {
102
+ res.statusCode = 404;
103
+ res.end(JSON.stringify({
104
+ error: {
105
+ code: types_1.ErrorCode.NOT_FOUND,
106
+ message: `Object '${objectName}' not found`
107
+ }
108
+ }));
109
+ return;
110
+ }
111
+ const field = metadata.fields?.[fieldName];
112
+ if (!field) {
113
+ res.statusCode = 404;
114
+ res.end(JSON.stringify({
115
+ error: {
116
+ code: types_1.ErrorCode.NOT_FOUND,
117
+ message: `Field '${fieldName}' not found in object '${objectName}'`
118
+ }
119
+ }));
120
+ return;
121
+ }
122
+ res.setHeader('Content-Type', 'application/json');
123
+ res.statusCode = 200;
124
+ res.end(JSON.stringify({
125
+ name: field.name || fieldName,
126
+ type: field.type,
127
+ label: field.label,
128
+ required: field.required,
129
+ unique: field.unique,
130
+ defaultValue: field.defaultValue,
131
+ options: field.options,
132
+ min: field.min,
133
+ max: field.max,
134
+ min_length: field.min_length,
135
+ max_length: field.max_length,
136
+ regex: field.regex
137
+ }));
138
+ return;
139
+ }
140
+ // GET /api/metadata/objects/:name/actions - List actions
141
+ const actionsMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/actions$/);
142
+ if (method === 'GET' && actionsMatch) {
143
+ const [, objectName] = actionsMatch;
144
+ const metadata = app.getObject(objectName);
145
+ if (!metadata) {
146
+ res.statusCode = 404;
147
+ res.end(JSON.stringify({
148
+ error: {
149
+ code: types_1.ErrorCode.NOT_FOUND,
150
+ message: `Object '${objectName}' not found`
151
+ }
152
+ }));
153
+ return;
154
+ }
155
+ const actions = metadata.actions || {};
156
+ const formattedActions = Object.entries(actions).map(([key, action]) => {
157
+ const actionConfig = action;
158
+ const hasFields = !!actionConfig.fields && Object.keys(actionConfig.fields).length > 0;
159
+ return {
160
+ name: key,
161
+ type: actionConfig.type || (hasFields ? 'record' : 'global'),
162
+ label: actionConfig.label || key,
163
+ params: actionConfig.params || {},
164
+ description: actionConfig.description
165
+ };
166
+ });
167
+ res.setHeader('Content-Type', 'application/json');
168
+ res.statusCode = 200;
169
+ res.end(JSON.stringify({ actions: formattedActions }));
170
+ return;
171
+ }
172
+ // POST/PUT /api/metadata/:type/:id - Update metadata
173
+ const updateMatch = url.match(/^\/api\/metadata\/([^\/]+)\/([^\/]+)$/);
174
+ if ((method === 'POST' || method === 'PUT') && updateMatch) {
175
+ const [, type, id] = updateMatch;
176
+ const body = await readBody(req);
177
+ try {
178
+ await app.updateMetadata(type, id, body);
179
+ res.setHeader('Content-Type', 'application/json');
180
+ res.statusCode = 200;
181
+ res.end(JSON.stringify({ success: true }));
182
+ }
183
+ catch (e) {
184
+ const isUserError = e.message.startsWith('Cannot update') || e.message.includes('not found');
185
+ res.statusCode = isUserError ? 400 : 500;
186
+ res.end(JSON.stringify({
187
+ error: {
188
+ code: isUserError ? types_1.ErrorCode.INVALID_REQUEST : types_1.ErrorCode.INTERNAL_ERROR,
189
+ message: e.message
190
+ }
191
+ }));
192
+ }
193
+ return;
194
+ }
64
195
  // Not found
65
196
  res.statusCode = 404;
66
- res.end('Not Found');
197
+ res.end(JSON.stringify({
198
+ error: {
199
+ code: types_1.ErrorCode.NOT_FOUND,
200
+ message: 'Not Found'
201
+ }
202
+ }));
67
203
  }
68
204
  catch (e) {
69
205
  console.error('[Metadata Handler] Error:', e);
70
206
  res.statusCode = 500;
71
- res.end(JSON.stringify({ error: 'Internal Server Error' }));
207
+ res.end(JSON.stringify({
208
+ error: {
209
+ code: types_1.ErrorCode.INTERNAL_ERROR,
210
+ message: 'Internal Server Error'
211
+ }
212
+ }));
72
213
  }
73
214
  };
74
215
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;AAOA,sDAyEC;AA7ED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,GAAc;IAChD,OAAO,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;QACvD,gBAAgB;QAChB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAE1B,+BAA+B;QAC/B,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAC9D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,+CAA+C;YAC/C,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC/C,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI;oBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;iBACpD,CAAC,CAAC,CAAC;gBAEJ,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrC,OAAO;YACX,CAAC;YAED,uDAAuD;YACvD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAChE,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACZ,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;oBACvD,OAAO;gBACX,CAAC;gBAED,iCAAiC;gBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;oBAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;wBACrD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG;wBACvB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;qBACnC,CAAC,CAAC;oBACH,CAAC,CAAC,EAAE,CAAC;gBAET,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;oBACnB,GAAG,QAAQ;oBACX,MAAM;iBACT,CAAC,CAAC,CAAC;gBACJ,OAAO;YACX,CAAC;YAED,YAAY;YACZ,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;YAC9C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACL,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -8,4 +8,12 @@ export declare class ObjectQLServer {
8
8
  * This is framework-agnostic.
9
9
  */
10
10
  handle(req: ObjectQLRequest): Promise<ObjectQLResponse>;
11
+ /**
12
+ * Handle errors and convert them to appropriate error responses
13
+ */
14
+ private handleError;
15
+ /**
16
+ * Create a standardized error response
17
+ */
18
+ private errorResponse;
11
19
  }
package/dist/server.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ObjectQLServer = void 0;
4
+ const types_1 = require("./types");
4
5
  class ObjectQLServer {
5
6
  constructor(app) {
6
7
  this.app = app;
@@ -11,6 +12,16 @@ class ObjectQLServer {
11
12
  */
12
13
  async handle(req) {
13
14
  try {
15
+ // Log AI context if provided
16
+ if (req.ai_context) {
17
+ console.log('[ObjectQL AI Context]', {
18
+ object: req.object,
19
+ op: req.op,
20
+ intent: req.ai_context.intent,
21
+ natural_language: req.ai_context.natural_language,
22
+ use_case: req.ai_context.use_case
23
+ });
24
+ }
14
25
  // 1. Build Context
15
26
  // TODO: integrate with real session/auth
16
27
  const contextOptions = {
@@ -23,9 +34,14 @@ class ObjectQLServer {
23
34
  // We need to cast or fix the interface. Assuming 'app' behaves like ObjectQL class.
24
35
  const app = this.app;
25
36
  if (typeof app.createContext !== 'function') {
26
- throw new Error("The provided ObjectQL instance does not support createContext.");
37
+ return this.errorResponse(types_1.ErrorCode.INTERNAL_ERROR, "The provided ObjectQL instance does not support createContext.");
27
38
  }
28
39
  const ctx = app.createContext(contextOptions);
40
+ // Validate object exists
41
+ const objectConfig = app.getObject(req.object);
42
+ if (!objectConfig) {
43
+ return this.errorResponse(types_1.ErrorCode.NOT_FOUND, `Object '${req.object}' not found`);
44
+ }
29
45
  const repo = ctx.object(req.object);
30
46
  let result;
31
47
  switch (req.op) {
@@ -33,7 +49,13 @@ class ObjectQLServer {
33
49
  result = await repo.find(req.args);
34
50
  break;
35
51
  case 'findOne':
36
- result = await repo.findOne(req.args);
52
+ // Support both string ID and query object
53
+ if (typeof req.args === 'string') {
54
+ result = await repo.findOne({ filters: [['_id', '=', req.args]] });
55
+ }
56
+ else {
57
+ result = await repo.findOne(req.args);
58
+ }
37
59
  break;
38
60
  case 'create':
39
61
  result = await repo.create(req.args);
@@ -43,33 +65,71 @@ class ObjectQLServer {
43
65
  break;
44
66
  case 'delete':
45
67
  result = await repo.delete(req.args.id);
68
+ if (!result) {
69
+ return this.errorResponse(types_1.ErrorCode.NOT_FOUND, `Record with id '${req.args.id}' not found for delete`);
70
+ }
71
+ // Return standardized delete response on success
72
+ result = { id: req.args.id, deleted: true };
46
73
  break;
47
74
  case 'count':
48
75
  result = await repo.count(req.args);
49
76
  break;
50
77
  case 'action':
51
- // TODO: The repo interface might not expose 'executeAction' directly yet,
52
- // usually it's on the app level or via special method.
53
- // For now, let's assume app.executeAction
78
+ // Map generic args to ActionContext
54
79
  result = await app.executeAction(req.object, req.args.action, {
55
- ...ctx, // Pass context with user info
56
- params: req.args.params
80
+ ...ctx, // Pass context (user, etc.)
81
+ id: req.args.id,
82
+ input: req.args.input || req.args.params // Support both for convenience
57
83
  });
58
84
  break;
59
85
  default:
60
- throw new Error(`Unknown operation: ${req.op}`);
86
+ return this.errorResponse(types_1.ErrorCode.INVALID_REQUEST, `Unknown operation: ${req.op}`);
61
87
  }
62
88
  return { data: result };
63
89
  }
64
90
  catch (e) {
65
- console.error('[ObjectQL Server] Error:', e);
66
- return {
67
- error: {
68
- code: 'INTERNAL_ERROR',
69
- message: e.message || 'An error occurred'
70
- }
71
- };
91
+ return this.handleError(e);
92
+ }
93
+ }
94
+ /**
95
+ * Handle errors and convert them to appropriate error responses
96
+ */
97
+ handleError(error) {
98
+ console.error('[ObjectQL Server] Error:', error);
99
+ // Handle validation errors
100
+ if (error.name === 'ValidationError' || error.code === 'VALIDATION_ERROR') {
101
+ return this.errorResponse(types_1.ErrorCode.VALIDATION_ERROR, 'Validation failed', { fields: error.fields || error.details });
102
+ }
103
+ // Handle permission errors
104
+ if (error.name === 'PermissionError' || error.code === 'FORBIDDEN') {
105
+ return this.errorResponse(types_1.ErrorCode.FORBIDDEN, error.message || 'You do not have permission to access this resource', error.details);
72
106
  }
107
+ // Handle not found errors
108
+ if (error.name === 'NotFoundError' || error.code === 'NOT_FOUND') {
109
+ return this.errorResponse(types_1.ErrorCode.NOT_FOUND, error.message || 'Resource not found');
110
+ }
111
+ // Handle conflict errors (e.g., unique constraint violations)
112
+ if (error.name === 'ConflictError' || error.code === 'CONFLICT') {
113
+ return this.errorResponse(types_1.ErrorCode.CONFLICT, error.message || 'Resource conflict', error.details);
114
+ }
115
+ // Handle database errors
116
+ if (error.name === 'DatabaseError' || error.code?.startsWith('DB_')) {
117
+ return this.errorResponse(types_1.ErrorCode.DATABASE_ERROR, 'Database operation failed', { originalError: error.message });
118
+ }
119
+ // Default to internal error
120
+ return this.errorResponse(types_1.ErrorCode.INTERNAL_ERROR, error.message || 'An error occurred');
121
+ }
122
+ /**
123
+ * Create a standardized error response
124
+ */
125
+ errorResponse(code, message, details) {
126
+ return {
127
+ error: {
128
+ code,
129
+ message,
130
+ details
131
+ }
132
+ };
73
133
  }
74
134
  }
75
135
  exports.ObjectQLServer = ObjectQLServer;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;AAGA,MAAa,cAAc;IACvB,YAAoB,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;IAAG,CAAC;IAEtC;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAoB;QAC7B,IAAI,CAAC;YACD,mBAAmB;YACnB,yCAAyC;YACzC,MAAM,cAAc,GAAG;gBACnB,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE;gBACpB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;gBAC5B,gBAAgB;aACnB,CAAC;YAEF,wEAAwE;YACxE,uGAAuG;YACvG,oFAAoF;YACpF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAU,CAAC;YAC5B,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACtF,CAAC;YAED,MAAM,GAAG,GAAoB,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEpC,IAAI,MAAW,CAAC;YAEhB,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;gBACb,KAAK,MAAM;oBACP,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACnC,MAAM;gBACV,KAAK,SAAS;oBACV,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtC,MAAM;gBACV,KAAK,QAAQ;oBACT,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACrC,MAAM;gBACV,KAAK,QAAQ;oBACT,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvD,MAAM;gBACV,KAAK,QAAQ;oBACT,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxC,MAAM;gBACV,KAAK,OAAO;oBACR,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACpC,MAAM;gBACV,KAAK,QAAQ;oBACT,0EAA0E;oBAC1E,uDAAuD;oBACvD,0CAA0C;oBAC1C,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;wBACzD,GAAG,GAAG,EAAE,8BAA8B;wBACtC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;qBAC3B,CAAC,CAAC;oBACH,MAAM;gBACV;oBACI,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAE5B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO;gBACH,KAAK,EAAE;oBACH,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,mBAAmB;iBAC5C;aACJ,CAAC;QACN,CAAC;IACL,CAAC;CACJ;AA1ED,wCA0EC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { IncomingMessage, ServerResponse } from 'http';
2
+ /**
3
+ * Creates a handler to serve the Studio UI static files.
4
+ */
5
+ export declare function createStudioHandler(): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
@@ -33,37 +33,49 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.createConsoleHandler = createConsoleHandler;
36
+ exports.createStudioHandler = createStudioHandler;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  /**
40
- * Creates a handler to serve the console UI static files.
40
+ * Creates a handler to serve the Studio UI static files.
41
41
  */
42
- function createConsoleHandler() {
43
- // Try to find the built console files
44
- const possiblePaths = [
45
- path.join(__dirname, '../../console/dist'),
46
- path.join(process.cwd(), 'node_modules/@objectql/console/dist'),
47
- path.join(process.cwd(), 'packages/console/dist'),
48
- ];
42
+ function createStudioHandler() {
49
43
  let distPath = null;
50
- for (const p of possiblePaths) {
51
- if (fs.existsSync(p)) {
52
- distPath = p;
53
- break;
44
+ // 1. Try to resolve from installed package (Standard way)
45
+ try {
46
+ const studioPkg = require.resolve('@objectql/studio/package.json');
47
+ const candidate = path.join(path.dirname(studioPkg), 'dist');
48
+ if (fs.existsSync(candidate)) {
49
+ distPath = candidate;
50
+ }
51
+ }
52
+ catch (e) {
53
+ // @objectql/studio might not be installed
54
+ }
55
+ // 2. Fallback for local development (Monorepo)
56
+ if (!distPath) {
57
+ const possiblePaths = [
58
+ path.join(__dirname, '../../studio/dist'),
59
+ path.join(process.cwd(), 'packages/studio/dist'),
60
+ ];
61
+ for (const p of possiblePaths) {
62
+ if (fs.existsSync(p)) {
63
+ distPath = p;
64
+ break;
65
+ }
54
66
  }
55
67
  }
56
68
  return async (req, res) => {
57
69
  if (!distPath) {
58
- // Return placeholder page if console is not built
70
+ // Return placeholder page if studio is not built
59
71
  const html = getPlaceholderPage();
60
72
  res.setHeader('Content-Type', 'text/html');
61
73
  res.statusCode = 200;
62
74
  res.end(html);
63
75
  return;
64
76
  }
65
- // Parse the URL and remove /console prefix
66
- let urlPath = (req.url || '').replace(/^\/console/, '') || '/';
77
+ // Parse the URL and remove /studio prefix
78
+ let urlPath = (req.url || '').replace(/^\/studio/, '') || '/';
67
79
  // Default to index.html for SPA routing
68
80
  if (urlPath === '/' || !urlPath.includes('.')) {
69
81
  urlPath = '/index.html';
@@ -119,7 +131,7 @@ function getPlaceholderPage() {
119
131
  <head>
120
132
  <meta charset="UTF-8">
121
133
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
122
- <title>ObjectQL Console</title>
134
+ <title>ObjectQL Studio</title>
123
135
  <style>
124
136
  * { margin: 0; padding: 0; box-sizing: border-box; }
125
137
  body {
@@ -155,19 +167,19 @@ function getPlaceholderPage() {
155
167
  </head>
156
168
  <body>
157
169
  <div class="container">
158
- <h1>ObjectQL Console</h1>
159
- <p>Web-based admin console for database management</p>
170
+ <h1>ObjectQL Studio</h1>
171
+ <p>Web-based admin studio for database management</p>
160
172
  <div class="info">
161
173
  <p style="margin-bottom: 1rem;">
162
- The console is available but needs to be built separately.
174
+ The studio is available but needs to be built separately.
163
175
  </p>
164
176
  <p style="font-size: 1rem;">
165
- To use the full console UI, run:<br>
166
- <code>cd packages/console && pnpm run build</code>
177
+ To use the full studio UI, run:<br>
178
+ <code>cd packages/studio && pnpm run build</code>
167
179
  </p>
168
180
  </div>
169
181
  </div>
170
182
  </body>
171
183
  </html>`;
172
184
  }
173
- //# sourceMappingURL=console.js.map
185
+ //# sourceMappingURL=studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.js","sourceRoot":"","sources":["../src/studio.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,3 +1,29 @@
1
+ /**
2
+ * Standardized error codes for ObjectQL API
3
+ */
4
+ export declare enum ErrorCode {
5
+ INVALID_REQUEST = "INVALID_REQUEST",
6
+ VALIDATION_ERROR = "VALIDATION_ERROR",
7
+ UNAUTHORIZED = "UNAUTHORIZED",
8
+ FORBIDDEN = "FORBIDDEN",
9
+ NOT_FOUND = "NOT_FOUND",
10
+ CONFLICT = "CONFLICT",
11
+ INTERNAL_ERROR = "INTERNAL_ERROR",
12
+ DATABASE_ERROR = "DATABASE_ERROR",
13
+ RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED"
14
+ }
15
+ /**
16
+ * AI context for better logging, debugging, and AI processing
17
+ */
18
+ export interface AIContext {
19
+ intent?: string;
20
+ natural_language?: string;
21
+ use_case?: string;
22
+ [key: string]: unknown;
23
+ }
24
+ /**
25
+ * ObjectQL JSON-RPC style request
26
+ */
1
27
  export interface ObjectQLRequest {
2
28
  user?: {
3
29
  id: string;
@@ -7,11 +33,33 @@ export interface ObjectQLRequest {
7
33
  op: 'find' | 'findOne' | 'create' | 'update' | 'delete' | 'count' | 'action';
8
34
  object: string;
9
35
  args: any;
36
+ ai_context?: AIContext;
10
37
  }
38
+ /**
39
+ * Error details structure
40
+ */
41
+ export interface ErrorDetails {
42
+ field?: string;
43
+ reason?: string;
44
+ fields?: Record<string, string>;
45
+ required_permission?: string;
46
+ user_roles?: string[];
47
+ retry_after?: number;
48
+ [key: string]: unknown;
49
+ }
50
+ /**
51
+ * ObjectQL API response
52
+ */
11
53
  export interface ObjectQLResponse {
12
54
  data?: any;
13
55
  error?: {
14
- code: string;
56
+ code: ErrorCode | string;
15
57
  message: string;
58
+ details?: ErrorDetails;
59
+ };
60
+ meta?: {
61
+ total?: number;
62
+ page?: number;
63
+ per_page?: number;
16
64
  };
17
65
  }
package/dist/types.js CHANGED
@@ -1,3 +1,20 @@
1
1
  "use strict";
2
+ // src/types.ts
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ErrorCode = void 0;
5
+ /**
6
+ * Standardized error codes for ObjectQL API
7
+ */
8
+ var ErrorCode;
9
+ (function (ErrorCode) {
10
+ ErrorCode["INVALID_REQUEST"] = "INVALID_REQUEST";
11
+ ErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
12
+ ErrorCode["UNAUTHORIZED"] = "UNAUTHORIZED";
13
+ ErrorCode["FORBIDDEN"] = "FORBIDDEN";
14
+ ErrorCode["NOT_FOUND"] = "NOT_FOUND";
15
+ ErrorCode["CONFLICT"] = "CONFLICT";
16
+ ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
17
+ ErrorCode["DATABASE_ERROR"] = "DATABASE_ERROR";
18
+ ErrorCode["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
19
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
3
20
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,eAAe;;;AAEf;;GAEG;AACH,IAAY,SAUX;AAVD,WAAY,SAAS;IACjB,gDAAmC,CAAA;IACnC,kDAAqC,CAAA;IACrC,0CAA6B,CAAA;IAC7B,oCAAuB,CAAA;IACvB,oCAAuB,CAAA;IACvB,kCAAqB,CAAA;IACrB,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,wDAA2C,CAAA;AAC/C,CAAC,EAVW,SAAS,yBAAT,SAAS,QAUpB"}
package/package.json CHANGED
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "name": "@objectql/server",
3
- "version": "0.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "HTTP Server Adapter for ObjectQL",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "dependencies": {
8
- "@objectql/core": "1.3.0",
9
- "@objectql/types": "1.3.0"
8
+ "js-yaml": "^4.1.1",
9
+ "@objectql/types": "1.4.0",
10
+ "@objectql/core": "1.4.0"
10
11
  },
11
12
  "devDependencies": {
12
- "typescript": "^5.3.0",
13
- "@types/node": "^20.10.0"
13
+ "@types/js-yaml": "^4.0.9",
14
+ "@types/node": "^20.10.0",
15
+ "typescript": "^5.3.0"
14
16
  },
15
17
  "scripts": {
16
18
  "build": "tsc",