@objectql/server 1.3.1 → 1.5.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 CHANGED
@@ -1,5 +1,36 @@
1
1
  # @objectql/server
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Minor version release - 1.5.0
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @objectql/core@1.5.0
13
+ - @objectql/types@1.5.0
14
+
15
+ ## 1.4.0
16
+
17
+ ### Minor Changes
18
+
19
+ - Release version 1.4.0 with new features and enhancements:
20
+ - Added complete REST API implementation with CRUD operations
21
+ - Enhanced error handling with standardized error codes and HTTP status mapping
22
+ - Added AI context support for tracking intent and use cases
23
+ - Enhanced metadata API with detailed field information and action listing
24
+ - Improved JSON-RPC API with better error categorization
25
+ - Added hooks and actions validation and implementation
26
+ - Updated documentation and examples
27
+
28
+ ### Patch Changes
29
+
30
+ - Updated dependencies
31
+ - @objectql/core@1.4.0
32
+ - @objectql/types@1.4.0
33
+
3
34
  ## 1.3.1
4
35
 
5
36
  ### Patch Changes
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ObjectQL Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createNodeHandler = createNodeHandler;
4
4
  const server_1 = require("../server");
5
+ const types_1 = require("../types");
5
6
  const openapi_1 = require("../openapi");
6
7
  /**
7
8
  * Creates a standard Node.js HTTP request handler.
@@ -17,48 +18,181 @@ function createNodeHandler(app) {
17
18
  res.end(JSON.stringify(spec));
18
19
  return;
19
20
  }
20
- if (req.method !== 'POST') {
21
- res.statusCode = 405;
22
- res.end('Method Not Allowed');
23
- return;
24
- }
25
21
  const handleRequest = async (json) => {
26
22
  try {
27
- // TODO: Parse user from header or request override
23
+ // Determine Operation based on JSON or previously derived info
28
24
  const qlReq = {
29
25
  op: json.op,
30
26
  object: json.object,
31
27
  args: json.args,
32
- user: json.user // For dev/testing, allowing user injection
28
+ user: json.user,
29
+ ai_context: json.ai_context
33
30
  };
34
31
  const result = await server.handle(qlReq);
32
+ // Determine HTTP status code based on error
33
+ let statusCode = 200;
34
+ if (result.error) {
35
+ switch (result.error.code) {
36
+ case types_1.ErrorCode.INVALID_REQUEST:
37
+ case types_1.ErrorCode.VALIDATION_ERROR:
38
+ statusCode = 400;
39
+ break;
40
+ case types_1.ErrorCode.UNAUTHORIZED:
41
+ statusCode = 401;
42
+ break;
43
+ case types_1.ErrorCode.FORBIDDEN:
44
+ statusCode = 403;
45
+ break;
46
+ case types_1.ErrorCode.NOT_FOUND:
47
+ statusCode = 404;
48
+ break;
49
+ case types_1.ErrorCode.CONFLICT:
50
+ statusCode = 409;
51
+ break;
52
+ case types_1.ErrorCode.RATE_LIMIT_EXCEEDED:
53
+ statusCode = 429;
54
+ break;
55
+ default:
56
+ statusCode = 500;
57
+ }
58
+ }
35
59
  res.setHeader('Content-Type', 'application/json');
36
- res.statusCode = result.error ? 500 : 200;
60
+ res.statusCode = statusCode;
37
61
  res.end(JSON.stringify(result));
38
62
  }
39
63
  catch (e) {
64
+ console.error(e);
40
65
  res.statusCode = 500;
41
- res.end(JSON.stringify({ error: { code: 'INTERNAL_ERROR', message: 'Internal Server Error' } }));
66
+ res.end(JSON.stringify({
67
+ error: {
68
+ code: types_1.ErrorCode.INTERNAL_ERROR,
69
+ message: 'Internal Server Error'
70
+ }
71
+ }));
42
72
  }
43
73
  };
44
- // 1. Check if body is already parsed (e.g. by express.json())
45
- if (req.body && typeof req.body === 'object') {
46
- await handleRequest(req.body);
74
+ // Parse URL
75
+ const urlObj = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
76
+ const pathName = urlObj.pathname;
77
+ const method = req.method;
78
+ // 1. JSON-RPC: POST /api/objectql
79
+ if (pathName === '/api/objectql' && method === 'POST') {
80
+ await processBody(req, async (json) => {
81
+ await handleRequest(json);
82
+ }, res);
47
83
  return;
48
84
  }
49
- // 2. Parse Body from stream
50
- let body = '';
51
- req.on('data', chunk => body += chunk);
52
- req.on('end', async () => {
53
- try {
54
- const json = JSON.parse(body);
55
- await handleRequest(json);
85
+ // 2. REST API: /api/data/:object and /api/data/:object/:id
86
+ // Regex to match /api/data/objectName(/id)?
87
+ const restMatch = pathName.match(/^\/api\/data\/([^/]+)(?:\/(.+))?$/);
88
+ if (restMatch) {
89
+ const objectName = restMatch[1];
90
+ const id = restMatch[2];
91
+ const query = Object.fromEntries(urlObj.searchParams.entries());
92
+ if (method === 'GET') {
93
+ // GET /api/data/:object/:id -> findOne
94
+ if (id) {
95
+ await handleRequest({
96
+ op: 'findOne',
97
+ object: objectName,
98
+ args: { filters: [['_id', '=', id]] } // Assuming _id or id mapping
99
+ });
100
+ }
101
+ // GET /api/data/:object -> find (List)
102
+ else {
103
+ // Parse standard params
104
+ const args = {};
105
+ if (query.fields)
106
+ args.fields = query.fields.split(',');
107
+ if (query.top)
108
+ args.limit = parseInt(query.top);
109
+ if (query.skip)
110
+ args.skip = parseInt(query.skip);
111
+ if (query.filter) {
112
+ try {
113
+ args.filters = JSON.parse(query.filter);
114
+ }
115
+ catch (e) {
116
+ // ignore invalid filter json
117
+ }
118
+ }
119
+ await handleRequest({ op: 'find', object: objectName, args });
120
+ }
121
+ return;
56
122
  }
57
- catch (e) {
58
- res.statusCode = 400;
59
- res.end('Invalid JSON');
123
+ if (method === 'POST' && !id) {
124
+ // POST /api/data/:object -> create
125
+ await processBody(req, async (body) => {
126
+ await handleRequest({
127
+ op: 'create',
128
+ object: objectName,
129
+ args: body.data || body // Support enclosed in data or flat
130
+ });
131
+ }, res);
132
+ return;
133
+ }
134
+ if (method === 'PATCH' && id) {
135
+ // PATCH /api/data/:object/:id -> update
136
+ await processBody(req, async (body) => {
137
+ await handleRequest({
138
+ op: 'update',
139
+ object: objectName,
140
+ args: {
141
+ id: id,
142
+ data: body.data || body
143
+ }
144
+ });
145
+ }, res);
146
+ return;
147
+ }
148
+ if (method === 'DELETE' && id) {
149
+ // DELETE /api/data/:object/:id -> delete
150
+ await handleRequest({
151
+ op: 'delete',
152
+ object: objectName,
153
+ args: { id: id }
154
+ });
155
+ return;
60
156
  }
61
- });
157
+ }
158
+ // Fallback or 404
159
+ if (req.method === 'POST') {
160
+ // Fallback for root POSTs if people forget /api/objectql but send to /api something
161
+ await processBody(req, handleRequest, res);
162
+ return;
163
+ }
164
+ // Special case for root: since we accept POST / (RPC), correct response for GET / is 405
165
+ if (pathName === '/') {
166
+ res.setHeader('Allow', 'POST');
167
+ res.statusCode = 405;
168
+ res.end(JSON.stringify({ error: { code: types_1.ErrorCode.INVALID_REQUEST, message: 'Method Not Allowed. Use POST for JSON-RPC.' } }));
169
+ return;
170
+ }
171
+ res.statusCode = 404;
172
+ res.end(JSON.stringify({ error: { code: types_1.ErrorCode.NOT_FOUND, message: 'Not Found' } }));
62
173
  };
63
174
  }
175
+ // Helper to process body
176
+ async function processBody(req, callback, res) {
177
+ if (req.body && typeof req.body === 'object') {
178
+ return callback(req.body);
179
+ }
180
+ let body = '';
181
+ req.on('data', chunk => body += chunk);
182
+ req.on('end', async () => {
183
+ try {
184
+ const json = body ? JSON.parse(body) : {};
185
+ await callback(json);
186
+ }
187
+ catch (e) {
188
+ res.statusCode = 400;
189
+ res.end(JSON.stringify({
190
+ error: {
191
+ code: 'INVALID_JSON',
192
+ message: 'Invalid JSON body'
193
+ }
194
+ }));
195
+ }
196
+ });
197
+ }
64
198
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":";;AASA,8CA4DC;AApED,sCAA2C;AAG3C,wCAA6C;AAE7C;;GAEG;AACH,SAAgB,iBAAiB,CAAC,GAAc;IAC5C,MAAM,MAAM,GAAG,IAAI,uBAAc,CAAC,GAAG,CAAC,CAAC;IAGvC,OAAO,KAAK,EAAE,GAAqC,EAAE,GAAmB,EAAE,EAAE;QACxE,8BAA8B;QAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,IAAA,yBAAe,EAAC,GAAG,CAAC,CAAC;YAClC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,EAAE,IAAS,EAAE,EAAE;YACrC,IAAI,CAAC;gBACF,mDAAmD;gBACnD,MAAM,KAAK,GAAoB;oBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,2CAA2C;iBAC9D,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAE1C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC1C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAC,CAAC,CAAC,CAAC;YACpG,CAAC;QACL,CAAC,CAAC;QAEF,8DAA8D;QAC9D,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;QACvC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { IObjectQL } from '@objectql/types';
2
+ import { IncomingMessage, ServerResponse } from 'http';
3
+ /**
4
+ * Creates a REST-style HTTP request handler for ObjectQL
5
+ *
6
+ * Endpoints:
7
+ * - GET /api/data/:object - List records
8
+ * - GET /api/data/:object/:id - Get single record
9
+ * - POST /api/data/:object - Create record
10
+ * - PUT /api/data/:object/:id - Update record
11
+ * - DELETE /api/data/:object/:id - Delete record
12
+ */
13
+ export declare function createRESTHandler(app: IObjectQL): (req: IncomingMessage & {
14
+ body?: any;
15
+ }, res: ServerResponse) => Promise<void>;
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRESTHandler = createRESTHandler;
4
+ const server_1 = require("../server");
5
+ const types_1 = require("../types");
6
+ /**
7
+ * Parse query string parameters
8
+ */
9
+ function parseQueryParams(url) {
10
+ const params = {};
11
+ const queryIndex = url.indexOf('?');
12
+ if (queryIndex === -1)
13
+ return params;
14
+ const queryString = url.substring(queryIndex + 1);
15
+ const pairs = queryString.split('&');
16
+ for (const pair of pairs) {
17
+ const [key, value] = pair.split('=');
18
+ if (!key)
19
+ continue;
20
+ const decodedKey = decodeURIComponent(key);
21
+ const decodedValue = decodeURIComponent(value || '');
22
+ // Try to parse JSON values
23
+ try {
24
+ params[decodedKey] = JSON.parse(decodedValue);
25
+ }
26
+ catch {
27
+ params[decodedKey] = decodedValue;
28
+ }
29
+ }
30
+ return params;
31
+ }
32
+ /**
33
+ * Read request body as JSON
34
+ */
35
+ function readBody(req) {
36
+ return new Promise((resolve, reject) => {
37
+ let body = '';
38
+ req.on('data', chunk => body += chunk.toString());
39
+ req.on('end', () => {
40
+ if (!body)
41
+ return resolve({});
42
+ try {
43
+ resolve(JSON.parse(body));
44
+ }
45
+ catch (e) {
46
+ reject(new Error('Invalid JSON'));
47
+ }
48
+ });
49
+ req.on('error', reject);
50
+ });
51
+ }
52
+ /**
53
+ * Send JSON response
54
+ */
55
+ function sendJSON(res, statusCode, data) {
56
+ res.setHeader('Content-Type', 'application/json');
57
+ res.statusCode = statusCode;
58
+ res.end(JSON.stringify(data));
59
+ }
60
+ /**
61
+ * Creates a REST-style HTTP request handler for ObjectQL
62
+ *
63
+ * Endpoints:
64
+ * - GET /api/data/:object - List records
65
+ * - GET /api/data/:object/:id - Get single record
66
+ * - POST /api/data/:object - Create record
67
+ * - PUT /api/data/:object/:id - Update record
68
+ * - DELETE /api/data/:object/:id - Delete record
69
+ */
70
+ function createRESTHandler(app) {
71
+ const server = new server_1.ObjectQLServer(app);
72
+ return async (req, res) => {
73
+ try {
74
+ // CORS headers
75
+ const requestOrigin = req.headers.origin;
76
+ const configuredOrigin = process.env.OBJECTQL_CORS_ORIGIN;
77
+ const isProduction = process.env.NODE_ENV === 'production';
78
+ // In development, allow all origins by default (or use configured override).
79
+ // In production, require an explicit OBJECTQL_CORS_ORIGIN to be set.
80
+ if (!isProduction) {
81
+ res.setHeader('Access-Control-Allow-Origin', configuredOrigin || '*');
82
+ }
83
+ else if (configuredOrigin && (!requestOrigin || requestOrigin === configuredOrigin)) {
84
+ res.setHeader('Access-Control-Allow-Origin', configuredOrigin);
85
+ }
86
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
87
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
88
+ if (req.method === 'OPTIONS') {
89
+ res.statusCode = 200;
90
+ res.end();
91
+ return;
92
+ }
93
+ const url = req.url || '';
94
+ const method = req.method || 'GET';
95
+ // Parse URL: /api/data/:object or /api/data/:object/:id
96
+ const match = url.match(/^\/api\/data\/([^\/\?]+)(?:\/([^\/\?]+))?(\?.*)?$/);
97
+ if (!match) {
98
+ sendJSON(res, 404, {
99
+ error: {
100
+ code: types_1.ErrorCode.NOT_FOUND,
101
+ message: 'Invalid REST API endpoint'
102
+ }
103
+ });
104
+ return;
105
+ }
106
+ const [, objectName, id, queryString] = match;
107
+ const queryParams = queryString ? parseQueryParams(queryString) : {};
108
+ let qlRequest;
109
+ switch (method) {
110
+ case 'GET':
111
+ if (id) {
112
+ // GET /api/data/:object/:id - Get single record
113
+ qlRequest = {
114
+ op: 'findOne',
115
+ object: objectName,
116
+ args: id
117
+ };
118
+ }
119
+ else {
120
+ // GET /api/data/:object - List records
121
+ const args = {};
122
+ // Parse query parameters
123
+ if (queryParams.filter) {
124
+ args.filters = queryParams.filter;
125
+ }
126
+ if (queryParams.fields) {
127
+ args.fields = queryParams.fields;
128
+ }
129
+ if (queryParams.sort) {
130
+ args.sort = Array.isArray(queryParams.sort)
131
+ ? queryParams.sort
132
+ : [[queryParams.sort, 'asc']];
133
+ }
134
+ if (queryParams.top || queryParams.limit) {
135
+ args.top = queryParams.top || queryParams.limit;
136
+ }
137
+ if (queryParams.skip || queryParams.offset) {
138
+ args.skip = queryParams.skip || queryParams.offset;
139
+ }
140
+ if (queryParams.expand) {
141
+ args.expand = queryParams.expand;
142
+ }
143
+ qlRequest = {
144
+ op: 'find',
145
+ object: objectName,
146
+ args
147
+ };
148
+ }
149
+ break;
150
+ case 'POST':
151
+ // POST /api/data/:object - Create record
152
+ const createBody = req.body || await readBody(req);
153
+ qlRequest = {
154
+ op: 'create',
155
+ object: objectName,
156
+ args: createBody
157
+ };
158
+ break;
159
+ case 'PUT':
160
+ case 'PATCH':
161
+ // PUT /api/data/:object/:id - Update record
162
+ if (!id) {
163
+ sendJSON(res, 400, {
164
+ error: {
165
+ code: types_1.ErrorCode.INVALID_REQUEST,
166
+ message: 'ID is required for update operation'
167
+ }
168
+ });
169
+ return;
170
+ }
171
+ const updateBody = req.body || await readBody(req);
172
+ qlRequest = {
173
+ op: 'update',
174
+ object: objectName,
175
+ args: {
176
+ id,
177
+ data: updateBody
178
+ }
179
+ };
180
+ break;
181
+ case 'DELETE':
182
+ // DELETE /api/data/:object/:id - Delete record
183
+ if (!id) {
184
+ sendJSON(res, 400, {
185
+ error: {
186
+ code: types_1.ErrorCode.INVALID_REQUEST,
187
+ message: 'ID is required for delete operation'
188
+ }
189
+ });
190
+ return;
191
+ }
192
+ qlRequest = {
193
+ op: 'delete',
194
+ object: objectName,
195
+ args: { id }
196
+ };
197
+ break;
198
+ default:
199
+ sendJSON(res, 405, {
200
+ error: {
201
+ code: types_1.ErrorCode.INVALID_REQUEST,
202
+ message: 'Method not allowed'
203
+ }
204
+ });
205
+ return;
206
+ }
207
+ // Execute the request
208
+ const result = await server.handle(qlRequest);
209
+ // Determine HTTP status code
210
+ let statusCode = 200;
211
+ if (result.error) {
212
+ switch (result.error.code) {
213
+ case types_1.ErrorCode.INVALID_REQUEST:
214
+ case types_1.ErrorCode.VALIDATION_ERROR:
215
+ statusCode = 400;
216
+ break;
217
+ case types_1.ErrorCode.UNAUTHORIZED:
218
+ statusCode = 401;
219
+ break;
220
+ case types_1.ErrorCode.FORBIDDEN:
221
+ statusCode = 403;
222
+ break;
223
+ case types_1.ErrorCode.NOT_FOUND:
224
+ statusCode = 404;
225
+ break;
226
+ case types_1.ErrorCode.CONFLICT:
227
+ statusCode = 409;
228
+ break;
229
+ case types_1.ErrorCode.RATE_LIMIT_EXCEEDED:
230
+ statusCode = 429;
231
+ break;
232
+ default:
233
+ statusCode = 500;
234
+ }
235
+ }
236
+ else if (method === 'POST') {
237
+ statusCode = 201; // Created
238
+ }
239
+ sendJSON(res, statusCode, result);
240
+ }
241
+ catch (e) {
242
+ console.error('[REST Handler] Error:', e);
243
+ sendJSON(res, 500, {
244
+ error: {
245
+ code: types_1.ErrorCode.INTERNAL_ERROR,
246
+ message: 'Internal server error'
247
+ }
248
+ });
249
+ }
250
+ };
251
+ }
252
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/adapters/rest.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,5 +2,6 @@ export * from './types';
2
2
  export * from './openapi';
