@forestadmin/agent-bff 1.12.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-core.js +5 -3
- package/dist/data/data-routes-middleware.js +3 -3
- package/dist/http/body-limit.d.ts +3 -0
- package/dist/http/body-limit.js +5 -0
- package/dist/openapi/openapi-document.d.ts +6 -0
- package/dist/openapi/openapi-document.js +220 -0
- package/dist/openapi/openapi-routes.d.ts +7 -0
- package/dist/openapi/openapi-routes.js +21 -0
- package/dist/openapi/schemas.d.ts +85 -0
- package/dist/openapi/schemas.js +141 -0
- package/dist/openapi/zod-openapi.d.ts +3 -0
- package/dist/openapi/zod-openapi.js +8 -0
- package/package.json +4 -1
package/dist/cli-core.js
CHANGED
|
@@ -21,15 +21,16 @@ const data_routes_middleware_1 = __importDefault(require("./data/data-routes-mid
|
|
|
21
21
|
const errors_1 = require("./errors");
|
|
22
22
|
const bff_http_error_1 = require("./http/bff-http-error");
|
|
23
23
|
const bff_http_server_1 = __importDefault(require("./http/bff-http-server"));
|
|
24
|
+
const body_limit_1 = __importDefault(require("./http/body-limit"));
|
|
24
25
|
const error_middleware_1 = __importDefault(require("./http/error-middleware"));
|
|
25
26
|
const forest_server_client_1 = __importDefault(require("./oauth/forest-server-client"));
|
|
26
27
|
const oauth_routes_1 = __importDefault(require("./oauth/oauth-routes"));
|
|
27
28
|
const session_store_1 = __importDefault(require("./oauth/session-store"));
|
|
28
29
|
const token_cipher_1 = __importDefault(require("./oauth/token-cipher"));
|
|
30
|
+
const openapi_routes_1 = __importDefault(require("./openapi/openapi-routes"));
|
|
29
31
|
const create_read_model_1 = __importDefault(require("./read-model/create-read-model"));
|
|
30
32
|
const timezone_middleware_1 = __importDefault(require("./timezone/timezone-middleware"));
|
|
31
33
|
const version_1 = __importDefault(require("./version"));
|
|
32
|
-
const BODY_LIMIT = '16kb';
|
|
33
34
|
const SESSION_TTL_SECONDS = 24 * 60 * 60;
|
|
34
35
|
function isAgentPath(path) {
|
|
35
36
|
return path === '/agent' || path.startsWith('/agent/');
|
|
@@ -142,6 +143,7 @@ function buildAgentMiddlewares(config, logger) {
|
|
|
142
143
|
(0, auth_mode_middleware_1.default)({ authSecret: forestAuthSecret }),
|
|
143
144
|
apiKeyStep,
|
|
144
145
|
(0, per_key_origin_1.default)(),
|
|
146
|
+
(0, openapi_routes_1.default)({ version: version_1.default }),
|
|
145
147
|
(0, timezone_middleware_1.default)({ defaultTimezone }),
|
|
146
148
|
...buildAgentRouteMiddlewares(config, logger),
|
|
147
149
|
];
|
|
@@ -160,7 +162,7 @@ async function runCli(env, logger = (0, console_logger_1.default)()) {
|
|
|
160
162
|
const middlewares = [
|
|
161
163
|
(0, cors_middleware_1.default)({ allowedOrigins: config.allowedOrigins }),
|
|
162
164
|
...agentErrorMiddleware,
|
|
163
|
-
(0, bodyparser_1.bodyParser)({ jsonLimit:
|
|
165
|
+
(0, bodyparser_1.bodyParser)({ jsonLimit: body_limit_1.default }),
|
|
164
166
|
...oauthMiddlewares,
|
|
165
167
|
...agentMiddlewares,
|
|
166
168
|
];
|
|
@@ -178,4 +180,4 @@ function reportFatalError(err) {
|
|
|
178
180
|
process.stderr.write(`Error: ${(0, errors_1.extractErrorMessage)(err)}\n`);
|
|
179
181
|
process.exitCode = 1;
|
|
180
182
|
}
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE2TUEseUJBa0NDO0FBRUQsNENBR0M7QUFoUEQsZ0RBQTZDO0FBRTdDLGlHQUE2RTtBQUM3RSwrRUFBNEQ7QUFDNUQsb0VBQTJEO0FBQzNELDRGQUF3RTtBQUN4RSw4RUFBb0Q7QUFDcEQsc0ZBQWtFO0FBQ2xFLDRFQUF5RDtBQUN6RCx1RkFBbUU7QUFDbkUsb0RBQWtEO0FBQ2xELDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFDQUErQztBQUMvQywwREFBcUQ7QUFDckQsNkVBQW1EO0FBQ25ELG1FQUEyQztBQUMzQywrRUFBNEQ7QUFDNUQsd0ZBQThEO0FBQzlELHdFQUFxRDtBQUNyRCwwRUFBK0Q7QUFDL0Qsd0VBQXFEO0FBQ3JELDhFQUEyRDtBQUMzRCx1RkFBNkQ7QUFDN0QseUZBQXNFO0FBQ3RFLHdEQUFnQztBQUVoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpDLFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFVBQXNCO0lBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxNQUFj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
|
|
@@ -102,8 +102,8 @@ async function handleRelation(ctx, rawBody, match, { deps, readModel }) {
|
|
|
102
102
|
if (!foreignCollection) {
|
|
103
103
|
throw (0, bff_local_errors_1.unknownRelation)(`Unknown relation: ${deps.collection}.${relation}`);
|
|
104
104
|
}
|
|
105
|
-
// The agent
|
|
106
|
-
//
|
|
105
|
+
// The agent checks browse permission on the foreign collection, but BFF exposure is a separate
|
|
106
|
+
// allow-list: a browsable collection may still be hidden here. Mirror the parent allow-list check.
|
|
107
107
|
if (!readModel.isCollectionAllowed(foreignCollection)) {
|
|
108
108
|
throw (0, bff_local_errors_1.unknownCollection)();
|
|
109
109
|
}
|
|
@@ -163,4 +163,4 @@ function createDataRoutesMiddleware({ store, agentUrl, timeoutMs, logger, create
|
|
|
163
163
|
}
|
|
164
164
|
};
|
|
165
165
|
}
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2RhdGEtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFxT0EsNkNBMERDO0FBalJELDRFQUErRDtBQUMvRCwrQ0FTdUI7QUFDdkIseURBQXVFO0FBQ3ZFLHFFQUtxQztBQUNyQywrREFBOEU7QUFDOUUsMEdBQXNGO0FBQ3RGLGlGQUc4QztBQUM5Qyw4RkFBNEU7QUFFNUUsTUFBTSxVQUFVLEdBQUcsc0NBQXNDLENBQUM7QUFDMUQsTUFBTSxjQUFjLEdBQUcsMERBQTBELENBQUM7QUFFbEYsb0dBQW9HO0FBQ3BHLHFHQUFxRztBQUNyRyxTQUFTLHdCQUF3QixDQUFDLE1BQWtDO0lBQ2xFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNsRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTlFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN2QixDQUFDO0FBdUJELG1HQUFtRztBQUNuRyxrR0FBa0c7QUFDbEcscUdBQXFHO0FBQ3JHLDJGQUEyRjtBQUMzRixTQUFTLDRCQUE0QixDQUFDLFNBQW9CLEVBQUUsVUFBa0I7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7UUFBRSxNQUFNLElBQUEsb0NBQWlCLEdBQUUsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsSUFBd0I7SUFFeEIsT0FBTyxJQUFBLCtCQUFTLEVBQ2QsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBQSxv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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const BODY_LIMIT = '16kb';
|
|
4
|
+
exports.default = BODY_LIMIT;
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS1saW1pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL2JvZHktbGltaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFFMUIsa0JBQWUsVUFBVSxDQUFDIn0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { OpenAPIObject } from 'openapi3-ts/oas31';
|
|
2
|
+
export declare const OPENAPI_VERSION = "3.1.0";
|
|
3
|
+
export declare const ROUTE_PREFIX = "/agent/v1";
|
|
4
|
+
export declare function generateOpenApiDocument(version: string): OpenAPIObject;
|
|
5
|
+
export declare function serializeOpenApi(document: OpenAPIObject): string;
|
|
6
|
+
//# sourceMappingURL=openapi-document.d.ts.map
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ROUTE_PREFIX = exports.OPENAPI_VERSION = void 0;
|
|
7
|
+
exports.generateOpenApiDocument = generateOpenApiDocument;
|
|
8
|
+
exports.serializeOpenApi = serializeOpenApi;
|
|
9
|
+
const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
|
|
10
|
+
const schemas_1 = require("./schemas");
|
|
11
|
+
const zod_openapi_1 = require("./zod-openapi");
|
|
12
|
+
const body_limit_1 = __importDefault(require("../http/body-limit"));
|
|
13
|
+
exports.OPENAPI_VERSION = '3.1.0';
|
|
14
|
+
exports.ROUTE_PREFIX = '/agent/v1';
|
|
15
|
+
const SESSION_SCHEME = 'bffSession';
|
|
16
|
+
const API_KEY_SCHEME = 'bffApiKey';
|
|
17
|
+
const SECURITY = [{ [API_KEY_SCHEME]: [] }];
|
|
18
|
+
const ERROR_STATUSES = {
|
|
19
|
+
400: 'Malformed body, a malformed URL-encoded path segment, an invalid filter operator, a filter nested too deep, ambiguous credentials, an unsupported page, a missing or invalid timezone, an unknown submitted action field, or a rejected action form (type action_error)',
|
|
20
|
+
401: 'Missing, invalid, or expired credentials',
|
|
21
|
+
403: 'The action needs approval before it runs (the body carries the approving roles), the Forest identity behind the API key is not allowed, the origin is not allowed for this key, or the agent refused the collection, relation, or action',
|
|
22
|
+
404: 'Unknown collection, relation, or action',
|
|
23
|
+
413: `The request body exceeds the BFF limit of ${body_limit_1.default}`,
|
|
24
|
+
415: 'The request declares a character set the server cannot decode. Other content types are NOT rejected: a form-urlencoded body is parsed and validated like JSON (its values arrive as strings, so typed fields such as page.limit fail with 400), while any other non-JSON content type is read as an absent body, silently dropping filters and pagination',
|
|
25
|
+
422: 'A field is unknown, not filterable, or is a nested relation path',
|
|
26
|
+
429: 'The agent rate-limited the request',
|
|
27
|
+
500: 'The agent payload could not be mapped to the BFF contract',
|
|
28
|
+
501: 'The BFF is running without an agent configured, so the proxy is not implemented',
|
|
29
|
+
502: 'The agent could not be reached',
|
|
30
|
+
503: 'The agent schema is unavailable, the agent returned a 5xx, or the API key could not be resolved',
|
|
31
|
+
};
|
|
32
|
+
const UNSUPPORTED_RESULT_DESCRIPTION = 'Either the BFF runs without an agent configured, or the action returned a result shape the ' +
|
|
33
|
+
'BFF cannot normalize. The second case carries no message field.';
|
|
34
|
+
function errorResponses(statuses, executeResults) {
|
|
35
|
+
return Object.fromEntries(statuses.map(status => {
|
|
36
|
+
const description = ERROR_STATUSES[status];
|
|
37
|
+
if (!description)
|
|
38
|
+
throw new Error(`No OpenAPI description for error status ${status}`);
|
|
39
|
+
if (status === '501' && executeResults) {
|
|
40
|
+
return [
|
|
41
|
+
status,
|
|
42
|
+
{
|
|
43
|
+
description: UNSUPPORTED_RESULT_DESCRIPTION,
|
|
44
|
+
content: {
|
|
45
|
+
'application/json': {
|
|
46
|
+
schema: zod_openapi_1.z.union([schemas_1.ErrorResponseSchema, schemas_1.MessagelessErrorResponseSchema]),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
const response = {
|
|
53
|
+
description,
|
|
54
|
+
content: { 'application/json': { schema: schemas_1.ErrorResponseSchema } },
|
|
55
|
+
};
|
|
56
|
+
if (status === '503') {
|
|
57
|
+
response.headers = {
|
|
58
|
+
'Retry-After': {
|
|
59
|
+
description: 'Seconds to wait before retrying. Set when the API key could not be resolved.',
|
|
60
|
+
required: false,
|
|
61
|
+
schema: { type: 'integer' },
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return [status, response];
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
const DATA_ERRORS = [
|
|
69
|
+
'400',
|
|
70
|
+
'401',
|
|
71
|
+
'403',
|
|
72
|
+
'404',
|
|
73
|
+
'413',
|
|
74
|
+
'415',
|
|
75
|
+
'422',
|
|
76
|
+
'429',
|
|
77
|
+
'500',
|
|
78
|
+
'501',
|
|
79
|
+
'502',
|
|
80
|
+
'503',
|
|
81
|
+
];
|
|
82
|
+
const ROUTES = [
|
|
83
|
+
{
|
|
84
|
+
path: '/{collection}/list',
|
|
85
|
+
operationId: 'listRecords',
|
|
86
|
+
summary: 'List records of a collection',
|
|
87
|
+
request: schemas_1.ListRequestSchema,
|
|
88
|
+
response: schemas_1.ListResponseSchema,
|
|
89
|
+
responseDescription: 'A page of records',
|
|
90
|
+
params: ['collection'],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
path: '/{collection}/count',
|
|
94
|
+
operationId: 'countRecords',
|
|
95
|
+
summary: 'Count records of a collection',
|
|
96
|
+
request: schemas_1.CountRequestSchema,
|
|
97
|
+
response: schemas_1.CountResponseSchema,
|
|
98
|
+
responseDescription: 'The matching record count',
|
|
99
|
+
params: ['collection'],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
path: '/{collection}/relations/{relation}/list',
|
|
103
|
+
operationId: 'listRelatedRecords',
|
|
104
|
+
summary: 'List records of a to-many relation',
|
|
105
|
+
request: schemas_1.RelationListRequestSchema,
|
|
106
|
+
response: schemas_1.ListResponseSchema,
|
|
107
|
+
responseDescription: 'A page of related records',
|
|
108
|
+
params: ['collection', 'relation'],
|
|
109
|
+
bodyRequired: true,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
path: '/{collection}/relations/{relation}/count',
|
|
113
|
+
operationId: 'countRelatedRecords',
|
|
114
|
+
summary: 'Count records of a to-many relation',
|
|
115
|
+
request: schemas_1.RelationCountRequestSchema,
|
|
116
|
+
response: schemas_1.CountResponseSchema,
|
|
117
|
+
responseDescription: 'The matching related record count',
|
|
118
|
+
params: ['collection', 'relation'],
|
|
119
|
+
bodyRequired: true,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
path: '/{collection}/actions/{action}/form',
|
|
123
|
+
operationId: 'getActionForm',
|
|
124
|
+
summary: 'Load the form of a custom action',
|
|
125
|
+
request: schemas_1.ActionRequestSchema,
|
|
126
|
+
response: zod_openapi_1.z.unknown(),
|
|
127
|
+
responseDescription: 'The action form fields',
|
|
128
|
+
params: ['collection', 'action'],
|
|
129
|
+
bodyRequired: true,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
path: '/{collection}/actions/{action}/execute',
|
|
133
|
+
operationId: 'executeAction',
|
|
134
|
+
summary: 'Execute a custom action',
|
|
135
|
+
request: schemas_1.ActionRequestSchema,
|
|
136
|
+
response: zod_openapi_1.z.unknown(),
|
|
137
|
+
responseDescription: 'The normalized action result',
|
|
138
|
+
params: ['collection', 'action'],
|
|
139
|
+
bodyRequired: true,
|
|
140
|
+
executeResults: true,
|
|
141
|
+
},
|
|
142
|
+
];
|
|
143
|
+
const PARAM_DESCRIPTIONS = {
|
|
144
|
+
collection: 'The exact collection name from the agent schema.',
|
|
145
|
+
relation: 'The relation field name. Only to-many relations expose list and count.',
|
|
146
|
+
action: 'The exact action name from the agent schema, URL-encoded. Not a slug, not an index.',
|
|
147
|
+
};
|
|
148
|
+
function buildParams(names) {
|
|
149
|
+
return zod_openapi_1.z.object(Object.fromEntries(names.map(name => [name, zod_openapi_1.z.string().openapi({ description: PARAM_DESCRIPTIONS[name] })])));
|
|
150
|
+
}
|
|
151
|
+
const TIMEZONE_HEADER_PARAM = zod_openapi_1.z.object({
|
|
152
|
+
'X-Forest-Timezone': zod_openapi_1.z
|
|
153
|
+
.string()
|
|
154
|
+
.optional()
|
|
155
|
+
.openapi({
|
|
156
|
+
description: 'An IANA timezone. Takes precedence over the `timezone` body field; the BFF default ' +
|
|
157
|
+
'applies when neither is sent.',
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
160
|
+
function generateOpenApiDocument(version) {
|
|
161
|
+
const registry = new zod_to_openapi_1.OpenAPIRegistry();
|
|
162
|
+
registry.registerComponent('securitySchemes', SESSION_SCHEME, {
|
|
163
|
+
type: 'http',
|
|
164
|
+
scheme: 'bearer',
|
|
165
|
+
description: 'Mode 1: the BFF session token issued after the OAuth login. It authenticates the caller ' +
|
|
166
|
+
'but the data and action routes reject it until the BFF mints an agent token from the ' +
|
|
167
|
+
'OAuth principal, so no operation lists it yet. Use the API key today.',
|
|
168
|
+
});
|
|
169
|
+
registry.registerComponent('securitySchemes', API_KEY_SCHEME, {
|
|
170
|
+
type: 'apiKey',
|
|
171
|
+
in: 'header',
|
|
172
|
+
name: 'X-Forest-Bff-Key',
|
|
173
|
+
description: 'Mode 2: a BFF API key. Never send both this and an Authorization header.',
|
|
174
|
+
});
|
|
175
|
+
ROUTES.forEach(route => {
|
|
176
|
+
registry.registerPath({
|
|
177
|
+
method: 'post',
|
|
178
|
+
path: `${exports.ROUTE_PREFIX}${route.path}`,
|
|
179
|
+
operationId: route.operationId,
|
|
180
|
+
summary: route.summary,
|
|
181
|
+
security: SECURITY,
|
|
182
|
+
request: {
|
|
183
|
+
params: buildParams(route.params),
|
|
184
|
+
headers: TIMEZONE_HEADER_PARAM,
|
|
185
|
+
body: {
|
|
186
|
+
required: route.bodyRequired === true,
|
|
187
|
+
content: { 'application/json': { schema: route.request } },
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
responses: {
|
|
191
|
+
200: {
|
|
192
|
+
description: route.responseDescription,
|
|
193
|
+
content: { 'application/json': { schema: route.response } },
|
|
194
|
+
},
|
|
195
|
+
...errorResponses(DATA_ERRORS, route.executeResults === true),
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
return new zod_to_openapi_1.OpenApiGeneratorV31(registry.definitions).generateDocument({
|
|
200
|
+
openapi: exports.OPENAPI_VERSION,
|
|
201
|
+
info: {
|
|
202
|
+
title: 'Forest Admin BFF',
|
|
203
|
+
version,
|
|
204
|
+
license: { name: 'GPL-3.0', url: 'https://www.gnu.org/licenses/gpl-3.0.html' },
|
|
205
|
+
description: 'Runtime routes are generic: one path per operation, with the collection, relation and ' +
|
|
206
|
+
'action passed as path segments. The timezone is resolved from the `X-Forest-Timezone` ' +
|
|
207
|
+
'header first, then a `timezone` body field, then the BFF default when one is ' +
|
|
208
|
+
'configured. A deployment without a default rejects a request carrying neither with ' +
|
|
209
|
+
'400 missing_timezone, so send one of the two to be safe. Sending a content type other ' +
|
|
210
|
+
'than application/json is not an error: a form-urlencoded body is parsed like JSON, ' +
|
|
211
|
+
'while any other content type is read as absent, which silently drops any filter, ' +
|
|
212
|
+
'sort, or page.',
|
|
213
|
+
},
|
|
214
|
+
servers: [{ url: '/' }],
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function serializeOpenApi(document) {
|
|
218
|
+
return JSON.stringify(document, null, 2);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1kb2N1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL29wZW5hcGktZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeU1BLDBEQTZEQztBQUVELDRDQUVDO0FBeFFELG1FQUFzRjtBQUV0Rix1Q0FVbUI7QUFDbkIsK0NBQWtDO0FBQ2xDLG9FQUE0QztBQUUvQixRQUFBLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFDMUIsUUFBQSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBRXhDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUNwQyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFFbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1QyxNQUFNLGNBQWMsR0FBMkI7SUFDN0MsR0FBRyxFQUFFLHlRQUF5UTtJQUM5USxHQUFHLEVBQUUsMENBQTBDO0lBQy9DLEdBQUcsRUFBRSwwT0FBME87SUFDL08sR0FBRyxFQUFFLHlDQUF5QztJQUM5QyxHQUFHLEVBQUUsNkNBQTZDLG9CQUFVLEVBQUU7SUFDOUQsR0FBRyxFQUFFLDJWQUEyVjtJQUNoVyxHQUFHLEVBQUUsa0VBQWtFO0lBQ3ZFLEdBQUcsRUFBRSxvQ0FBb0M7SUFDekMsR0FBRyxFQUFFLDJEQUEyRDtJQUNoRSxHQUFHLEVBQUUsaUZBQWlGO0lBQ3RGLEdBQUcsRUFBRSxnQ0FBZ0M7SUFDckMsR0FBRyxFQUFFLGlHQUFpRztDQUN2RyxDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FDbEMsNkZBQTZGO0lBQzdGLGlFQUFpRSxDQUFDO0FBRXBFLFNBQVMsY0FBYyxDQUFDLFFBQWtCLEVBQUUsY0FBdUI7SUFDakUsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3BCLE1BQU0sV0FBVyxH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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Middleware } from 'koa';
|
|
2
|
+
export declare const OPENAPI_PATH = "/agent/openapi.json";
|
|
3
|
+
export interface OpenApiRoutesOptions {
|
|
4
|
+
version: string;
|
|
5
|
+
}
|
|
6
|
+
export default function createOpenApiRoutes({ version }: OpenApiRoutesOptions): Middleware;
|
|
7
|
+
//# sourceMappingURL=openapi-routes.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OPENAPI_PATH = void 0;
|
|
4
|
+
exports.default = createOpenApiRoutes;
|
|
5
|
+
const openapi_document_1 = require("./openapi-document");
|
|
6
|
+
exports.OPENAPI_PATH = '/agent/openapi.json';
|
|
7
|
+
const READ_METHODS = new Set(['GET', 'HEAD']);
|
|
8
|
+
function createOpenApiRoutes({ version }) {
|
|
9
|
+
const document = (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version));
|
|
10
|
+
return async function openApiRoutes(ctx, next) {
|
|
11
|
+
if (!READ_METHODS.has(ctx.method) || ctx.path !== exports.OPENAPI_PATH) {
|
|
12
|
+
await next();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
ctx.status = 200;
|
|
16
|
+
ctx.type = 'application/json';
|
|
17
|
+
ctx.set('Cache-Control', 'no-store');
|
|
18
|
+
ctx.body = document;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9vcGVuYXBpLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSxzQ0FlQztBQXpCRCx5REFBK0U7QUFFbEUsUUFBQSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFFbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQU05QyxTQUF3QixtQkFBbUIsQ0FBQyxFQUFFLE9BQU8sRUFBd0I7SUFDM0UsTUFBTSxRQUFRLEdBQUcsSUFBQSxtQ0FBZ0IsRUFBQyxJQUFBLDBDQUF1QixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFcEUsT0FBTyxLQUFLLFVBQVUsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLG9CQUFZLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUksRUFBRSxDQUFDO1lBRWIsT0FBTztRQUNULENBQUM7UUFFRCxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from './zod-openapi';
|
|
2
|
+
declare const OPERATORS: [string, ...string[]];
|
|
3
|
+
declare const ConditionTreeSchema: z.ZodType;
|
|
4
|
+
export declare const ListRequestSchema: z.ZodObject<{
|
|
5
|
+
filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
6
|
+
projection: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
|
+
sort: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
8
|
+
field: z.ZodString;
|
|
9
|
+
direction: z.ZodOptional<z.ZodEnum<{
|
|
10
|
+
asc: "asc";
|
|
11
|
+
desc: "desc";
|
|
12
|
+
}>>;
|
|
13
|
+
}, z.core.$strip>>>;
|
|
14
|
+
page: z.ZodOptional<z.ZodObject<{
|
|
15
|
+
limit: z.ZodNumber;
|
|
16
|
+
offset: z.ZodNumber;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export declare const CountRequestSchema: z.ZodObject<{
|
|
21
|
+
filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
22
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export declare const RelationListRequestSchema: z.ZodObject<{
|
|
25
|
+
filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
26
|
+
projection: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
27
|
+
sort: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
28
|
+
field: z.ZodString;
|
|
29
|
+
direction: z.ZodOptional<z.ZodEnum<{
|
|
30
|
+
asc: "asc";
|
|
31
|
+
desc: "desc";
|
|
32
|
+
}>>;
|
|
33
|
+
}, z.core.$strip>>>;
|
|
34
|
+
page: z.ZodOptional<z.ZodObject<{
|
|
35
|
+
limit: z.ZodNumber;
|
|
36
|
+
offset: z.ZodNumber;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
39
|
+
parentId: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
export declare const RelationCountRequestSchema: z.ZodObject<{
|
|
42
|
+
filter: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
43
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
44
|
+
parentId: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
45
|
+
}, z.core.$strip>;
|
|
46
|
+
export declare const ActionRequestSchema: z.ZodObject<{
|
|
47
|
+
recordIds: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
48
|
+
values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
49
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
export declare const ListResponseSchema: z.ZodObject<{
|
|
52
|
+
data: z.ZodArray<z.ZodIntersection<z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodObject<{
|
|
53
|
+
__forest: z.ZodObject<{
|
|
54
|
+
collection: z.ZodString;
|
|
55
|
+
primaryKey: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
}, z.core.$strip>>>;
|
|
58
|
+
meta: z.ZodObject<{
|
|
59
|
+
countStatus: z.ZodLiteral<"not_requested">;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
export declare const CountResponseSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
63
|
+
count: z.ZodNumber;
|
|
64
|
+
countStatus: z.ZodLiteral<"available">;
|
|
65
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
66
|
+
count: z.ZodNull;
|
|
67
|
+
countStatus: z.ZodLiteral<"deactivated">;
|
|
68
|
+
}, z.core.$strip>]>;
|
|
69
|
+
export declare const ErrorResponseSchema: z.ZodObject<{
|
|
70
|
+
error: z.ZodObject<{
|
|
71
|
+
type: z.ZodString;
|
|
72
|
+
status: z.ZodNumber;
|
|
73
|
+
message: z.ZodString;
|
|
74
|
+
details: z.ZodOptional<z.ZodUnknown>;
|
|
75
|
+
}, z.core.$strip>;
|
|
76
|
+
}, z.core.$strip>;
|
|
77
|
+
export declare const MessagelessErrorResponseSchema: z.ZodObject<{
|
|
78
|
+
error: z.ZodObject<{
|
|
79
|
+
type: z.ZodString;
|
|
80
|
+
status: z.ZodNumber;
|
|
81
|
+
details: z.ZodOptional<z.ZodUnknown>;
|
|
82
|
+
}, z.core.$strip>;
|
|
83
|
+
}, z.core.$strip>;
|
|
84
|
+
export { ConditionTreeSchema, OPERATORS };
|
|
85
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OPERATORS = exports.ConditionTreeSchema = exports.MessagelessErrorResponseSchema = exports.ErrorResponseSchema = exports.CountResponseSchema = exports.ListResponseSchema = exports.ActionRequestSchema = exports.RelationCountRequestSchema = exports.RelationListRequestSchema = exports.CountRequestSchema = exports.ListRequestSchema = void 0;
|
|
4
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
5
|
+
const zod_openapi_1 = require("./zod-openapi");
|
|
6
|
+
const capabilities_validator_1 = require("../validation/capabilities-validator");
|
|
7
|
+
const OPERATORS = [...datasource_toolkit_1.allOperators];
|
|
8
|
+
exports.OPERATORS = OPERATORS;
|
|
9
|
+
const ConditionTreeLeafSchema = zod_openapi_1.z
|
|
10
|
+
.object({
|
|
11
|
+
field: zod_openapi_1.z.string(),
|
|
12
|
+
operator: zod_openapi_1.z.enum(OPERATORS),
|
|
13
|
+
value: zod_openapi_1.z.unknown().optional(),
|
|
14
|
+
})
|
|
15
|
+
.openapi('ConditionTreeLeaf', {
|
|
16
|
+
description: 'A single condition. `operator` is PascalCase and must be one the target field supports; ' +
|
|
17
|
+
'an unsupported one returns 400 invalid_filter_operator listing the valid operators.',
|
|
18
|
+
});
|
|
19
|
+
const ConditionTreeSchema = zod_openapi_1.z
|
|
20
|
+
.lazy(() => zod_openapi_1.z.union([
|
|
21
|
+
ConditionTreeLeafSchema,
|
|
22
|
+
zod_openapi_1.z.object({
|
|
23
|
+
aggregator: zod_openapi_1.z.enum(['And', 'Or']),
|
|
24
|
+
conditions: zod_openapi_1.z.array(ConditionTreeSchema),
|
|
25
|
+
}),
|
|
26
|
+
]))
|
|
27
|
+
.openapi('ConditionTree', {
|
|
28
|
+
description: 'Either a leaf condition or a branch nesting more conditions. A branch must carry its ' +
|
|
29
|
+
'`aggregator`: the BFF forwards a branch without one, but the agent then parses it as ' +
|
|
30
|
+
'neither leaf nor branch and answers 400. On top-level list and count, nesting deeper ' +
|
|
31
|
+
`than ${capabilities_validator_1.MAX_FILTER_DEPTH} levels is rejected and each field is checked against the ` +
|
|
32
|
+
'collection capabilities; relation list and count forward the filter without either check.',
|
|
33
|
+
});
|
|
34
|
+
exports.ConditionTreeSchema = ConditionTreeSchema;
|
|
35
|
+
const SortClauseSchema = zod_openapi_1.z
|
|
36
|
+
.object({
|
|
37
|
+
field: zod_openapi_1.z.string(),
|
|
38
|
+
direction: zod_openapi_1.z.enum(['asc', 'desc']).optional(),
|
|
39
|
+
})
|
|
40
|
+
.openapi('SortClause', { description: 'Omitting `direction` sorts ascending.' });
|
|
41
|
+
const PageSchema = zod_openapi_1.z
|
|
42
|
+
.object({
|
|
43
|
+
limit: zod_openapi_1.z.number().int().positive(),
|
|
44
|
+
offset: zod_openapi_1.z.number().int().nonnegative(),
|
|
45
|
+
})
|
|
46
|
+
.openapi('Page', {
|
|
47
|
+
description: 'The agent paginates by page number, so `offset` must be a whole multiple of `limit`. ' +
|
|
48
|
+
'Any other offset is rejected with 400 invalid_request.',
|
|
49
|
+
});
|
|
50
|
+
const TimezoneSchema = zod_openapi_1.z.string().openapi({
|
|
51
|
+
description: 'Used when the X-Forest-Timezone header is absent. The header wins when both are sent. A ' +
|
|
52
|
+
'deployment with no configured default rejects a request carrying neither with 400 ' +
|
|
53
|
+
'missing_timezone.',
|
|
54
|
+
});
|
|
55
|
+
exports.ListRequestSchema = zod_openapi_1.z
|
|
56
|
+
.object({
|
|
57
|
+
filter: ConditionTreeSchema.optional(),
|
|
58
|
+
projection: zod_openapi_1.z.array(zod_openapi_1.z.string()).optional(),
|
|
59
|
+
sort: zod_openapi_1.z.array(SortClauseSchema).optional(),
|
|
60
|
+
page: PageSchema.optional(),
|
|
61
|
+
timezone: TimezoneSchema.optional(),
|
|
62
|
+
})
|
|
63
|
+
.openapi('ListRequest');
|
|
64
|
+
exports.CountRequestSchema = zod_openapi_1.z
|
|
65
|
+
.object({
|
|
66
|
+
filter: ConditionTreeSchema.optional(),
|
|
67
|
+
timezone: TimezoneSchema.optional(),
|
|
68
|
+
})
|
|
69
|
+
.openapi('CountRequest');
|
|
70
|
+
const ParentIdSchema = zod_openapi_1.z.union([zod_openapi_1.z.string().regex(/\S/), zod_openapi_1.z.number()]).openapi('ParentId', {
|
|
71
|
+
description: 'The parent record id, opaque: a composite or packed id must be passed unchanged. A ' +
|
|
72
|
+
'blank string is rejected.',
|
|
73
|
+
});
|
|
74
|
+
exports.RelationListRequestSchema = exports.ListRequestSchema.extend({
|
|
75
|
+
parentId: ParentIdSchema,
|
|
76
|
+
}).openapi('RelationListRequest', {
|
|
77
|
+
description: 'Filter, sort and projection apply to the FOREIGN collection; the parent only resolves ' +
|
|
78
|
+
'which records are related.',
|
|
79
|
+
});
|
|
80
|
+
exports.RelationCountRequestSchema = exports.CountRequestSchema.extend({
|
|
81
|
+
parentId: ParentIdSchema,
|
|
82
|
+
}).openapi('RelationCountRequest');
|
|
83
|
+
exports.ActionRequestSchema = zod_openapi_1.z
|
|
84
|
+
.object({
|
|
85
|
+
recordIds: zod_openapi_1.z.array(zod_openapi_1.z.union([zod_openapi_1.z.string(), zod_openapi_1.z.number()])),
|
|
86
|
+
values: zod_openapi_1.z.record(zod_openapi_1.z.string(), zod_openapi_1.z.unknown()).optional(),
|
|
87
|
+
timezone: TimezoneSchema.optional(),
|
|
88
|
+
})
|
|
89
|
+
.openapi('ActionRequest', {
|
|
90
|
+
description: '`recordIds` is required, even on a global action: send an empty array when the action ' +
|
|
91
|
+
'targets no record. Every id is coerced to a string before reaching the agent.',
|
|
92
|
+
});
|
|
93
|
+
const ForestRecordMetaSchema = zod_openapi_1.z
|
|
94
|
+
.object({
|
|
95
|
+
collection: zod_openapi_1.z.string(),
|
|
96
|
+
primaryKey: zod_openapi_1.z.record(zod_openapi_1.z.string(), zod_openapi_1.z.union([zod_openapi_1.z.string(), zod_openapi_1.z.number()])),
|
|
97
|
+
})
|
|
98
|
+
.openapi('ForestRecordMeta', {
|
|
99
|
+
description: 'The record identity, unpacked from the agent id. A composite primary key carries one ' +
|
|
100
|
+
'entry per column.',
|
|
101
|
+
});
|
|
102
|
+
exports.ListResponseSchema = zod_openapi_1.z
|
|
103
|
+
.object({
|
|
104
|
+
data: zod_openapi_1.z.array(zod_openapi_1.z.record(zod_openapi_1.z.string(), zod_openapi_1.z.unknown()).and(zod_openapi_1.z.object({ __forest: ForestRecordMetaSchema }))),
|
|
105
|
+
meta: zod_openapi_1.z.object({ countStatus: zod_openapi_1.z.literal('not_requested') }),
|
|
106
|
+
})
|
|
107
|
+
.openapi('ListResponse', {
|
|
108
|
+
description: 'Records are flat, each carrying a `__forest` envelope. The list never carries a total: ' +
|
|
109
|
+
'call the count endpoint for that, which is why `countStatus` is always `not_requested`.',
|
|
110
|
+
});
|
|
111
|
+
exports.CountResponseSchema = zod_openapi_1.z
|
|
112
|
+
.union([
|
|
113
|
+
zod_openapi_1.z.object({ count: zod_openapi_1.z.number(), countStatus: zod_openapi_1.z.literal('available') }),
|
|
114
|
+
zod_openapi_1.z.object({ count: zod_openapi_1.z.null(), countStatus: zod_openapi_1.z.literal('deactivated') }),
|
|
115
|
+
])
|
|
116
|
+
.openapi('CountResponse', {
|
|
117
|
+
description: 'Two shapes only: a number with `available`, or null with `deactivated` when the ' +
|
|
118
|
+
'collection disables count. The pair never disagrees.',
|
|
119
|
+
});
|
|
120
|
+
exports.ErrorResponseSchema = zod_openapi_1.z
|
|
121
|
+
.object({
|
|
122
|
+
error: zod_openapi_1.z.object({
|
|
123
|
+
type: zod_openapi_1.z.string(),
|
|
124
|
+
status: zod_openapi_1.z.number().int(),
|
|
125
|
+
message: zod_openapi_1.z.string(),
|
|
126
|
+
details: zod_openapi_1.z.unknown().optional(),
|
|
127
|
+
}),
|
|
128
|
+
})
|
|
129
|
+
.openapi('ErrorResponse');
|
|
130
|
+
exports.MessagelessErrorResponseSchema = zod_openapi_1.z
|
|
131
|
+
.object({
|
|
132
|
+
error: zod_openapi_1.z.object({
|
|
133
|
+
type: zod_openapi_1.z.string(),
|
|
134
|
+
status: zod_openapi_1.z.number().int(),
|
|
135
|
+
details: zod_openapi_1.z.unknown().optional(),
|
|
136
|
+
}),
|
|
137
|
+
})
|
|
138
|
+
.openapi('MessagelessErrorResponse', {
|
|
139
|
+
description: 'The unsupported-action-result body, which carries no message field unlike every other error.',
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyxpRkFBd0U7QUFFeEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLGlDQUFZLENBQTBCLENBQUM7QUFvSy9CLDhCQUFTO0FBbEt2QyxNQUFNLHVCQUF1QixHQUFHLGVBQUM7S0FDOUIsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLGVBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDakIsUUFBUSxFQUFFLGVBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzNCLEtBQUssRUFBRSxlQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzlCLENBQUM7S0FDRCxPQUFPLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsV0FBVyxFQUNULDBGQUEwRjtRQUMxRixxRkFBcUY7Q0FDeEYsQ0FBQyxDQUFDO0FBRUwsTUFBTSxtQkFBbUIsR0FBYyxlQUFDO0tBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDVCxlQUFDLENBQUMsS0FBSyxDQUFDO0lBQ04sdUJBQXVCO0lBQ3ZCLGVBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxVQUFVLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxVQUFVLEVBQUUsZUFBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztLQUN6QyxDQUFDO0NBQ0gsQ0FBQyxDQUNIO0tBQ0EsT0FBTyxDQUFDLGVBQWUsRUFBRTtJQUN4QixXQUFXLEVBQ1QsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsUUFBUSx5Q0FBZ0IsNERBQTREO1FBQ3BGLDJGQUEyRjtDQUM5RixDQUFDLENBQUM7QUFxSUksa0RBQW1CO0FBbkk1QixNQUFNLGdCQUFnQixH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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.z = void 0;
|
|
4
|
+
const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
Object.defineProperty(exports, "z", { enumerable: true, get: function () { return zod_1.z; } });
|
|
7
|
+
(0, zod_to_openapi_1.extendZodWithOpenApi)(zod_1.z);
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLW9wZW5hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS96b2Qtb3BlbmFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBc0U7QUFDdEUsNkJBQXdCO0FBS2Ysa0ZBTEEsT0FBQyxPQUtBO0FBSFYsSUFBQSxxQ0FBb0IsRUFBQyxPQUFDLENBQUMsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent-bff",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"forest-bff": "dist/cli.js"
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"test": "jest"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
+
"@asteasolutions/zod-to-openapi": "8.5.0",
|
|
34
35
|
"@forestadmin/agent-client": "1.13.0",
|
|
35
36
|
"@forestadmin/datasource-toolkit": "1.54.0",
|
|
36
37
|
"@forestadmin/forestadmin-client": "1.41.3",
|
|
@@ -40,9 +41,11 @@
|
|
|
40
41
|
"zod": "4.3.6"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
44
|
+
"@redocly/cli": "2.35.1",
|
|
43
45
|
"@types/jsonwebtoken": "^9.0.1",
|
|
44
46
|
"@types/koa": "^2.13.5",
|
|
45
47
|
"@types/supertest": "^6.0.2",
|
|
48
|
+
"openapi3-ts": "4.6.1",
|
|
46
49
|
"supertest": "^7.1.3"
|
|
47
50
|
}
|
|
48
51
|
}
|