@objectql/server 1.8.3 → 1.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/adapters/node.d.ts +3 -1
- package/dist/adapters/node.js +35 -29
- package/dist/adapters/node.js.map +1 -1
- package/dist/adapters/rest.d.ts +20 -10
- package/dist/adapters/rest.js +39 -31
- package/dist/adapters/rest.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +12 -2
- package/dist/metadata.js +31 -23
- package/dist/metadata.js.map +1 -1
- package/dist/openapi.d.ts +2 -2
- package/dist/openapi.js +6 -4
- package/dist/openapi.js.map +1 -1
- package/dist/utils.d.ts +15 -0
- package/dist/utils.js +24 -0
- package/dist/utils.js.map +1 -0
- package/package.json +3 -3
- package/src/adapters/node.ts +26 -19
- package/src/adapters/rest.ts +34 -19
- package/src/index.ts +1 -1
- package/src/metadata.ts +29 -14
- package/src/openapi.ts +6 -5
- package/src/utils.ts +21 -0
- package/test/custom-routes.test.ts +297 -0
- package/test/metadata.test.ts +259 -0
- package/test/openapi.test.ts +354 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/studio.d.ts +0 -5
- package/dist/studio.js +0 -186
- package/dist/studio.js.map +0 -1
- package/src/studio.ts +0 -164
package/CHANGELOG.md
CHANGED
package/dist/adapters/node.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IObjectQL } from '@objectql/types';
|
|
1
|
+
import { IObjectQL, ApiRouteConfig } from '@objectql/types';
|
|
2
2
|
import { IFileStorage } from '../types';
|
|
3
3
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
4
4
|
/**
|
|
@@ -7,6 +7,8 @@ import { IncomingMessage, ServerResponse } from 'http';
|
|
|
7
7
|
export interface NodeHandlerOptions {
|
|
8
8
|
/** File storage provider (defaults to LocalFileStorage) */
|
|
9
9
|
fileStorage?: IFileStorage;
|
|
10
|
+
/** Custom API route configuration */
|
|
11
|
+
routes?: ApiRouteConfig;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* Creates a standard Node.js HTTP request handler.
|
package/dist/adapters/node.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createNodeHandler = createNodeHandler;
|
|
4
|
+
const types_1 = require("@objectql/types");
|
|
4
5
|
const server_1 = require("../server");
|
|
5
|
-
const
|
|
6
|
+
const types_2 = require("../types");
|
|
6
7
|
const openapi_1 = require("../openapi");
|
|
7
8
|
const file_handler_1 = require("../file-handler");
|
|
8
9
|
const storage_1 = require("../storage");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
9
11
|
/**
|
|
10
12
|
* Creates a standard Node.js HTTP request handler.
|
|
11
13
|
*/
|
|
12
14
|
function createNodeHandler(app, options) {
|
|
13
15
|
const server = new server_1.ObjectQLServer(app);
|
|
16
|
+
const routes = (0, types_1.resolveApiRoutes)(options === null || options === void 0 ? void 0 : options.routes);
|
|
14
17
|
// Initialize file storage
|
|
18
|
+
const defaultBaseUrl = process.env.OBJECTQL_BASE_URL || `http://localhost:3000${routes.files}`;
|
|
15
19
|
const fileStorage = (options === null || options === void 0 ? void 0 : options.fileStorage) || new storage_1.LocalFileStorage({
|
|
16
20
|
baseDir: process.env.OBJECTQL_UPLOAD_DIR || './uploads',
|
|
17
|
-
baseUrl:
|
|
21
|
+
baseUrl: defaultBaseUrl
|
|
18
22
|
});
|
|
19
23
|
// Create file handlers
|
|
20
24
|
const uploadHandler = (0, file_handler_1.createFileUploadHandler)(fileStorage, app);
|
|
@@ -45,23 +49,23 @@ function createNodeHandler(app, options) {
|
|
|
45
49
|
let statusCode = 200;
|
|
46
50
|
if (result.error) {
|
|
47
51
|
switch (result.error.code) {
|
|
48
|
-
case
|
|
49
|
-
case
|
|
52
|
+
case types_2.ErrorCode.INVALID_REQUEST:
|
|
53
|
+
case types_2.ErrorCode.VALIDATION_ERROR:
|
|
50
54
|
statusCode = 400;
|
|
51
55
|
break;
|
|
52
|
-
case
|
|
56
|
+
case types_2.ErrorCode.UNAUTHORIZED:
|
|
53
57
|
statusCode = 401;
|
|
54
58
|
break;
|
|
55
|
-
case
|
|
59
|
+
case types_2.ErrorCode.FORBIDDEN:
|
|
56
60
|
statusCode = 403;
|
|
57
61
|
break;
|
|
58
|
-
case
|
|
62
|
+
case types_2.ErrorCode.NOT_FOUND:
|
|
59
63
|
statusCode = 404;
|
|
60
64
|
break;
|
|
61
|
-
case
|
|
65
|
+
case types_2.ErrorCode.CONFLICT:
|
|
62
66
|
statusCode = 409;
|
|
63
67
|
break;
|
|
64
|
-
case
|
|
68
|
+
case types_2.ErrorCode.RATE_LIMIT_EXCEEDED:
|
|
65
69
|
statusCode = 429;
|
|
66
70
|
break;
|
|
67
71
|
default:
|
|
@@ -77,7 +81,7 @@ function createNodeHandler(app, options) {
|
|
|
77
81
|
res.statusCode = 500;
|
|
78
82
|
res.end(JSON.stringify({
|
|
79
83
|
error: {
|
|
80
|
-
code:
|
|
84
|
+
code: types_2.ErrorCode.INTERNAL_ERROR,
|
|
81
85
|
message: 'Internal Server Error'
|
|
82
86
|
}
|
|
83
87
|
}));
|
|
@@ -87,22 +91,23 @@ function createNodeHandler(app, options) {
|
|
|
87
91
|
const urlObj = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
88
92
|
const pathName = urlObj.pathname;
|
|
89
93
|
const method = req.method;
|
|
90
|
-
// 1. JSON-RPC: POST
|
|
91
|
-
if (pathName ===
|
|
94
|
+
// 1. JSON-RPC: POST {rpcPath}
|
|
95
|
+
if (pathName === routes.rpc && method === 'POST') {
|
|
92
96
|
await processBody(req, async (json) => {
|
|
93
97
|
await handleRequest(json);
|
|
94
98
|
}, res);
|
|
95
99
|
return;
|
|
96
100
|
}
|
|
97
|
-
// 2. REST API:
|
|
98
|
-
// Regex to match /
|
|
99
|
-
const
|
|
101
|
+
// 2. REST API: {dataPath}/:object and {dataPath}/:object/:id
|
|
102
|
+
// Regex to match {dataPath}/objectName(/id)?
|
|
103
|
+
const escapedDataPath = (0, utils_1.escapeRegexPath)(routes.data);
|
|
104
|
+
const restMatch = pathName.match(new RegExp(`^${escapedDataPath}/([^/]+)(?:/(.+))?$`));
|
|
100
105
|
if (restMatch) {
|
|
101
106
|
const objectName = restMatch[1];
|
|
102
107
|
const id = restMatch[2];
|
|
103
108
|
const query = Object.fromEntries(urlObj.searchParams.entries());
|
|
104
109
|
if (method === 'GET') {
|
|
105
|
-
// GET
|
|
110
|
+
// GET {dataPath}/:object/:id -> findOne
|
|
106
111
|
if (id) {
|
|
107
112
|
await handleRequest({
|
|
108
113
|
op: 'findOne',
|
|
@@ -110,7 +115,7 @@ function createNodeHandler(app, options) {
|
|
|
110
115
|
args: id
|
|
111
116
|
});
|
|
112
117
|
}
|
|
113
|
-
// GET
|
|
118
|
+
// GET {dataPath}/:object -> find (List)
|
|
114
119
|
else {
|
|
115
120
|
// Parse standard params
|
|
116
121
|
const args = {};
|
|
@@ -133,7 +138,7 @@ function createNodeHandler(app, options) {
|
|
|
133
138
|
return;
|
|
134
139
|
}
|
|
135
140
|
if (method === 'POST' && !id) {
|
|
136
|
-
// POST
|
|
141
|
+
// POST {dataPath}/:object -> create
|
|
137
142
|
await processBody(req, async (body) => {
|
|
138
143
|
await handleRequest({
|
|
139
144
|
op: 'create',
|
|
@@ -144,7 +149,7 @@ function createNodeHandler(app, options) {
|
|
|
144
149
|
return;
|
|
145
150
|
}
|
|
146
151
|
if (method === 'PATCH' && id) {
|
|
147
|
-
// PATCH
|
|
152
|
+
// PATCH {dataPath}/:object/:id -> update
|
|
148
153
|
await processBody(req, async (body) => {
|
|
149
154
|
await handleRequest({
|
|
150
155
|
op: 'update',
|
|
@@ -158,7 +163,7 @@ function createNodeHandler(app, options) {
|
|
|
158
163
|
return;
|
|
159
164
|
}
|
|
160
165
|
if (method === 'DELETE' && id) {
|
|
161
|
-
// DELETE
|
|
166
|
+
// DELETE {dataPath}/:object/:id -> delete
|
|
162
167
|
await handleRequest({
|
|
163
168
|
op: 'delete',
|
|
164
169
|
object: objectName,
|
|
@@ -168,18 +173,19 @@ function createNodeHandler(app, options) {
|
|
|
168
173
|
}
|
|
169
174
|
}
|
|
170
175
|
// File Upload Endpoints
|
|
171
|
-
// POST /
|
|
172
|
-
if (pathName ===
|
|
176
|
+
// POST {filesPath}/upload - Single file upload
|
|
177
|
+
if (pathName === `${routes.files}/upload` && method === 'POST') {
|
|
173
178
|
await uploadHandler(req, res);
|
|
174
179
|
return;
|
|
175
180
|
}
|
|
176
|
-
// POST /
|
|
177
|
-
if (pathName ===
|
|
181
|
+
// POST {filesPath}/upload/batch - Batch file upload
|
|
182
|
+
if (pathName === `${routes.files}/upload/batch` && method === 'POST') {
|
|
178
183
|
await batchUploadHandler(req, res);
|
|
179
184
|
return;
|
|
180
185
|
}
|
|
181
|
-
// GET
|
|
182
|
-
const
|
|
186
|
+
// GET {filesPath}/:fileId - Download file
|
|
187
|
+
const escapedFilesPath = (0, utils_1.escapeRegexPath)(routes.files);
|
|
188
|
+
const fileMatch = pathName.match(new RegExp(`^${escapedFilesPath}/([^/]+)$`));
|
|
183
189
|
if (fileMatch && method === 'GET') {
|
|
184
190
|
const fileId = fileMatch[1];
|
|
185
191
|
await downloadHandler(req, res, fileId);
|
|
@@ -187,7 +193,7 @@ function createNodeHandler(app, options) {
|
|
|
187
193
|
}
|
|
188
194
|
// Fallback or 404
|
|
189
195
|
if (req.method === 'POST') {
|
|
190
|
-
// Fallback for root POSTs if people forget
|
|
196
|
+
// Fallback for root POSTs if people forget {rpcPath} but send to /api something
|
|
191
197
|
await processBody(req, handleRequest, res);
|
|
192
198
|
return;
|
|
193
199
|
}
|
|
@@ -195,11 +201,11 @@ function createNodeHandler(app, options) {
|
|
|
195
201
|
if (pathName === '/') {
|
|
196
202
|
res.setHeader('Allow', 'POST');
|
|
197
203
|
res.statusCode = 405;
|
|
198
|
-
res.end(JSON.stringify({ error: { code:
|
|
204
|
+
res.end(JSON.stringify({ error: { code: types_2.ErrorCode.INVALID_REQUEST, message: 'Method Not Allowed. Use POST for JSON-RPC.' } }));
|
|
199
205
|
return;
|
|
200
206
|
}
|
|
201
207
|
res.statusCode = 404;
|
|
202
|
-
res.end(JSON.stringify({ error: { code:
|
|
208
|
+
res.end(JSON.stringify({ error: { code: types_2.ErrorCode.NOT_FOUND, message: 'Not Found' } }));
|
|
203
209
|
};
|
|
204
210
|
}
|
|
205
211
|
// Helper to process body
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/rest.d.ts
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
|
-
import { IObjectQL } from '@objectql/types';
|
|
1
|
+
import { IObjectQL, ApiRouteConfig } from '@objectql/types';
|
|
2
2
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
|
+
/**
|
|
4
|
+
* Options for createRESTHandler
|
|
5
|
+
*/
|
|
6
|
+
export interface RESTHandlerOptions {
|
|
7
|
+
/** Custom API route configuration */
|
|
8
|
+
routes?: ApiRouteConfig;
|
|
9
|
+
}
|
|
3
10
|
/**
|
|
4
11
|
* Creates a REST-style HTTP request handler for ObjectQL
|
|
5
12
|
*
|
|
6
|
-
* Endpoints:
|
|
7
|
-
* - GET
|
|
8
|
-
* - GET
|
|
9
|
-
* - POST
|
|
10
|
-
* - POST
|
|
11
|
-
* - POST
|
|
12
|
-
* - PUT
|
|
13
|
-
* - DELETE
|
|
13
|
+
* Default Endpoints (configurable via routes option):
|
|
14
|
+
* - GET {dataPath}/:object - List records
|
|
15
|
+
* - GET {dataPath}/:object/:id - Get single record
|
|
16
|
+
* - POST {dataPath}/:object - Create record (or create many if array)
|
|
17
|
+
* - POST {dataPath}/:object/bulk-update - Update many records
|
|
18
|
+
* - POST {dataPath}/:object/bulk-delete - Delete many records
|
|
19
|
+
* - PUT {dataPath}/:object/:id - Update record
|
|
20
|
+
* - DELETE {dataPath}/:object/:id - Delete record
|
|
21
|
+
*
|
|
22
|
+
* @param app - ObjectQL application instance
|
|
23
|
+
* @param options - Optional configuration including custom routes
|
|
14
24
|
*/
|
|
15
|
-
export declare function createRESTHandler(app: IObjectQL): (req: IncomingMessage & {
|
|
25
|
+
export declare function createRESTHandler(app: IObjectQL, options?: RESTHandlerOptions): (req: IncomingMessage & {
|
|
16
26
|
body?: any;
|
|
17
27
|
}, res: ServerResponse) => Promise<void>;
|
package/dist/adapters/rest.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createRESTHandler = createRESTHandler;
|
|
4
|
+
const types_1 = require("@objectql/types");
|
|
4
5
|
const server_1 = require("../server");
|
|
5
|
-
const
|
|
6
|
+
const types_2 = require("../types");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
6
8
|
/**
|
|
7
9
|
* Parse query string parameters
|
|
8
10
|
*/
|
|
@@ -60,17 +62,22 @@ function sendJSON(res, statusCode, data) {
|
|
|
60
62
|
/**
|
|
61
63
|
* Creates a REST-style HTTP request handler for ObjectQL
|
|
62
64
|
*
|
|
63
|
-
* Endpoints:
|
|
64
|
-
* - GET
|
|
65
|
-
* - GET
|
|
66
|
-
* - POST
|
|
67
|
-
* - POST
|
|
68
|
-
* - POST
|
|
69
|
-
* - PUT
|
|
70
|
-
* - DELETE
|
|
65
|
+
* Default Endpoints (configurable via routes option):
|
|
66
|
+
* - GET {dataPath}/:object - List records
|
|
67
|
+
* - GET {dataPath}/:object/:id - Get single record
|
|
68
|
+
* - POST {dataPath}/:object - Create record (or create many if array)
|
|
69
|
+
* - POST {dataPath}/:object/bulk-update - Update many records
|
|
70
|
+
* - POST {dataPath}/:object/bulk-delete - Delete many records
|
|
71
|
+
* - PUT {dataPath}/:object/:id - Update record
|
|
72
|
+
* - DELETE {dataPath}/:object/:id - Delete record
|
|
73
|
+
*
|
|
74
|
+
* @param app - ObjectQL application instance
|
|
75
|
+
* @param options - Optional configuration including custom routes
|
|
71
76
|
*/
|
|
72
|
-
function createRESTHandler(app) {
|
|
77
|
+
function createRESTHandler(app, options) {
|
|
73
78
|
const server = new server_1.ObjectQLServer(app);
|
|
79
|
+
const routes = (0, types_1.resolveApiRoutes)(options === null || options === void 0 ? void 0 : options.routes);
|
|
80
|
+
const dataPath = routes.data;
|
|
74
81
|
return async (req, res) => {
|
|
75
82
|
try {
|
|
76
83
|
// CORS headers
|
|
@@ -94,12 +101,13 @@ function createRESTHandler(app) {
|
|
|
94
101
|
}
|
|
95
102
|
const url = req.url || '';
|
|
96
103
|
const method = req.method || 'GET';
|
|
97
|
-
// Parse URL:
|
|
98
|
-
const
|
|
104
|
+
// Parse URL: {dataPath}/:object or {dataPath}/:object/:id or {dataPath}/:object/bulk-*
|
|
105
|
+
const escapedPath = (0, utils_1.escapeRegexPath)(dataPath);
|
|
106
|
+
const match = url.match(new RegExp(`^${escapedPath}/([^/\\?]+)(?:/([^/\\?]+))?(\\?.*)?$`));
|
|
99
107
|
if (!match) {
|
|
100
108
|
sendJSON(res, 404, {
|
|
101
109
|
error: {
|
|
102
|
-
code:
|
|
110
|
+
code: types_2.ErrorCode.NOT_FOUND,
|
|
103
111
|
message: 'Invalid REST API endpoint'
|
|
104
112
|
}
|
|
105
113
|
});
|
|
@@ -119,7 +127,7 @@ function createRESTHandler(app) {
|
|
|
119
127
|
};
|
|
120
128
|
}
|
|
121
129
|
else {
|
|
122
|
-
// GET
|
|
130
|
+
// GET {dataPath}/:object - List records
|
|
123
131
|
const args = {};
|
|
124
132
|
// Parse query parameters
|
|
125
133
|
if (queryParams.filter) {
|
|
@@ -153,7 +161,7 @@ function createRESTHandler(app) {
|
|
|
153
161
|
const createBody = req.body || await readBody(req);
|
|
154
162
|
// Check for bulk operations
|
|
155
163
|
if (id === 'bulk-update') {
|
|
156
|
-
// POST
|
|
164
|
+
// POST {dataPath}/:object/bulk-update - Update many records
|
|
157
165
|
qlRequest = {
|
|
158
166
|
op: 'updateMany',
|
|
159
167
|
object: objectName,
|
|
@@ -164,7 +172,7 @@ function createRESTHandler(app) {
|
|
|
164
172
|
};
|
|
165
173
|
}
|
|
166
174
|
else if (id === 'bulk-delete') {
|
|
167
|
-
// POST
|
|
175
|
+
// POST {dataPath}/:object/bulk-delete - Delete many records
|
|
168
176
|
qlRequest = {
|
|
169
177
|
op: 'deleteMany',
|
|
170
178
|
object: objectName,
|
|
@@ -174,7 +182,7 @@ function createRESTHandler(app) {
|
|
|
174
182
|
};
|
|
175
183
|
}
|
|
176
184
|
else if (Array.isArray(createBody)) {
|
|
177
|
-
// POST
|
|
185
|
+
// POST {dataPath}/:object with array - Create many records
|
|
178
186
|
qlRequest = {
|
|
179
187
|
op: 'createMany',
|
|
180
188
|
object: objectName,
|
|
@@ -182,7 +190,7 @@ function createRESTHandler(app) {
|
|
|
182
190
|
};
|
|
183
191
|
}
|
|
184
192
|
else {
|
|
185
|
-
// POST
|
|
193
|
+
// POST {dataPath}/:object - Create single record
|
|
186
194
|
qlRequest = {
|
|
187
195
|
op: 'create',
|
|
188
196
|
object: objectName,
|
|
@@ -192,11 +200,11 @@ function createRESTHandler(app) {
|
|
|
192
200
|
break;
|
|
193
201
|
case 'PUT':
|
|
194
202
|
case 'PATCH':
|
|
195
|
-
// PUT
|
|
203
|
+
// PUT {dataPath}/:object/:id - Update record
|
|
196
204
|
if (!id) {
|
|
197
205
|
sendJSON(res, 400, {
|
|
198
206
|
error: {
|
|
199
|
-
code:
|
|
207
|
+
code: types_2.ErrorCode.INVALID_REQUEST,
|
|
200
208
|
message: 'ID is required for update operation'
|
|
201
209
|
}
|
|
202
210
|
});
|
|
@@ -213,11 +221,11 @@ function createRESTHandler(app) {
|
|
|
213
221
|
};
|
|
214
222
|
break;
|
|
215
223
|
case 'DELETE':
|
|
216
|
-
// DELETE
|
|
224
|
+
// DELETE {dataPath}/:object/:id - Delete record
|
|
217
225
|
if (!id) {
|
|
218
226
|
sendJSON(res, 400, {
|
|
219
227
|
error: {
|
|
220
|
-
code:
|
|
228
|
+
code: types_2.ErrorCode.INVALID_REQUEST,
|
|
221
229
|
message: 'ID is required for delete operation'
|
|
222
230
|
}
|
|
223
231
|
});
|
|
@@ -232,7 +240,7 @@ function createRESTHandler(app) {
|
|
|
232
240
|
default:
|
|
233
241
|
sendJSON(res, 405, {
|
|
234
242
|
error: {
|
|
235
|
-
code:
|
|
243
|
+
code: types_2.ErrorCode.INVALID_REQUEST,
|
|
236
244
|
message: 'Method not allowed'
|
|
237
245
|
}
|
|
238
246
|
});
|
|
@@ -244,23 +252,23 @@ function createRESTHandler(app) {
|
|
|
244
252
|
let statusCode = 200;
|
|
245
253
|
if (result.error) {
|
|
246
254
|
switch (result.error.code) {
|
|
247
|
-
case
|
|
248
|
-
case
|
|
255
|
+
case types_2.ErrorCode.INVALID_REQUEST:
|
|
256
|
+
case types_2.ErrorCode.VALIDATION_ERROR:
|
|
249
257
|
statusCode = 400;
|
|
250
258
|
break;
|
|
251
|
-
case
|
|
259
|
+
case types_2.ErrorCode.UNAUTHORIZED:
|
|
252
260
|
statusCode = 401;
|
|
253
261
|
break;
|
|
254
|
-
case
|
|
262
|
+
case types_2.ErrorCode.FORBIDDEN:
|
|
255
263
|
statusCode = 403;
|
|
256
264
|
break;
|
|
257
|
-
case
|
|
265
|
+
case types_2.ErrorCode.NOT_FOUND:
|
|
258
266
|
statusCode = 404;
|
|
259
267
|
break;
|
|
260
|
-
case
|
|
268
|
+
case types_2.ErrorCode.CONFLICT:
|
|
261
269
|
statusCode = 409;
|
|
262
270
|
break;
|
|
263
|
-
case
|
|
271
|
+
case types_2.ErrorCode.RATE_LIMIT_EXCEEDED:
|
|
264
272
|
statusCode = 429;
|
|
265
273
|
break;
|
|
266
274
|
default:
|
|
@@ -279,7 +287,7 @@ function createRESTHandler(app) {
|
|
|
279
287
|
console.error('[REST Handler] Error:', e);
|
|
280
288
|
sendJSON(res, 500, {
|
|
281
289
|
error: {
|
|
282
|
-
code:
|
|
290
|
+
code: types_2.ErrorCode.INTERNAL_ERROR,
|
|
283
291
|
message: 'Internal server error'
|
|
284
292
|
}
|
|
285
293
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/adapters/rest.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/adapters/rest.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * from './types';
|
|
2
|
+
export * from './utils';
|
|
2
3
|
export * from './openapi';
|
|
3
4
|
export * from './server';
|
|
4
5
|
export * from './metadata';
|
|
5
|
-
export * from './studio';
|
|
6
6
|
export * from './storage';
|
|
7
7
|
export * from './file-handler';
|
|
8
8
|
export * from './adapters/node';
|
package/dist/index.js
CHANGED
|
@@ -15,10 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./utils"), exports);
|
|
18
19
|
__exportStar(require("./openapi"), exports);
|
|
19
20
|
__exportStar(require("./server"), exports);
|
|
20
21
|
__exportStar(require("./metadata"), exports);
|
|
21
|
-
__exportStar(require("./studio"), exports);
|
|
22
22
|
__exportStar(require("./storage"), exports);
|
|
23
23
|
__exportStar(require("./file-handler"), exports);
|
|
24
24
|
// We export createNodeHandler from root for convenience,
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,0CAAwB;AACxB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,4CAA0B;AAC1B,iDAA+B;AAC/B,0DAA0D;AAC1D,+EAA+E;AAC/E,kDAAgC;AAChC,sBAAsB;AACtB,kDAAgC;AAChC,yBAAyB;AACzB,qDAAmC"}
|
package/dist/metadata.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
import { IObjectQL } from '@objectql/types';
|
|
1
|
+
import { IObjectQL, ApiRouteConfig } from '@objectql/types';
|
|
2
2
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
|
+
/**
|
|
4
|
+
* Options for createMetadataHandler
|
|
5
|
+
*/
|
|
6
|
+
export interface MetadataHandlerOptions {
|
|
7
|
+
/** Custom API route configuration */
|
|
8
|
+
routes?: ApiRouteConfig;
|
|
9
|
+
}
|
|
3
10
|
/**
|
|
4
11
|
* Creates a handler for metadata endpoints.
|
|
5
12
|
* These endpoints expose information about registered objects and other metadata.
|
|
13
|
+
*
|
|
14
|
+
* @param app - ObjectQL application instance
|
|
15
|
+
* @param options - Optional configuration including custom routes
|
|
6
16
|
*/
|
|
7
|
-
export declare function createMetadataHandler(app: IObjectQL): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
17
|
+
export declare function createMetadataHandler(app: IObjectQL, options?: MetadataHandlerOptions): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|