@objectql/server 1.8.3 → 1.9.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 +27 -0
- package/dist/adapters/graphql.js +25 -0
- package/dist/adapters/graphql.js.map +1 -1
- package/dist/adapters/node.d.ts +3 -1
- package/dist/adapters/node.js +52 -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/graphql.ts +28 -0
- package/src/adapters/node.ts +44 -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
|
@@ -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>;
|
package/dist/metadata.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createMetadataHandler = createMetadataHandler;
|
|
4
|
-
const types_1 = require("
|
|
4
|
+
const types_1 = require("@objectql/types");
|
|
5
|
+
const types_2 = require("./types");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
5
7
|
function readBody(req) {
|
|
6
8
|
return new Promise((resolve, reject) => {
|
|
7
9
|
let body = '';
|
|
@@ -22,8 +24,13 @@ function readBody(req) {
|
|
|
22
24
|
/**
|
|
23
25
|
* Creates a handler for metadata endpoints.
|
|
24
26
|
* These endpoints expose information about registered objects and other metadata.
|
|
27
|
+
*
|
|
28
|
+
* @param app - ObjectQL application instance
|
|
29
|
+
* @param options - Optional configuration including custom routes
|
|
25
30
|
*/
|
|
26
|
-
function createMetadataHandler(app) {
|
|
31
|
+
function createMetadataHandler(app, options) {
|
|
32
|
+
const routes = (0, types_1.resolveApiRoutes)(options === null || options === void 0 ? void 0 : options.routes);
|
|
33
|
+
const metadataPath = routes.metadata;
|
|
27
34
|
return async (req, res) => {
|
|
28
35
|
var _a;
|
|
29
36
|
// Parse the URL
|
|
@@ -49,12 +56,13 @@ function createMetadataHandler(app) {
|
|
|
49
56
|
sendJson({ error: { code, message } }, status);
|
|
50
57
|
};
|
|
51
58
|
// ---------------------------------------------------------
|
|
52
|
-
// 1. List Entries (GET
|
|
59
|
+
// 1. List Entries (GET {metadataPath}/:type)
|
|
53
60
|
// ---------------------------------------------------------
|
|
54
|
-
// Generic List:
|
|
55
|
-
// Also handles legacy
|
|
56
|
-
const
|
|
57
|
-
const
|
|
61
|
+
// Generic List: {metadataPath}/:type
|
|
62
|
+
// Also handles legacy {metadataPath} (defaults to objects)
|
|
63
|
+
const escapedPath = (0, utils_1.escapeRegexPath)(metadataPath);
|
|
64
|
+
const listMatch = url.match(new RegExp(`^${escapedPath}/([^/]+)$`));
|
|
65
|
+
const isRootMetadata = url === metadataPath;
|
|
58
66
|
if (method === 'GET' && (listMatch || isRootMetadata)) {
|
|
59
67
|
let type = isRootMetadata ? 'object' : listMatch[1];
|
|
60
68
|
if (type === 'objects')
|
|
@@ -78,9 +86,9 @@ function createMetadataHandler(app) {
|
|
|
78
86
|
});
|
|
79
87
|
}
|
|
80
88
|
// ---------------------------------------------------------
|
|
81
|
-
// 2. Get Single Entry (GET
|
|
89
|
+
// 2. Get Single Entry (GET {metadataPath}/:type/:id)
|
|
82
90
|
// ---------------------------------------------------------
|
|
83
|
-
const detailMatch = url.match(
|
|
91
|
+
const detailMatch = url.match(new RegExp(`^${escapedPath}/([^/]+)/([^/\\?]+)$`));
|
|
84
92
|
if (method === 'GET' && detailMatch) {
|
|
85
93
|
let [, type, id] = detailMatch;
|
|
86
94
|
if (type === 'objects')
|
|
@@ -89,7 +97,7 @@ function createMetadataHandler(app) {
|
|
|
89
97
|
if (type === 'object') {
|
|
90
98
|
const metadata = app.getObject(id);
|
|
91
99
|
if (!metadata) {
|
|
92
|
-
return sendError(
|
|
100
|
+
return sendError(types_2.ErrorCode.NOT_FOUND, `Object '${id}' not found`, 404);
|
|
93
101
|
}
|
|
94
102
|
// Convert fields to map with name populated
|
|
95
103
|
const fields = {};
|
|
@@ -110,13 +118,13 @@ function createMetadataHandler(app) {
|
|
|
110
118
|
// Generic Metadata (View, Form, etc.)
|
|
111
119
|
const content = app.metadata.get(type, id);
|
|
112
120
|
if (!content) {
|
|
113
|
-
return sendError(
|
|
121
|
+
return sendError(types_2.ErrorCode.NOT_FOUND, `${type} '${id}' not found`, 404);
|
|
114
122
|
}
|
|
115
123
|
return sendJson(content);
|
|
116
124
|
}
|
|
117
125
|
}
|
|
118
126
|
// ---------------------------------------------------------
|
|
119
|
-
// 3. Update Entry (POST/PUT
|
|
127
|
+
// 3. Update Entry (POST/PUT {metadataPath}/:type/:id)
|
|
120
128
|
// ---------------------------------------------------------
|
|
121
129
|
if ((method === 'POST' || method === 'PUT') && detailMatch) {
|
|
122
130
|
let [, type, id] = detailMatch;
|
|
@@ -126,27 +134,27 @@ function createMetadataHandler(app) {
|
|
|
126
134
|
try {
|
|
127
135
|
// await app.updateMetadata(type, id, body);
|
|
128
136
|
// return sendJson({ success: true });
|
|
129
|
-
return sendError(
|
|
137
|
+
return sendError(types_2.ErrorCode.INTERNAL_ERROR, 'Metadata updates via API are temporarily disabled in this architectural version.', 501);
|
|
130
138
|
}
|
|
131
139
|
catch (e) {
|
|
132
140
|
const isUserError = e.message.startsWith('Cannot update') || e.message.includes('not found');
|
|
133
|
-
return sendError(isUserError ?
|
|
141
|
+
return sendError(isUserError ? types_2.ErrorCode.INVALID_REQUEST : types_2.ErrorCode.INTERNAL_ERROR, e.message, isUserError ? 400 : 500);
|
|
134
142
|
}
|
|
135
143
|
}
|
|
136
144
|
// ---------------------------------------------------------
|
|
137
145
|
// 4. Object Sub-resources (Fields, Actions)
|
|
138
146
|
// ---------------------------------------------------------
|
|
139
|
-
// GET /
|
|
147
|
+
// GET {metadataPath}/object/:name/fields/:field
|
|
140
148
|
// Legacy path support.
|
|
141
|
-
const fieldMatch = url.match(
|
|
149
|
+
const fieldMatch = url.match(new RegExp(`^${escapedPath}/(?:objects|object)/([^/]+)/fields/([^/\\?]+)$`));
|
|
142
150
|
if (method === 'GET' && fieldMatch) {
|
|
143
151
|
const [, objectName, fieldName] = fieldMatch;
|
|
144
152
|
const metadata = app.getObject(objectName);
|
|
145
153
|
if (!metadata)
|
|
146
|
-
return sendError(
|
|
154
|
+
return sendError(types_2.ErrorCode.NOT_FOUND, `Object '${objectName}' not found`, 404);
|
|
147
155
|
const field = (_a = metadata.fields) === null || _a === void 0 ? void 0 : _a[fieldName];
|
|
148
156
|
if (!field)
|
|
149
|
-
return sendError(
|
|
157
|
+
return sendError(types_2.ErrorCode.NOT_FOUND, `Field '${fieldName}' not found`, 404);
|
|
150
158
|
return sendJson({
|
|
151
159
|
name: field.name || fieldName,
|
|
152
160
|
type: field.type,
|
|
@@ -162,13 +170,13 @@ function createMetadataHandler(app) {
|
|
|
162
170
|
regex: field.regex
|
|
163
171
|
});
|
|
164
172
|
}
|
|
165
|
-
// GET /
|
|
166
|
-
const actionsMatch = url.match(
|
|
173
|
+
// GET {metadataPath}/object/:name/actions
|
|
174
|
+
const actionsMatch = url.match(new RegExp(`^${escapedPath}/(?:objects|object)/([^/]+)/actions$`));
|
|
167
175
|
if (method === 'GET' && actionsMatch) {
|
|
168
176
|
const [, objectName] = actionsMatch;
|
|
169
177
|
const metadata = app.getObject(objectName);
|
|
170
178
|
if (!metadata)
|
|
171
|
-
return sendError(
|
|
179
|
+
return sendError(types_2.ErrorCode.NOT_FOUND, `Object '${objectName}' not found`, 404);
|
|
172
180
|
const actions = metadata.actions || {};
|
|
173
181
|
const formattedActions = Object.entries(actions).map(([key, action]) => {
|
|
174
182
|
const actionConfig = action;
|
|
@@ -184,14 +192,14 @@ function createMetadataHandler(app) {
|
|
|
184
192
|
return sendJson({ items: formattedActions });
|
|
185
193
|
}
|
|
186
194
|
// Not found
|
|
187
|
-
sendError(
|
|
195
|
+
sendError(types_2.ErrorCode.NOT_FOUND, 'Not Found', 404);
|
|
188
196
|
}
|
|
189
197
|
catch (e) {
|
|
190
198
|
console.error('[Metadata Handler] Error:', e);
|
|
191
199
|
res.statusCode = 500;
|
|
192
200
|
res.end(JSON.stringify({
|
|
193
201
|
error: {
|
|
194
|
-
code:
|
|
202
|
+
code: types_2.ErrorCode.INTERNAL_ERROR,
|
|
195
203
|
message: 'Internal Server Error'
|
|
196
204
|
}
|
|
197
205
|
}));
|
package/dist/metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/openapi.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IObjectQL } from '@objectql/types';
|
|
1
|
+
import { IObjectQL, ApiRouteConfig } from '@objectql/types';
|
|
2
2
|
interface OpenAPISchema {
|
|
3
3
|
openapi: string;
|
|
4
4
|
info: {
|
|
@@ -10,5 +10,5 @@ interface OpenAPISchema {
|
|
|
10
10
|
schemas: Record<string, any>;
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
-
export declare function generateOpenAPI(app: IObjectQL): OpenAPISchema;
|
|
13
|
+
export declare function generateOpenAPI(app: IObjectQL, routeConfig?: ApiRouteConfig): OpenAPISchema;
|
|
14
14
|
export {};
|
package/dist/openapi.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateOpenAPI = generateOpenAPI;
|
|
4
|
-
|
|
4
|
+
const types_1 = require("@objectql/types");
|
|
5
|
+
function generateOpenAPI(app, routeConfig) {
|
|
5
6
|
const registry = app.metadata; // Direct access or via interface
|
|
6
7
|
const objects = registry.list('object');
|
|
8
|
+
const routes = (0, types_1.resolveApiRoutes)(routeConfig);
|
|
7
9
|
const paths = {};
|
|
8
10
|
const schemas = {};
|
|
9
11
|
// 1. JSON-RPC Endpoint
|
|
10
|
-
paths[
|
|
12
|
+
paths[routes.rpc] = {
|
|
11
13
|
post: {
|
|
12
14
|
summary: 'JSON-RPC Entry Point',
|
|
13
15
|
description: 'Execute any ObjectQL operation via a JSON body.',
|
|
@@ -54,8 +56,8 @@ function generateOpenAPI(app) {
|
|
|
54
56
|
// 3. REST API Paths
|
|
55
57
|
for (const obj of objects) {
|
|
56
58
|
const name = obj.name;
|
|
57
|
-
const basePath =
|
|
58
|
-
// GET
|
|
59
|
+
const basePath = `${routes.data}/${name}`; // Standard REST Path
|
|
60
|
+
// GET {dataPath}/:name (List)
|
|
59
61
|
paths[basePath] = {
|
|
60
62
|
get: {
|
|
61
63
|
summary: `List ${name}`,
|
package/dist/openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":";;AAcA,
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for server operations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Escapes special regex characters in a path string for use in RegExp
|
|
6
|
+
* @param path - The path string to escape
|
|
7
|
+
* @returns Escaped path string safe for use in RegExp
|
|
8
|
+
*/
|
|
9
|
+
export declare function escapeRegexPath(path: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Normalizes a path to ensure it starts with a forward slash
|
|
12
|
+
* @param path - The path string to normalize
|
|
13
|
+
* @returns Normalized path string starting with '/'
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizePath(path: string): string;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for server operations
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.escapeRegexPath = escapeRegexPath;
|
|
7
|
+
exports.normalizePath = normalizePath;
|
|
8
|
+
/**
|
|
9
|
+
* Escapes special regex characters in a path string for use in RegExp
|
|
10
|
+
* @param path - The path string to escape
|
|
11
|
+
* @returns Escaped path string safe for use in RegExp
|
|
12
|
+
*/
|
|
13
|
+
function escapeRegexPath(path) {
|
|
14
|
+
return path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes a path to ensure it starts with a forward slash
|
|
18
|
+
* @param path - The path string to normalize
|
|
19
|
+
* @returns Normalized path string starting with '/'
|
|
20
|
+
*/
|
|
21
|
+
function normalizePath(path) {
|
|
22
|
+
return path.startsWith('/') ? path : `/${path}`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAOH,0CAEC;AAOD,sCAEC;AAhBD;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACpD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectql/server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "HTTP server adapter for ObjectQL - Express/NestJS compatible with GraphQL and REST API support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"objectql",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"graphql": "^16.8.1",
|
|
22
22
|
"@graphql-tools/schema": "^10.0.2",
|
|
23
23
|
"js-yaml": "^4.1.1",
|
|
24
|
-
"@objectql/core": "1.
|
|
25
|
-
"@objectql/types": "1.
|
|
24
|
+
"@objectql/core": "1.9.0",
|
|
25
|
+
"@objectql/types": "1.9.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/js-yaml": "^4.0.9",
|
package/src/adapters/graphql.ts
CHANGED
|
@@ -4,6 +4,22 @@ import { ErrorCode } from '../types';
|
|
|
4
4
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
5
5
|
import { graphql, GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLList, GraphQLNonNull, GraphQLInputObjectType, GraphQLFieldConfigMap, GraphQLOutputType, GraphQLInputType } from 'graphql';
|
|
6
6
|
|
|
7
|
+
const APOLLO_SANDBOX_HTML = `
|
|
8
|
+
<!DOCTYPE html>
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<body style="margin: 0; overflow-x: hidden; overflow-y: hidden">
|
|
11
|
+
<div id="sandbox" style="height:100vh; width:100vw;"></div>
|
|
12
|
+
<script src="https://embeddable-sandbox.cdn.apollographql.com/_latest/embeddable-sandbox.umd.production.min.js"></script>
|
|
13
|
+
<script>
|
|
14
|
+
new window.EmbeddedSandbox({
|
|
15
|
+
target: "#sandbox",
|
|
16
|
+
initialEndpoint: window.location.href,
|
|
17
|
+
includeCookies: false, // Set to true if you need auth cookies
|
|
18
|
+
});
|
|
19
|
+
</script>
|
|
20
|
+
</body>
|
|
21
|
+
</html>`;
|
|
22
|
+
|
|
7
23
|
/**
|
|
8
24
|
* Normalize ObjectQL response to use 'id' instead of '_id'
|
|
9
25
|
*/
|
|
@@ -421,6 +437,18 @@ export function createGraphQLHandler(app: IObjectQL) {
|
|
|
421
437
|
return;
|
|
422
438
|
}
|
|
423
439
|
|
|
440
|
+
// HTML Playground Support (Apollo Sandbox)
|
|
441
|
+
// If it's a browser GET request without query params, show the playground
|
|
442
|
+
const acceptHeader = req.headers.accept || '';
|
|
443
|
+
const urlObj = new URL(req.url || '', `http://${req.headers.host || 'localhost'}`);
|
|
444
|
+
const hasQueryParams = urlObj.searchParams.has('query');
|
|
445
|
+
|
|
446
|
+
if (req.method === 'GET' && acceptHeader.includes('text/html') && !hasQueryParams) {
|
|
447
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
448
|
+
res.end(APOLLO_SANDBOX_HTML);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
|
|
424
452
|
const url = req.url || '';
|
|
425
453
|
const method = req.method || 'POST';
|
|
426
454
|
|
package/src/adapters/node.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { IObjectQL } from '@objectql/types';
|
|
1
|
+
import { IObjectQL, ApiRouteConfig, resolveApiRoutes } from '@objectql/types';
|
|
2
2
|
import { ObjectQLServer } from '../server';
|
|
3
3
|
import { ObjectQLRequest, ErrorCode, IFileStorage } from '../types';
|
|
4
4
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
5
5
|
import { generateOpenAPI } from '../openapi';
|
|
6
6
|
import { createFileUploadHandler, createBatchFileUploadHandler, createFileDownloadHandler } from '../file-handler';
|
|
7
7
|
import { LocalFileStorage } from '../storage';
|
|
8
|
+
import { escapeRegexPath } from '../utils';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Options for createNodeHandler
|
|
@@ -12,6 +13,8 @@ import { LocalFileStorage } from '../storage';
|
|
|
12
13
|
export interface NodeHandlerOptions {
|
|
13
14
|
/** File storage provider (defaults to LocalFileStorage) */
|
|
14
15
|
fileStorage?: IFileStorage;
|
|
16
|
+
/** Custom API route configuration */
|
|
17
|
+
routes?: ApiRouteConfig;
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
/**
|
|
@@ -19,11 +22,13 @@ export interface NodeHandlerOptions {
|
|
|
19
22
|
*/
|
|
20
23
|
export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions) {
|
|
21
24
|
const server = new ObjectQLServer(app);
|
|
25
|
+
const routes = resolveApiRoutes(options?.routes);
|
|
22
26
|
|
|
23
27
|
// Initialize file storage
|
|
28
|
+
const defaultBaseUrl = process.env.OBJECTQL_BASE_URL || `http://localhost:3000${routes.files}`;
|
|
24
29
|
const fileStorage = options?.fileStorage || new LocalFileStorage({
|
|
25
30
|
baseDir: process.env.OBJECTQL_UPLOAD_DIR || './uploads',
|
|
26
|
-
baseUrl:
|
|
31
|
+
baseUrl: defaultBaseUrl
|
|
27
32
|
});
|
|
28
33
|
|
|
29
34
|
// Create file handlers
|
|
@@ -33,6 +38,24 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
33
38
|
|
|
34
39
|
|
|
35
40
|
return async (req: IncomingMessage & { body?: any }, res: ServerResponse) => {
|
|
41
|
+
// CORS Headers
|
|
42
|
+
const origin = req.headers.origin;
|
|
43
|
+
if (origin) {
|
|
44
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
45
|
+
res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
46
|
+
} else {
|
|
47
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
48
|
+
}
|
|
49
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
|
|
50
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
|
|
51
|
+
|
|
52
|
+
// Handle preflight requests
|
|
53
|
+
if (req.method === 'OPTIONS') {
|
|
54
|
+
res.statusCode = 204;
|
|
55
|
+
res.end();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
36
59
|
// Handle OpenAPI spec request
|
|
37
60
|
if (req.method === 'GET' && req.url?.endsWith('/openapi.json')) {
|
|
38
61
|
const spec = generateOpenAPI(app);
|
|
@@ -103,17 +126,18 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
103
126
|
const pathName = urlObj.pathname;
|
|
104
127
|
const method = req.method;
|
|
105
128
|
|
|
106
|
-
// 1. JSON-RPC: POST
|
|
107
|
-
if (pathName ===
|
|
129
|
+
// 1. JSON-RPC: POST {rpcPath}
|
|
130
|
+
if (pathName === routes.rpc && method === 'POST') {
|
|
108
131
|
await processBody(req, async (json) => {
|
|
109
132
|
await handleRequest(json);
|
|
110
133
|
}, res);
|
|
111
134
|
return;
|
|
112
135
|
}
|
|
113
136
|
|
|
114
|
-
// 2. REST API:
|
|
115
|
-
// Regex to match /
|
|
116
|
-
const
|
|
137
|
+
// 2. REST API: {dataPath}/:object and {dataPath}/:object/:id
|
|
138
|
+
// Regex to match {dataPath}/objectName(/id)?
|
|
139
|
+
const escapedDataPath = escapeRegexPath(routes.data);
|
|
140
|
+
const restMatch = pathName.match(new RegExp(`^${escapedDataPath}/([^/]+)(?:/(.+))?$`));
|
|
117
141
|
|
|
118
142
|
if (restMatch) {
|
|
119
143
|
const objectName = restMatch[1];
|
|
@@ -121,7 +145,7 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
121
145
|
const query = Object.fromEntries(urlObj.searchParams.entries());
|
|
122
146
|
|
|
123
147
|
if (method === 'GET') {
|
|
124
|
-
// GET
|
|
148
|
+
// GET {dataPath}/:object/:id -> findOne
|
|
125
149
|
if (id) {
|
|
126
150
|
await handleRequest({
|
|
127
151
|
op: 'findOne',
|
|
@@ -129,7 +153,7 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
129
153
|
args: id
|
|
130
154
|
});
|
|
131
155
|
}
|
|
132
|
-
// GET
|
|
156
|
+
// GET {dataPath}/:object -> find (List)
|
|
133
157
|
else {
|
|
134
158
|
// Parse standard params
|
|
135
159
|
const args: any = {};
|
|
@@ -149,7 +173,7 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
149
173
|
}
|
|
150
174
|
|
|
151
175
|
if (method === 'POST' && !id) {
|
|
152
|
-
// POST
|
|
176
|
+
// POST {dataPath}/:object -> create
|
|
153
177
|
await processBody(req, async (body) => {
|
|
154
178
|
await handleRequest({
|
|
155
179
|
op: 'create',
|
|
@@ -161,7 +185,7 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
161
185
|
}
|
|
162
186
|
|
|
163
187
|
if (method === 'PATCH' && id) {
|
|
164
|
-
// PATCH
|
|
188
|
+
// PATCH {dataPath}/:object/:id -> update
|
|
165
189
|
await processBody(req, async (body) => {
|
|
166
190
|
await handleRequest({
|
|
167
191
|
op: 'update',
|
|
@@ -176,7 +200,7 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
176
200
|
}
|
|
177
201
|
|
|
178
202
|
if (method === 'DELETE' && id) {
|
|
179
|
-
// DELETE
|
|
203
|
+
// DELETE {dataPath}/:object/:id -> delete
|
|
180
204
|
await handleRequest({
|
|
181
205
|
op: 'delete',
|
|
182
206
|
object: objectName,
|
|
@@ -187,20 +211,21 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
187
211
|
}
|
|
188
212
|
|
|
189
213
|
// File Upload Endpoints
|
|
190
|
-
// POST /
|
|
191
|
-
if (pathName ===
|
|
214
|
+
// POST {filesPath}/upload - Single file upload
|
|
215
|
+
if (pathName === `${routes.files}/upload` && method === 'POST') {
|
|
192
216
|
await uploadHandler(req, res);
|
|
193
217
|
return;
|
|
194
218
|
}
|
|
195
219
|
|
|
196
|
-
// POST /
|
|
197
|
-
if (pathName ===
|
|
220
|
+
// POST {filesPath}/upload/batch - Batch file upload
|
|
221
|
+
if (pathName === `${routes.files}/upload/batch` && method === 'POST') {
|
|
198
222
|
await batchUploadHandler(req, res);
|
|
199
223
|
return;
|
|
200
224
|
}
|
|
201
225
|
|
|
202
|
-
// GET
|
|
203
|
-
const
|
|
226
|
+
// GET {filesPath}/:fileId - Download file
|
|
227
|
+
const escapedFilesPath = escapeRegexPath(routes.files);
|
|
228
|
+
const fileMatch = pathName.match(new RegExp(`^${escapedFilesPath}/([^/]+)$`));
|
|
204
229
|
if (fileMatch && method === 'GET') {
|
|
205
230
|
const fileId = fileMatch[1];
|
|
206
231
|
await downloadHandler(req, res, fileId);
|
|
@@ -209,7 +234,7 @@ export function createNodeHandler(app: IObjectQL, options?: NodeHandlerOptions)
|
|
|
209
234
|
|
|
210
235
|
// Fallback or 404
|
|
211
236
|
if (req.method === 'POST') {
|
|
212
|
-
// Fallback for root POSTs if people forget
|
|
237
|
+
// Fallback for root POSTs if people forget {rpcPath} but send to /api something
|
|
213
238
|
await processBody(req, handleRequest, res);
|
|
214
239
|
return;
|
|
215
240
|
}
|