3
3
  export * from './server';
4
4
  export * from './metadata';
5
- export * from './console';
5
+ export * from './studio';
6
6
  export * from './adapters/node';
7
+ export * from './adapters/rest';
package/dist/index.js CHANGED
@@ -18,8 +18,10 @@ __exportStar(require("./types"), exports);
18
18
  __exportStar(require("./openapi"), exports);
19
19
  __exportStar(require("./server"), exports);
20
20
  __exportStar(require("./metadata"), exports);
21
- __exportStar(require("./console"), exports);
21
+ __exportStar(require("./studio"), exports);
22
22
  // We export createNodeHandler from root for convenience,
23
23
  // but in the future we might encourage 'import ... from @objectql/server/node'
24
24
  __exportStar(require("./adapters/node"), exports);
25
+ // Export REST adapter
26
+ __exportStar(require("./adapters/rest"), exports);
25
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,4CAA0B;AAC1B,0DAA0D;AAC1D,+EAA+E;AAC/E,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,2CAAyB;AACzB,0DAA0D;AAC1D,+EAA+E;AAC/E,kDAAgC;AAChC,sBAAsB;AACtB,kDAAgC"}
@@ -2,6 +2,6 @@ import { IObjectQL } from '@objectql/types';
2
2
  import { IncomingMessage, ServerResponse } from 'http';
3
3
  /**
4
4
  * Creates a handler for metadata endpoints.
5
- * These endpoints expose information about registered objects.
5
+ * These endpoints expose information about registered objects and other metadata.
6
6
  */
7
7
  export declare function createMetadataHandler(app: IObjectQL): (req: IncomingMessage, res: ServerResponse) => Promise<void>;