@objectql/server 1.4.0 → 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 +12 -0
- package/dist/adapters/node.js +116 -42
- package/dist/adapters/node.js.map +1 -1
- package/dist/metadata.d.ts +1 -1
- package/dist/metadata.js +101 -115
- package/dist/metadata.js.map +1 -1
- package/dist/openapi.js +73 -24
- package/dist/openapi.js.map +1 -1
- package/package.json +3 -3
- package/src/adapters/node.ts +124 -45
- package/src/metadata.ts +112 -125
- package/src/openapi.ts +80 -32
- package/tsconfig.json +5 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
package/dist/adapters/node.js
CHANGED
|
@@ -20,13 +20,13 @@ function createNodeHandler(app) {
|
|
|
20
20
|
}
|
|
21
21
|
const handleRequest = async (json) => {
|
|
22
22
|
try {
|
|
23
|
-
//
|
|
23
|
+
// Determine Operation based on JSON or previously derived info
|
|
24
24
|
const qlReq = {
|
|
25
25
|
op: json.op,
|
|
26
26
|
object: json.object,
|
|
27
27
|
args: json.args,
|
|
28
|
-
user: json.user,
|
|
29
|
-
ai_context: json.ai_context
|
|
28
|
+
user: json.user,
|
|
29
|
+
ai_context: json.ai_context
|
|
30
30
|
};
|
|
31
31
|
const result = await server.handle(qlReq);
|
|
32
32
|
// Determine HTTP status code based on error
|
|
@@ -61,6 +61,7 @@ function createNodeHandler(app) {
|
|
|
61
61
|
res.end(JSON.stringify(result));
|
|
62
62
|
}
|
|
63
63
|
catch (e) {
|
|
64
|
+
console.error(e);
|
|
64
65
|
res.statusCode = 500;
|
|
65
66
|
res.end(JSON.stringify({
|
|
66
67
|
error: {
|
|
@@ -70,55 +71,128 @@ function createNodeHandler(app) {
|
|
|
70
71
|
}));
|
|
71
72
|
}
|
|
72
73
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
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) {
|
|
82
95
|
await handleRequest({
|
|
83
|
-
op: '
|
|
96
|
+
op: 'findOne',
|
|
84
97
|
object: objectName,
|
|
85
|
-
args: {} //
|
|
98
|
+
args: { filters: [['_id', '=', id]] } // Assuming _id or id mapping
|
|
86
99
|
});
|
|
87
|
-
return;
|
|
88
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;
|
|
122
|
+
}
|
|
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;
|
|
89
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;
|
|
156
|
+
}
|
|
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');
|
|
90
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' } }));
|
|
173
|
+
};
|
|
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;
|
|
91
189
|
res.end(JSON.stringify({
|
|
92
190
|
error: {
|
|
93
|
-
code:
|
|
94
|
-
message: '
|
|
191
|
+
code: 'INVALID_JSON',
|
|
192
|
+
message: 'Invalid JSON body'
|
|
95
193
|
}
|
|
96
194
|
}));
|
|
97
|
-
return;
|
|
98
195
|
}
|
|
99
|
-
|
|
100
|
-
if (req.body && typeof req.body === 'object') {
|
|
101
|
-
await handleRequest(req.body);
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
// 2. Parse Body from stream
|
|
105
|
-
let body = '';
|
|
106
|
-
req.on('data', chunk => body += chunk);
|
|
107
|
-
req.on('end', async () => {
|
|
108
|
-
try {
|
|
109
|
-
const json = JSON.parse(body);
|
|
110
|
-
await handleRequest(json);
|
|
111
|
-
}
|
|
112
|
-
catch (e) {
|
|
113
|
-
res.statusCode = 400;
|
|
114
|
-
res.end(JSON.stringify({
|
|
115
|
-
error: {
|
|
116
|
-
code: types_1.ErrorCode.INVALID_REQUEST,
|
|
117
|
-
message: 'Invalid JSON'
|
|
118
|
-
}
|
|
119
|
-
}));
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
};
|
|
196
|
+
});
|
|
123
197
|
}
|
|
124
198
|
//# sourceMappingURL=node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
|
package/dist/metadata.d.ts
CHANGED
|
@@ -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>;
|
package/dist/metadata.js
CHANGED
|
@@ -21,7 +21,7 @@ function readBody(req) {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Creates a handler for metadata endpoints.
|
|
24
|
-
* These endpoints expose information about registered objects.
|
|
24
|
+
* These endpoints expose information about registered objects and other metadata.
|
|
25
25
|
*/
|
|
26
26
|
function createMetadataHandler(app) {
|
|
27
27
|
return async (req, res) => {
|
|
@@ -38,7 +38,19 @@ function createMetadataHandler(app) {
|
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
try {
|
|
41
|
-
//
|
|
41
|
+
// Helper to send JSON
|
|
42
|
+
const sendJson = (data, status = 200) => {
|
|
43
|
+
res.setHeader('Content-Type', 'application/json');
|
|
44
|
+
res.statusCode = status;
|
|
45
|
+
res.end(JSON.stringify(data));
|
|
46
|
+
};
|
|
47
|
+
const sendError = (code, message, status = 400) => {
|
|
48
|
+
sendJson({ error: { code, message } }, status);
|
|
49
|
+
};
|
|
50
|
+
// ---------------------------------------------------------
|
|
51
|
+
// 1. List Entries (GET /api/metadata/:type)
|
|
52
|
+
// ---------------------------------------------------------
|
|
53
|
+
// Legacy/Alias: /api/metadata or /api/metadata/objects -> list objects
|
|
42
54
|
if (method === 'GET' && (url === '/api/metadata' || url === '/api/metadata/objects')) {
|
|
43
55
|
const configs = app.getConfigs();
|
|
44
56
|
const objects = Object.values(configs).map(obj => ({
|
|
@@ -48,80 +60,95 @@ function createMetadataHandler(app) {
|
|
|
48
60
|
description: obj.description,
|
|
49
61
|
fields: obj.fields || {}
|
|
50
62
|
}));
|
|
51
|
-
|
|
52
|
-
res.statusCode = 200;
|
|
53
|
-
res.end(JSON.stringify({ objects }));
|
|
54
|
-
return;
|
|
63
|
+
return sendJson({ objects });
|
|
55
64
|
}
|
|
56
|
-
//
|
|
57
|
-
const
|
|
58
|
-
if (method === 'GET' &&
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
// Generic List: /api/metadata/:type
|
|
66
|
+
const listMatch = url.match(/^\/api\/metadata\/([^\/]+)$/);
|
|
67
|
+
if (method === 'GET' && listMatch) {
|
|
68
|
+
let [, type] = listMatch;
|
|
69
|
+
if (type === 'objects')
|
|
70
|
+
type = 'object'; // Should not hit due to order, but safe to keep.
|
|
71
|
+
const entries = app.metadata.list(type);
|
|
72
|
+
// Return simple list
|
|
73
|
+
return sendJson({
|
|
74
|
+
[type]: entries
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// ---------------------------------------------------------
|
|
78
|
+
// 2. Get Single Entry (GET /api/metadata/:type/:id)
|
|
79
|
+
// ---------------------------------------------------------
|
|
80
|
+
const detailMatch = url.match(/^\/api\/metadata\/([^\/]+)\/([^\/\?]+)$/);
|
|
81
|
+
if (method === 'GET' && detailMatch) {
|
|
82
|
+
let [, type, id] = detailMatch;
|
|
83
|
+
// Handle Object Special Logic (Field Formatting)
|
|
84
|
+
if (type === 'objects' || type === 'object') {
|
|
85
|
+
const metadata = app.getObject(id);
|
|
86
|
+
if (!metadata) {
|
|
87
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Object '${id}' not found`, 404);
|
|
88
|
+
}
|
|
89
|
+
// Convert fields object to array (Standard Object Response)
|
|
90
|
+
const fields = metadata.fields
|
|
91
|
+
? Object.entries(metadata.fields).map(([key, field]) => ({
|
|
92
|
+
name: field.name || key,
|
|
93
|
+
type: field.type,
|
|
94
|
+
label: field.label,
|
|
95
|
+
required: field.required,
|
|
96
|
+
defaultValue: field.defaultValue,
|
|
97
|
+
unique: field.unique,
|
|
98
|
+
options: field.options,
|
|
99
|
+
min: field.min,
|
|
100
|
+
max: field.max,
|
|
101
|
+
min_length: field.min_length,
|
|
102
|
+
max_length: field.max_length,
|
|
103
|
+
regex: field.regex
|
|
104
|
+
}))
|
|
105
|
+
: [];
|
|
106
|
+
return sendJson({
|
|
107
|
+
...metadata,
|
|
108
|
+
fields
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Generic Metadata (View, Form, etc.)
|
|
113
|
+
const content = app.metadata.get(type, id);
|
|
114
|
+
if (!content) {
|
|
115
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `${type} '${id}' not found`, 404);
|
|
116
|
+
}
|
|
117
|
+
return sendJson(content);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------
|
|
121
|
+
// 3. Update Entry (POST/PUT /api/metadata/:type/:id)
|
|
122
|
+
// ---------------------------------------------------------
|
|
123
|
+
if ((method === 'POST' || method === 'PUT') && detailMatch) {
|
|
124
|
+
let [, type, id] = detailMatch;
|
|
125
|
+
if (type === 'objects')
|
|
126
|
+
type = 'object';
|
|
127
|
+
const body = await readBody(req);
|
|
128
|
+
try {
|
|
129
|
+
await app.updateMetadata(type, id, body);
|
|
130
|
+
return sendJson({ success: true });
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
const isUserError = e.message.startsWith('Cannot update') || e.message.includes('not found');
|
|
134
|
+
return sendError(isUserError ? types_1.ErrorCode.INVALID_REQUEST : types_1.ErrorCode.INTERNAL_ERROR, e.message, isUserError ? 400 : 500);
|
|
70
135
|
}
|
|
71
|
-
// Convert fields object to array
|
|
72
|
-
const fields = metadata.fields
|
|
73
|
-
? Object.entries(metadata.fields).map(([key, field]) => ({
|
|
74
|
-
name: field.name || key,
|
|
75
|
-
type: field.type,
|
|
76
|
-
label: field.label,
|
|
77
|
-
required: field.required,
|
|
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
|
|
86
|
-
}))
|
|
87
|
-
: [];
|
|
88
|
-
res.setHeader('Content-Type', 'application/json');
|
|
89
|
-
res.statusCode = 200;
|
|
90
|
-
res.end(JSON.stringify({
|
|
91
|
-
...metadata,
|
|
92
|
-
fields
|
|
93
|
-
}));
|
|
94
|
-
return;
|
|
95
136
|
}
|
|
96
|
-
//
|
|
137
|
+
// ---------------------------------------------------------
|
|
138
|
+
// 4. Object Sub-resources (Fields, Actions)
|
|
139
|
+
// ---------------------------------------------------------
|
|
140
|
+
// GET /api/metadata/objects/:name/fields/:field
|
|
141
|
+
// Legacy path support.
|
|
97
142
|
const fieldMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/fields\/([^\/\?]+)$/);
|
|
98
143
|
if (method === 'GET' && fieldMatch) {
|
|
99
144
|
const [, objectName, fieldName] = fieldMatch;
|
|
100
145
|
const metadata = app.getObject(objectName);
|
|
101
|
-
if (!metadata)
|
|
102
|
-
|
|
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
|
-
}
|
|
146
|
+
if (!metadata)
|
|
147
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Object '${objectName}' not found`, 404);
|
|
111
148
|
const field = metadata.fields?.[fieldName];
|
|
112
|
-
if (!field)
|
|
113
|
-
|
|
114
|
-
|
|
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({
|
|
149
|
+
if (!field)
|
|
150
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Field '${fieldName}' not found`, 404);
|
|
151
|
+
return sendJson({
|
|
125
152
|
name: field.name || fieldName,
|
|
126
153
|
type: field.type,
|
|
127
154
|
label: field.label,
|
|
@@ -134,24 +161,15 @@ function createMetadataHandler(app) {
|
|
|
134
161
|
min_length: field.min_length,
|
|
135
162
|
max_length: field.max_length,
|
|
136
163
|
regex: field.regex
|
|
137
|
-
})
|
|
138
|
-
return;
|
|
164
|
+
});
|
|
139
165
|
}
|
|
140
|
-
// GET /api/metadata/objects/:name/actions
|
|
166
|
+
// GET /api/metadata/objects/:name/actions
|
|
141
167
|
const actionsMatch = url.match(/^\/api\/metadata\/objects\/([^\/]+)\/actions$/);
|
|
142
168
|
if (method === 'GET' && actionsMatch) {
|
|
143
169
|
const [, objectName] = actionsMatch;
|
|
144
170
|
const metadata = app.getObject(objectName);
|
|
145
|
-
if (!metadata)
|
|
146
|
-
|
|
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
|
-
}
|
|
171
|
+
if (!metadata)
|
|
172
|
+
return sendError(types_1.ErrorCode.NOT_FOUND, `Object '${objectName}' not found`, 404);
|
|
155
173
|
const actions = metadata.actions || {};
|
|
156
174
|
const formattedActions = Object.entries(actions).map(([key, action]) => {
|
|
157
175
|
const actionConfig = action;
|
|
@@ -164,42 +182,10 @@ function createMetadataHandler(app) {
|
|
|
164
182
|
description: actionConfig.description
|
|
165
183
|
};
|
|
166
184
|
});
|
|
167
|
-
|
|
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;
|
|
185
|
+
return sendJson({ actions: formattedActions });
|
|
194
186
|
}
|
|
195
187
|
// Not found
|
|
196
|
-
|
|
197
|
-
res.end(JSON.stringify({
|
|
198
|
-
error: {
|
|
199
|
-
code: types_1.ErrorCode.NOT_FOUND,
|
|
200
|
-
message: 'Not Found'
|
|
201
|
-
}
|
|
202
|
-
}));
|
|
188
|
+
sendError(types_1.ErrorCode.NOT_FOUND, 'Not Found', 404);
|
|
203
189
|
}
|
|
204
190
|
catch (e) {
|
|
205
191
|
console.error('[Metadata Handler] Error:', e);
|
package/dist/metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;AAwBA,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;AAwBA,sDAsMC;AA5ND,mCAAoC;AAEpC,SAAS,QAAQ,CAAC,GAAoB;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACf,IAAI,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,MAAM,CAAC,CAAC,CAAC,CAAC;YACd,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;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;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAE1B,+BAA+B;QAC/B,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,yBAAyB,CAAC,CAAC;QACzE,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,sBAAsB;YACtB,MAAM,QAAQ,GAAG,CAAC,IAAS,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE;gBACzC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,CAAC,IAAe,EAAE,OAAe,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE;gBACjE,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC,CAAC;YAEF,4DAA4D;YAC5D,4CAA4C;YAC5C,4DAA4D;YAE5D,uEAAuE;YACvE,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,GAAG,KAAK,uBAAuB,CAAC,EAAE,CAAC;gBACnF,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,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;iBAC3B,CAAC,CAAC,CAAC;gBACJ,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACjC,CAAC;YAED,oCAAoC;YACpC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,IAAI,MAAM,KAAK,KAAK,IAAI,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;gBACzB,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,iDAAiD;gBAE1F,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,qBAAqB;gBACrB,OAAO,QAAQ,CAAC;oBACZ,CAAC,IAAI,CAAC,EAAE,OAAO;iBAClB,CAAC,CAAC;YACP,CAAC;YAED,4DAA4D;YAC5D,oDAAoD;YACpD,4DAA4D;YAE5D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAEzE,IAAI,MAAM,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;gBAClC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC;gBAE/B,iDAAiD;gBACjD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACZ,OAAO,SAAS,CAAC,iBAAS,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;oBAC3E,CAAC;oBAED,4DAA4D;oBAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;wBAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;4BACrD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG;4BACvB,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,YAAY,EAAE,KAAK,CAAC,YAAY;4BAChC,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;yBACrB,CAAC,CAAC;wBACH,CAAC,CAAC,EAAE,CAAC;oBAET,OAAO,QAAQ,CAAC;wBACZ,GAAG,QAAQ;wBACX,MAAM;qBACT,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,sCAAsC;oBACtC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;wBACV,OAAO,SAAS,CAAC,iBAAS,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;oBAC7E,CAAC;oBACD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;YACL,CAAC;YAED,4DAA4D;YAC5D,qDAAqD;YACrD,4DAA4D;YAC5D,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;gBACzD,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC;gBAC/B,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,GAAG,QAAQ,CAAC;gBAExC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,CAAC;oBACD,MAAM,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;oBACzC,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBACd,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;oBAC7F,OAAO,SAAS,CACZ,WAAW,CAAC,CAAC,CAAC,iBAAS,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAS,CAAC,cAAc,EAClE,CAAC,CAAC,OAAO,EACT,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAC1B,CAAC;gBACN,CAAC;YACL,CAAC;YAED,4DAA4D;YAC5D,4CAA4C;YAC5C,4DAA4D;YAE5D,gDAAgD;YAChD,uBAAuB;YACvB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACzF,IAAI,MAAM,KAAK,KAAK,IAAI,UAAU,EAAE,CAAC;gBACjC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC;gBAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAE3C,IAAI,CAAC,QAAQ;oBAAE,OAAO,SAAS,CAAC,iBAAS,CAAC,SAAS,EAAE,WAAW,UAAU,aAAa,EAAE,GAAG,CAAC,CAAC;gBAE9F,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,KAAK;oBAAE,OAAO,SAAS,CAAC,iBAAS,CAAC,SAAS,EAAE,UAAU,SAAS,aAAa,EAAE,GAAG,CAAC,CAAC;gBAEzF,OAAO,QAAQ,CAAC;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;oBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;iBACrB,CAAC,CAAC;YACP,CAAC;YAED,0CAA0C;YAC1C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAChF,IAAI,MAAM,KAAK,KAAK,IAAI,YAAY,EAAE,CAAC;gBACnC,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC;gBACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAE3C,IAAI,CAAC,QAAQ;oBAAE,OAAO,SAAS,CAAC,iBAAS,CAAC,SAAS,EAAE,WAAW,UAAU,aAAa,EAAE,GAAG,CAAC,CAAC;gBAE9F,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;gBACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;oBACnE,MAAM,YAAY,GAAG,MAAa,CAAC;oBACnC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACvF,OAAO;wBACH,IAAI,EAAE,GAAG;wBACT,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;wBAC5D,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,GAAG;wBAChC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;wBACjC,WAAW,EAAE,YAAY,CAAC,WAAW;qBACxC,CAAC;gBACN,CAAC,CAAC,CAAC;gBAEH,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,YAAY;YACZ,SAAS,CAAC,iBAAS,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAErD,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;gBACnB,KAAK,EAAE;oBACH,IAAI,EAAE,iBAAS,CAAC,cAAc;oBAC9B,OAAO,EAAE,uBAAuB;iBACnC;aACJ,CAAC,CAAC,CAAC;QACR,CAAC;IACL,CAAC,CAAC;AACN,CAAC"}
|