@forestadmin/agent-bff 1.23.7 → 1.24.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/README.md +42 -31
- package/dist/cli-core.js +9 -5
- package/dist/cli-dispatch.js +4 -3
- package/dist/config/env-config.d.ts +8 -0
- package/dist/config/env-config.js +50 -18
- package/dist/cors/origin.d.ts +1 -0
- package/dist/cors/origin.js +7 -3
- package/dist/cors/per-key-origin.js +3 -2
- package/dist/data/request-schemas.d.ts +1 -0
- package/dist/data/request-schemas.js +4 -3
- package/dist/docs/docs-samples.d.ts +3 -2
- package/dist/docs/docs-samples.js +4 -3
- package/dist/http/bff-local-errors.d.ts +6 -0
- package/dist/http/bff-local-errors.js +13 -1
- package/dist/openapi/collect-unfolding.js +2 -2
- package/dist/openapi/names.d.ts +2 -0
- package/dist/openapi/names.js +6 -1
- package/dist/openapi/openapi-document.d.ts +3 -1
- package/dist/openapi/openapi-document.js +43 -10
- package/dist/openapi/openapi-routes.d.ts +2 -1
- package/dist/openapi/openapi-routes.js +4 -3
- package/dist/openapi/record-schemas.d.ts +21 -0
- package/dist/openapi/record-schemas.js +149 -0
- package/dist/openapi/schemas.d.ts +4 -0
- package/dist/openapi/schemas.js +15 -8
- package/dist/openapi/unfolded-document.d.ts +2 -1
- package/dist/openapi/unfolded-document.js +3 -3
- package/dist/openapi/unfolded-paths.js +74 -30
- package/dist/openapi/unfolding.d.ts +9 -1
- package/dist/openapi/unfolding.js +1 -1
- package/dist/rate-limit/agent-path.d.ts +2 -0
- package/dist/rate-limit/agent-path.js +7 -0
- package/dist/rate-limit/rate-limit-middleware.d.ts +9 -0
- package/dist/rate-limit/rate-limit-middleware.js +61 -0
- package/package.json +5 -3
|
@@ -14,8 +14,9 @@ const SESSION_VARIABLE = 'BFF_SESSION';
|
|
|
14
14
|
* a 16-collection schema and several hundred KB on a large one, which every consumer of
|
|
15
15
|
* `/agent/openapi.json` would pay for an extension only a viewer reads — where this costs one
|
|
16
16
|
* function whatever the operation count. It also lets a sample carry the REAL origin: the document
|
|
17
|
-
* declares `servers
|
|
18
|
-
* while the page knows where it is served from and emits a command
|
|
17
|
+
* declares `servers` root-relative unless `BFF_PUBLIC_URL` is set, so a sample built into it could
|
|
18
|
+
* only hold a placeholder host, while the page knows where it is served from and emits a command
|
|
19
|
+
* that runs as pasted.
|
|
19
20
|
*
|
|
20
21
|
* The key is never inlined: each language reads it from the environment, so a copied sample cannot
|
|
21
22
|
* carry a credential into a shell history or a paste.
|
|
@@ -334,4 +335,4 @@ const SAMPLES_SCRIPT = `
|
|
|
334
335
|
}
|
|
335
336
|
`;
|
|
336
337
|
exports.default = SAMPLES_SCRIPT;
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy1zYW1wbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RvY3MvZG9jcy1zYW1wbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0VBQStEO0FBQy9ELHlFQUFrRTtBQUVsRSxpR0FBaUc7QUFDakcsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQzlCLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUV2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sY0FBYyxHQUFHOzJCQUNJLElBQUksQ0FBQyxTQUFTLENBQUMsbUNBQWMsQ0FBQztnQ0FDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQ0FBZSxDQUFDO2dDQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQzs2QkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7aUNBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMlNoRSxDQUFDO0FBRUYsa0JBQWUsY0FBYyxDQUFDIn0=
|
|
@@ -17,5 +17,11 @@ export declare function upstreamError(status: number): BffHttpError;
|
|
|
17
17
|
export declare function upstreamUnreachable(): BffHttpError;
|
|
18
18
|
export declare function upstreamTimeout(): BffHttpError;
|
|
19
19
|
export declare function permissionsUnavailable(retryAfter: number, message?: string): BffHttpError;
|
|
20
|
+
export declare const RATE_LIMIT_CAUSES: {
|
|
21
|
+
readonly limitExceeded: "limit_exceeded";
|
|
22
|
+
readonly limiterSaturated: "limiter_saturated";
|
|
23
|
+
};
|
|
24
|
+
export type RateLimitCause = (typeof RATE_LIMIT_CAUSES)[keyof typeof RATE_LIMIT_CAUSES];
|
|
25
|
+
export declare function tooManyRequests(retryAfter: number, message: string, cause: RateLimitCause): BffHttpError;
|
|
20
26
|
export declare function actionRequiresApproval(message?: string, details?: unknown): BffHttpError;
|
|
21
27
|
//# sourceMappingURL=bff-local-errors.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RATE_LIMIT_CAUSES = void 0;
|
|
3
4
|
exports.unknownCollection = unknownCollection;
|
|
4
5
|
exports.unknownRelation = unknownRelation;
|
|
5
6
|
exports.unknownAction = unknownAction;
|
|
@@ -18,6 +19,7 @@ exports.upstreamError = upstreamError;
|
|
|
18
19
|
exports.upstreamUnreachable = upstreamUnreachable;
|
|
19
20
|
exports.upstreamTimeout = upstreamTimeout;
|
|
20
21
|
exports.permissionsUnavailable = permissionsUnavailable;
|
|
22
|
+
exports.tooManyRequests = tooManyRequests;
|
|
21
23
|
exports.actionRequiresApproval = actionRequiresApproval;
|
|
22
24
|
const bff_http_error_1 = require("./bff-http-error");
|
|
23
25
|
function unknownCollection(message = 'Unknown collection') {
|
|
@@ -76,7 +78,17 @@ function upstreamTimeout() {
|
|
|
76
78
|
function permissionsUnavailable(retryAfter, message = 'Permissions are unavailable') {
|
|
77
79
|
return new bff_http_error_1.BffHttpError(503, 'permissions_unavailable', message, { retryAfter });
|
|
78
80
|
}
|
|
81
|
+
exports.RATE_LIMIT_CAUSES = {
|
|
82
|
+
limitExceeded: 'limit_exceeded',
|
|
83
|
+
limiterSaturated: 'limiter_saturated',
|
|
84
|
+
};
|
|
85
|
+
function tooManyRequests(retryAfter, message, cause) {
|
|
86
|
+
return new bff_http_error_1.BffHttpError(429, 'too_many_requests', message, {
|
|
87
|
+
details: { cause },
|
|
88
|
+
retryAfter,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
79
91
|
function actionRequiresApproval(message = 'This action requires an approval before it can run', details) {
|
|
80
92
|
return new bff_http_error_1.BffHttpError(403, 'action_requires_approval', message, { details });
|
|
81
93
|
}
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLWxvY2FsLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL2JmZi1sb2NhbC1lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsOENBRUM7QUFFRCwwQ0FFQztBQUVELHNDQUVDO0FBRUQsb0RBRUM7QUFFRCxnREFFQztBQUVELDRDQUVDO0FBRUQsd0NBRUM7QUFFRCxvQ0FFQztBQUVELDhDQUVDO0FBRUQsMERBRUM7QUFFRCxrQ0FFQztBQUVELDBDQUVDO0FBRUQsNERBRUM7QUFFRCxzQ0FFQztBQUlELHNDQVFDO0FBRUQsa0RBRUM7QUFFRCwwQ0FFQztBQUVELHdEQUtDO0FBU0QsMENBU0M7QUFFRCx3REFLQztBQTVHRCxxREFBZ0Q7QUFFaEQsU0FBZ0IsaUJBQWlCLENBQUMsT0FBTyxHQUFHLG9CQUFvQjtJQUM5RCxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCO0lBQzFELE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0I7SUFDdEQsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxPQUFPLEdBQUcsMkJBQTJCO0lBQ3hFLE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsT0FBTyxHQUFHLHlCQUF5QjtJQUNwRSxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUs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
|
|
@@ -75,7 +75,7 @@ async function collectFields(collection, { store, capabilitiesFetcher, logger })
|
|
|
75
75
|
return UNTYPED('no_fields');
|
|
76
76
|
}
|
|
77
77
|
return {
|
|
78
|
-
projectable: capabilities.fields.map(
|
|
78
|
+
projectable: capabilities.fields.map(({ name, type }) => ({ name, type })),
|
|
79
79
|
filterable: collectFilterableFields(collection, capabilities, logger),
|
|
80
80
|
degraded: null,
|
|
81
81
|
};
|
|
@@ -146,4 +146,4 @@ async function collectUnfolding(options) {
|
|
|
146
146
|
}));
|
|
147
147
|
return { collections };
|
|
148
148
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdC11bmZvbGRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9jb2xsZWN0LXVuZm9sZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5TUEsbUNBZ0JDO0FBM01ELHNDQUFnRDtBQUNoRCx5REFBOEQ7QUFDOUQsMkVBQThGO0FBRTlGLG9HQUFvRztBQUNwRyxrR0FBa0c7QUFDbEcsa0ZBQWtGO0FBQ3JFLFFBQUEsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0FBVTNDLEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsS0FBVSxFQUNWLEtBQWEsRUFDYixHQUE0QjtJQUU1QixNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsaUdBQWlHO0lBQ2pHLCtDQUErQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDdkMsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRW5DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sTUFBTSxFQUFFLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVqRixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFzQyxF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
|
package/dist/openapi/names.d.ts
CHANGED
|
@@ -13,4 +13,6 @@ export declare function sanitizeIdentifier(raw: string): string;
|
|
|
13
13
|
*/
|
|
14
14
|
export type Namer = (raw: string) => string;
|
|
15
15
|
export default function createNamer(): Namer;
|
|
16
|
+
/** A customer name inside prose. Quoted rather than bare: a name can carry spaces or punctuation. */
|
|
17
|
+
export declare function quoted(name: string): string;
|
|
16
18
|
//# sourceMappingURL=names.d.ts.map
|
package/dist/openapi/names.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.sanitizeIdentifier = sanitizeIdentifier;
|
|
4
4
|
exports.default = createNamer;
|
|
5
|
+
exports.quoted = quoted;
|
|
5
6
|
/**
|
|
6
7
|
* Collection, relation and action names are arbitrary customer strings: spaces, dots, slashes,
|
|
7
8
|
* accents. A path segment carries them URL-encoded, but an `operationId` cannot — redocly rejects a
|
|
@@ -25,4 +26,8 @@ function createNamer() {
|
|
|
25
26
|
return candidate;
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
+
/** A customer name inside prose. Quoted rather than bare: a name can carry spaces or punctuation. */
|
|
30
|
+
function quoted(name) {
|
|
31
|
+
return JSON.stringify(name);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9uYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLGdEQUVDO0FBVUQsOEJBaUJDO0FBR0Qsd0JBRUM7QUF4Q0Q7Ozs7O0dBS0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXO0lBQzVDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDbkQsQ0FBQztBQVVELFNBQXdCLFdBQVc7SUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUUvQixPQUFPLENBQUMsR0FBVyxFQUFVLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUVoQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMzQixTQUFTLEdBQUcsR0FBRyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxxR0FBcUc7QUFDckcsU0FBZ0IsTUFBTSxDQUFDLElBQVk7SUFDakMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLENBQUMifQ==
|
|
@@ -5,7 +5,9 @@ export declare const ROUTE_PREFIX = "/agent/v1";
|
|
|
5
5
|
export interface GenerateOpenApiDocumentOptions {
|
|
6
6
|
unfolding?: Unfolding;
|
|
7
7
|
hasAiQueryRoute?: boolean;
|
|
8
|
+
/** The deployment's own external base URL, from `BFF_PUBLIC_URL`. Absent falls back to `/`. */
|
|
9
|
+
publicUrl?: string;
|
|
8
10
|
}
|
|
9
|
-
export declare function generateOpenApiDocument(version: string, { unfolding, hasAiQueryRoute }?: GenerateOpenApiDocumentOptions): OpenAPIObject;
|
|
11
|
+
export declare function generateOpenApiDocument(version: string, { unfolding, hasAiQueryRoute, publicUrl }?: GenerateOpenApiDocumentOptions): OpenAPIObject;
|
|
10
12
|
export declare function serializeOpenApi(document: OpenAPIObject): string;
|
|
11
13
|
//# sourceMappingURL=openapi-document.d.ts.map
|
|
@@ -44,6 +44,7 @@ const component_pool_1 = __importDefault(require("./component-pool"));
|
|
|
44
44
|
const schemas_1 = require("./schemas");
|
|
45
45
|
const unfolded_paths_1 = __importDefault(require("./unfolded-paths"));
|
|
46
46
|
const zod_openapi_1 = require("./zod-openapi");
|
|
47
|
+
const bff_local_errors_1 = require("../http/bff-local-errors");
|
|
47
48
|
const body_limit_1 = __importStar(require("../http/body-limit"));
|
|
48
49
|
exports.OPENAPI_VERSION = '3.1.0';
|
|
49
50
|
exports.ROUTE_PREFIX = '/agent/v1';
|
|
@@ -58,7 +59,7 @@ const ERROR_STATUSES = {
|
|
|
58
59
|
413: `The request body exceeds the BFF limit of ${body_limit_1.default}`,
|
|
59
60
|
415: 'The request Content-Type is neither application/json nor an application/*+json type, including form-urlencoded, and is rejected with 415 instead of being silently dropped; a request carrying a body with no Content-Type at all is rejected the same way; or the declared character set cannot be decoded',
|
|
60
61
|
422: 'A field is unknown, not filterable, is a nested relation path, or an action value at execute is outside its enum or of the wrong type',
|
|
61
|
-
429:
|
|
62
|
+
429: `The BFF rate-limited the request, for one of two reasons: the caller identity exceeded its per-window budget, or the limiter is saturated and cannot open a window for a new identity. The \`details.cause\` field of the error body distinguishes them (\`${bff_local_errors_1.RATE_LIMIT_CAUSES.limitExceeded}\` or \`${bff_local_errors_1.RATE_LIMIT_CAUSES.limiterSaturated}\`), and Retry-After carries the seconds to wait. On data and action routes the agent may also rate-limit the request itself; that 429 is relayed with the agent's own payload as \`details\`, so it carries neither \`cause\` nor Retry-After — read them only when they are present rather than branching on their value`,
|
|
62
63
|
500: 'The agent payload could not be mapped to the BFF contract, or the BFF hit an unexpected error',
|
|
63
64
|
501: 'The BFF is running without an agent configured, so the proxy is not implemented',
|
|
64
65
|
502: 'The agent refused the connection, its host could not be resolved, or the transport failed another way (a connection reset mid-flight, a socket hang up, a TLS failure) — it failed outright rather than running out of time',
|
|
@@ -70,13 +71,19 @@ const UNSUPPORTED_RESULT_DESCRIPTION = 'Either the BFF runs without an agent con
|
|
|
70
71
|
const ERROR_RESPONSE_REF = '#/components/schemas/ErrorResponse';
|
|
71
72
|
const MESSAGELESS_ERROR_RESPONSE_REF = '#/components/schemas/MessagelessErrorResponse';
|
|
72
73
|
const UNSUPPORTED_ACTION_RESULT_COMPONENT = 'UnsupportedActionResult';
|
|
73
|
-
const
|
|
74
|
+
const retryAfterHeader = (description) => ({
|
|
74
75
|
'Retry-After': {
|
|
75
|
-
description
|
|
76
|
+
description,
|
|
76
77
|
required: false,
|
|
77
78
|
schema: { type: 'integer' },
|
|
78
79
|
},
|
|
79
|
-
};
|
|
80
|
+
});
|
|
81
|
+
const RETRY_AFTER_HEADER = retryAfterHeader('Seconds to wait before retrying. Set when the API key could not be resolved.');
|
|
82
|
+
const RETRY_AFTER_RATE_LIMIT_HEADER = retryAfterHeader('Seconds until the BFF rate-limit window of the caller resets. When the limiter is ' +
|
|
83
|
+
'saturated the caller has no window yet, so the value is a lower bound instead: the ' +
|
|
84
|
+
'earliest reset among the identities currently holding one, after which a slot may free ' +
|
|
85
|
+
'up. Present when the BFF itself emitted this 429; an agent 429 relayed from upstream ' +
|
|
86
|
+
'carries no header.');
|
|
80
87
|
function registerErrorComponent(registry, name, { description, schema, headers }) {
|
|
81
88
|
return registry.registerComponent('responses', name, {
|
|
82
89
|
description,
|
|
@@ -87,6 +94,13 @@ function registerErrorComponent(registry, name, { description, schema, headers }
|
|
|
87
94
|
// Every error body is identical across paths, and their descriptions are long: inlining them costs
|
|
88
95
|
// ~2.8kB per path, which the unfolded document multiplies by every collection, relation and action.
|
|
89
96
|
// Registering them once as components keeps a path's error block to a dozen refs.
|
|
97
|
+
function retryAfterHeaders(status) {
|
|
98
|
+
if (status === '503')
|
|
99
|
+
return { headers: RETRY_AFTER_HEADER };
|
|
100
|
+
if (status === '429')
|
|
101
|
+
return { headers: RETRY_AFTER_RATE_LIMIT_HEADER };
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
90
104
|
function registerErrorResponses(registry, statuses, withActionResults) {
|
|
91
105
|
registry.register('ErrorResponse', schemas_1.ErrorResponseSchema);
|
|
92
106
|
const byStatus = {};
|
|
@@ -97,7 +111,7 @@ function registerErrorResponses(registry, statuses, withActionResults) {
|
|
|
97
111
|
byStatus[status] = registerErrorComponent(registry, `Error${status}`, {
|
|
98
112
|
description,
|
|
99
113
|
schema: { $ref: ERROR_RESPONSE_REF },
|
|
100
|
-
...(status
|
|
114
|
+
...retryAfterHeaders(status),
|
|
101
115
|
});
|
|
102
116
|
});
|
|
103
117
|
// A document with no action path must not carry this response, nor the messageless body it
|
|
@@ -143,7 +157,7 @@ const AI_DUAL_SHAPED_ERRORS = {
|
|
|
143
157
|
403: `The request presented an API key instead of a session (type oauth_required), or the Forest server refused the query. ${AI_RELAYED_OR_ENVELOPE}`,
|
|
144
158
|
413: `The request body exceeds the AI query limit of ${body_limit_1.AI_BODY_LIMIT}, or the Forest AI proxy refused it as too large. ${AI_RELAYED_OR_ENVELOPE}`,
|
|
145
159
|
415: `The request Content-Type is neither application/json nor an application/*+json type, or the request carries a body with no Content-Type at all, or it declares a character set the BFF cannot decode. ${AI_RELAYED_OR_ENVELOPE}`,
|
|
146
|
-
429: `The Forest AI proxy rate-limited the query. ${AI_RELAYED_OR_ENVELOPE}`,
|
|
160
|
+
429: `The BFF rate-limited the request (its own envelope, with Retry-After), or the Forest AI proxy rate-limited the query. ${AI_RELAYED_OR_ENVELOPE}`,
|
|
147
161
|
};
|
|
148
162
|
const AI_ENVELOPE_ERRORS = {
|
|
149
163
|
500: 'The BFF hit an unexpected error, or the Forest server answered a 500 whose body is withheld',
|
|
@@ -163,6 +177,7 @@ function registerAiQueryErrorResponses(registry) {
|
|
|
163
177
|
registerErrorComponent(registry, `Error${status}${AI_COMPONENT_SUFFIX}`, {
|
|
164
178
|
description,
|
|
165
179
|
schema: {},
|
|
180
|
+
headers: status === '429' ? RETRY_AFTER_RATE_LIMIT_HEADER : undefined,
|
|
166
181
|
}),
|
|
167
182
|
]);
|
|
168
183
|
const envelope = Object.entries(AI_ENVELOPE_ERRORS).map(([status, description]) => [
|
|
@@ -307,7 +322,15 @@ function registerAiQueryPath(registry, aiErrorRefs) {
|
|
|
307
322
|
},
|
|
308
323
|
});
|
|
309
324
|
}
|
|
310
|
-
|
|
325
|
+
const CONFIGURED_SERVER_DESCRIPTION = 'The public base URL of this BFF deployment.';
|
|
326
|
+
// A self-hosted BFF cannot know its own external URL, and this document is also exported offline by
|
|
327
|
+
// the CLI, so the absolute form has to be configured. Not a server variable in the meantime: a
|
|
328
|
+
// generator that meets a templated url drops the base URL entirely instead of substituting the
|
|
329
|
+
// default, which leaves a client worse off than the root-relative form.
|
|
330
|
+
const RELATIVE_SERVER_DESCRIPTION = 'Resolved against the URL this document was fetched from. Set BFF_PUBLIC_URL on the deployment ' +
|
|
331
|
+
'to publish its absolute base URL here instead, which a client generated from an offline export ' +
|
|
332
|
+
'needs.';
|
|
333
|
+
function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false, publicUrl } = {}) {
|
|
311
334
|
const registry = new zod_to_openapi_1.OpenAPIRegistry();
|
|
312
335
|
const hasActions = unfolding === undefined ||
|
|
313
336
|
unfolding.collections.some(collection => collection.actions.length > 0);
|
|
@@ -326,7 +349,12 @@ function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false }
|
|
|
326
349
|
type: 'apiKey',
|
|
327
350
|
in: 'header',
|
|
328
351
|
name: 'X-Forest-Bff-Key',
|
|
329
|
-
description: 'Mode 2: a BFF API key. Never send both this and an Authorization header.'
|
|
352
|
+
description: 'Mode 2: a BFF API key. Never send both this and an Authorization header. A key created ' +
|
|
353
|
+
'with allowedOrigins restricts browser callers only: an Origin the client sends must be in ' +
|
|
354
|
+
'that list, else 403 origin_not_allowed, while a request with no Origin at all — curl, a ' +
|
|
355
|
+
'server-side client, CI, an empty Origin header counting as none — passes, because there ' +
|
|
356
|
+
'the key is the boundary rather than the origin. The opaque Origin null is a present origin ' +
|
|
357
|
+
'and is rejected.',
|
|
330
358
|
});
|
|
331
359
|
registry.registerPath({
|
|
332
360
|
method: 'get',
|
|
@@ -343,6 +371,7 @@ function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false }
|
|
|
343
371
|
400: errorRefs.byStatus['400'],
|
|
344
372
|
401: errorRefs.byStatus['401'],
|
|
345
373
|
403: errorRefs.byStatus['403'],
|
|
374
|
+
429: errorRefs.byStatus['429'],
|
|
346
375
|
500: errorRefs.byStatus['500'],
|
|
347
376
|
501: errorRefs.byStatus['501'],
|
|
348
377
|
503: errorRefs.byStatus['503'],
|
|
@@ -401,10 +430,14 @@ function generateOpenApiDocument(version, { unfolding, hasAiQueryRoute = false }
|
|
|
401
430
|
license: { name: 'GPL-3.0', url: 'https://www.gnu.org/licenses/gpl-3.0.html' },
|
|
402
431
|
description: `${unfolding ? UNFOLDED_DESCRIPTION : GENERIC_DESCRIPTION} ${SHARED_DESCRIPTION}`,
|
|
403
432
|
},
|
|
404
|
-
servers: [
|
|
433
|
+
servers: [
|
|
434
|
+
publicUrl
|
|
435
|
+
? { url: publicUrl, description: CONFIGURED_SERVER_DESCRIPTION }
|
|
436
|
+
: { url: '/', description: RELATIVE_SERVER_DESCRIPTION },
|
|
437
|
+
],
|
|
405
438
|
});
|
|
406
439
|
}
|
|
407
440
|
function serializeOpenApi(document) {
|
|
408
441
|
return JSON.stringify(document, null, 2);
|
|
409
442
|
}
|
|
410
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1kb2N1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL29wZW5hcGktZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ1lBLDBEQStHQztBQUVELDRDQUVDO0FBaGZELG1FQUFzRjtBQUV0RixzRUFBNkM7QUFDN0MsdUNBY21CO0FBQ25CLHNFQUFxRDtBQUNyRCwrQ0FBa0M7QUFDbEMsaUVBQStEO0FBRWxELFFBQUEsZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUMxQixRQUFBLFlBQVksR0FBRyxXQUFXLENBQUM7QUFFeEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQztBQUVuQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUV0RSxNQUFNLGNBQWMsR0FBMkI7SUFDN0MsR0FBRyxFQUFFLGtWQUFrVjtJQUN2VixHQUFHLEVBQUUsMENBQTBDO0lBQy9DLEdBQUcsRUFBRSwwT0FBME87SUFDL08sR0FBRyxFQUFFLHlDQUF5QztJQUM5QyxHQUFHLEVBQUUsNkNBQTZDLG9CQUFVLEVBQUU7SUFDOUQsR0FBRyxFQUFFLDZTQUE2UztJQUNsVCxHQUFHLEVBQUUsdUlBQXVJO0lBQzVJLEdBQUcsRUFBRSxvQ0FBb0M7SUFDekMsR0FBRyxFQUFFLCtGQUErRjtJQUNwRyxHQUFHLEVBQUUsaUZBQWlGO0lBQ3RGLEdBQUcsRUFBRSw2TkFBNk47SUFDbE8sR0FBRyxFQUFFLGlHQUFpRztJQUN0RyxHQUFHLEVBQUUsa1RBQWtUO0NBQ3hULENBQUM7QUFFRixNQUFNLDhCQUE4QixHQUNsQyw2RkFBNkY7SUFDN0YsaUVBQWlFLENBQUM7QUFFcEUsTUFBTSxrQkFBa0IsR0FBRyxvQ0FBb0MsQ0FBQztBQUNoRSxNQUFNLDhCQUE4QixHQUFHLCtDQUErQyxDQUFDO0FBRXZGLE1BQU0sbUNBQW1DLEdBQUcseUJBQXlCLENBQUM7QUFFdEUsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixhQUFhLEVBQUU7UUFDYixXQUFXLEVBQUUsOEVBQThFO1FBQzNGLFFBQVEsRUFBRSxLQUFLO1FBQ2YsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQWtCLEVBQUU7S0FDckM7Q0FDRixDQUFDO0FBZUYsU0FBUyxzQkFBc0IsQ0FDN0IsUUFBeUIsRUFDekIsSUFBWSxFQUNaLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQWtCO0lBRWhELE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUU7UUFDbkQsV0FBVztRQUNYLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDM0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2hDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDVCxDQUFDO0FBRUQsbUdBQW1HO0FBQ25HLG9HQUFvRztBQUNwRyxrRkFBa0Y7QUFDbEYsU0FBUyxzQkFBc0IsQ0FDN0IsUUFBeUIsRUFDekIsUUFBa0IsRUFDbEIsaUJBQTBCO0lBRTFCLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLDZCQUFtQixDQUFDLENBQUM7SUFFeEQsTUFBTSxRQUFRLEdBQWdDLEVBQUUsQ0FBQztJQUVqRCxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsV0FBVztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFdkYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFRLE1BQU0sRUFBRSxFQUFFO1lBQ3BFLFdBQVc7WUFDWCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDcEMsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM3RCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILDJGQUEyRjtJQUMzRiwrRUFBK0U7SUFDL0UsSUFBSSxDQUFDLGlCQUFpQjtRQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFFdEYsUUFBUSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSx3Q0FBOEIsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQ3BELFFBQVEsRUFDUixtQ0FBbUMsRUFDbkM7UUFDRSxXQUFXLEVBQUUsOEJBQThCO1FBQzNDLE1BQU0sRUFBRTtZQUNOLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsQ0FBQztTQUNoRjtLQUNGLENBQ0YsQ0FBQztJQUVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQ3JCLElBQXVCLEVBQ3ZCLGNBQXVCO0lBRXZCLE9BQU8sY0FBYztRQUNuQixDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtRQUN6RCxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxXQUFXLEdBQUc7SUFDbEIsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztDQUNOLENBQUM7QUFFRixNQUFNLHNCQUFzQixHQUMxQixtR0FBbUc7SUFDbkcsaUdBQWlHO0lBQ2pHLGdHQUFnRztJQUNoRyxtREFBbUQsQ0FBQztBQUV0RCxNQUFNLHFCQUFxQixHQUEyQjtJQUNwRCxHQUFHLEVBQUUsd0ZBQXdGLHNCQUFzQixFQUFFO0lBQ3JILEdBQUcsRUFBRSxzSEFBc0gsc0JBQXNCLEVBQUU7SUFDbkosR0FBRyxFQUFFLHdIQUF3SCxzQkFBc0IsRUFBRTtJQUNySixHQUFHLEVBQUUsa0RBQWtELDBCQUFhLHFEQUFxRCxzQkFBc0IsRUFBRTtJQUNqSixHQUFHLEVBQUUseU1BQXlNLHNCQUFzQixFQUFFO0lBQ3RPLEdBQUcsRUFBRSwrQ0FBK0Msc0JBQXNCLEVBQUU7Q0FDN0UsQ0FBQztBQUVGLE1BQU0sa0JBQWtCLEdBQTJCO0lBQ2pELEdBQUcsRUFBRSw2RkFBNkY7SUFDbEcsR0FBRyxFQUFFLHFGQUFxRjtJQUMxRixHQUFHLEVBQUUsK0NBQStDO0lBQ3BELEdBQUcsRUFBRSxzRUFBc0U7Q0FDNUUsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQzFCLDRGQUE0RjtJQUM1Riw2REFBNkQ7SUFDN0QsZ0dBQWdHO0lBQ2hHLDZGQUE2RjtJQUM3RixpR0FBaUcsQ0FBQztBQUVwRyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztBQUV0QyxTQUFTLDZCQUE2QixDQUFDLFFBQXlCO0lBQzlELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEYsTUFBTTtRQUNOLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFRLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZFLFdBQVc7WUFDWCxNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUM7S0FDSCxDQUFDLENBQUM7SUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pGLE1BQU07UUFDTixzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxNQUFNLEdBQUcsbUJBQW1CLEVBQUUsRUFBRTtZQUN2RSxXQUFXO1lBQ1gsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1NBQ3JDLENBQUM7S0FDSCxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUNuRCxPQUFPLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGVBQWUsbUJBQW1CLEVBQUUsRUFBRTtZQUM5RSxXQUFXLEVBQUUsc0JBQXNCO1lBQ25DLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDO0FBY0QsTUFBTSxNQUFNLEdBQXNCO0lBQ2hDO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixXQUFXLEVBQUUsYUFBYTtRQUMxQixPQUFPLEVBQUUsOEJBQThCO1FBQ3ZDLE9BQU8sRUFBRSwyQkFBaUI7UUFDMUIsUUFBUSxFQUFFLDRCQUFrQjtRQUM1QixtQkFBbUIsRUFBRSxtQkFBbUI7UUFDeEMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO0tBQ3ZCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLFdBQVcsRUFBRSxjQUFjO1FBQzNCLE9BQU8sRUFBRSwrQkFBK0I7UUFDeEMsT0FBTyxFQUFFLDRCQUFrQjtRQUMzQixRQUFRLEVBQUUsNkJBQW1CO1FBQzdCLG1CQUFtQixFQUFFLDJCQUEyQjtRQUNoRCxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDdkI7SUFDRDtRQUNFLElBQUksRUFBRSx5Q0FBeUM7UUFDL0MsV0FBVyxFQUFFLG9CQUFvQjtRQUNqQyxPQUFPLEVBQUUsb0NBQW9DO1FBQzdDLE9BQU8sRUFBRSxtQ0FBeUI7UUFDbEMsUUFBUSxFQUFFLDRCQUFrQjtRQUM1QixtQkFBbUIsRUFBRSwyQkFBMkI7UUFDaEQsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztRQUNsQyxZQUFZLEVBQUUsSUFBSTtLQUNuQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLDBDQUEwQztRQUNoRCxXQUFXLEVBQUUscUJBQXFCO1FBQ2xDLE9BQU8sRUFBRSxxQ0FBcUM7UUFDOUMsT0FBTyxFQUFFLG9DQUEwQjtRQUNuQyxRQUFRLEVBQUUsNkJBQW1CO1FBQzdCLG1CQUFtQixFQUFFLG1DQUFtQztRQUN4RCxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDO1FBQ2xDLFlBQVksRUFBRSxJQUFJO0tBQ25CO0lBQ0Q7UUFDRSxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLFdBQVcsRUFBRSxlQUFlO1FBQzVCLE9BQU8sRUFBRSxrQ0FBa0M7UUFDM0MsT0FBTyxFQUFFLDZCQUFtQjtRQUM1QixRQUFRLEVBQUUsa0NBQXdCO1FBQ2xDLG1CQUFtQixFQUNqQixnSEFBZ0g7UUFDbEgsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztRQUNoQyxZQUFZLEVBQUUsSUFBSTtLQUNuQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLHdDQUF3QztRQUM5QyxXQUFXLEVBQUUsZUFBZTtRQUM1QixPQUFPLEVBQUUseUJBQXlCO1FBQ2xDLE9BQU8sRUFBRSw2QkFBbUI7UUFDNUIsUUFBUSxFQUFFLDRCQUFrQjtRQUM1QixtQkFBbUIsRUFDakIseUhBQXlIO1FBQzNILE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUM7UUFDaEMsWUFBWSxFQUFFLElBQUk7UUFDbEIsY0FBYyxFQUFFLElBQUk7S0FDckI7Q0FDRixDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBMkI7SUFDakQsVUFBVSxFQUFFLGtEQUFrRDtJQUM5RCxRQUFRLEVBQUUsd0VBQXdFO0lBQ2xGLE1BQU0sRUFBRSxxRkFBcUY7Q0FDOUYsQ0FBQztBQUVGLFNBQVMsV0FBVyxDQUFDLEtBQWU7SUFDbEMsT0FBTyxlQUFDLENBQUMsTUFBTSxDQUNiLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxlQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3pGLENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsK0VBQStFO0FBQy9FLE1BQU0seUJBQXlCLEdBQUcsaUJBQWlCLENBQUM7QUFFcEQsTUFBTSxlQUFlLEdBQUcsZUFBQztLQUN0QixNQUFNLEVBQUU7S0FDUixRQUFRLEVBQUU7S0FDVixPQUFPLENBQUM7SUFDUCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRTtJQUNsRCxXQUFXLEVBQ1QscUZBQXFGO1FBQ3JGLCtCQUErQjtDQUNsQyxDQUFDLENBQUM7QUFFTCxNQUFNLGtCQUFrQixHQUN0Qiw2RkFBNkY7SUFDN0YsK0ZBQStGO0lBQy9GLCtGQUErRjtJQUMvRiw2RkFBNkY7SUFDN0YsOEZBQThGO0lBQzlGLHVGQUF1RixDQUFDO0FBRTFGLE1BQU0sbUJBQW1CLEdBQ3ZCLGdHQUFnRztJQUNoRyw0RkFBNEY7SUFDNUYsMkZBQTJGO0lBQzNGLGtEQUFrRCxDQUFDO0FBRXJELE1BQU0sb0JBQW9CLEdBQ3hCLGlHQUFpRztJQUNqRyw0RkFBNEY7SUFDNUYsaUdBQWlHO0lBQ2pHLDBGQUEwRjtJQUMxRiwrRkFBK0Y7SUFDL0YseUZBQXlGO0lBQ3pGLGlHQUFpRztJQUNqRyw2RkFBNkY7SUFDN0Ysc0VBQXNFLENBQUM7QUFFekUsU0FBUyxtQkFBbUIsQ0FDMUIsUUFBeUIsRUFDekIsV0FBd0M7SUFFeEMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsTUFBTTtRQUNkLElBQUksRUFBRSxHQUFHLG9CQUFZLFdBQVc7UUFDaEMsV0FBVyxFQUFFLFNBQVM7UUFDdEIsT0FBTyxFQUFFLHdDQUF3QztRQUNqRCxXQUFXLEVBQ1QseUZBQXlGO1lBQ3pGLHVGQUF1RjtZQUN2RixzRkFBc0Y7WUFDdEYsd0ZBQXdGO1lBQ3hGLDZCQUE2QiwwQkFBYSx5QkFBeUIsb0JBQVUsWUFBWTtZQUN6RixvRkFBb0Y7WUFDcEYseUZBQXlGO1lBQ3pGLHFGQUFxRjtZQUNyRixrQ0FBa0M7UUFDcEMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsOEJBQW9CLEVBQUUsRUFBRSxFQUFFO1NBQzVGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsR0FBRyxFQUFFO2dCQUNILFdBQVcsRUFBRSxvREFBb0Q7Z0JBQ2pFLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLGVBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFO2FBQ3pEO1lBQ0QsR0FBRyxXQUFXO1NBQ2Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBT0QsU0FBZ0IsdUJBQXVCLENBQ3JDLE9BQWUsRUFDZixFQUFFLFNBQVMsRUFBRSxlQUFlLEdBQUcsS0FBSyxLQUFxQyxFQUFFO0lBRTNFLE1BQU0sUUFBUSxHQUFHLElBQUksZ0NBQWUsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUNkLFNBQVMsS0FBSyxTQUFTO1FBQ3ZCLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RSxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUVoRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFO1FBQzVELElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLFFBQVE7UUFDaEIsV0FBVyxFQUNULHNGQUFzRjtZQUN0Riw0RkFBNEY7WUFDNUYsd0ZBQXdGO1lBQ3hGLFdBQVc7S0FDZCxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFO1FBQzVELElBQUksRUFBRSxRQUFRO1FBQ2QsRUFBRSxFQUFFLFFBQVE7UUFDWixJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFdBQVcsRUFBRSwwRUFBMEU7S0FDeEYsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSxHQUFHLG9CQUFZLFVBQVU7UUFDL0IsV0FBVyxFQUFFLFlBQVk7UUFDekIsT0FBTyxFQUFFLGtDQUFrQztRQUMzQyxRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRTtZQUNULEdBQUcsRUFBRTtnQkFDSCxXQUFXLEVBQUUsc0VBQXNFO2dCQUNuRixPQUFPLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSwrQkFBcUIsRUFBRSxFQUFFO2FBQ25FO1lBQ0QsR0FBRyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzlCLEdBQUcsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5QixHQUFHLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDOUIsR0FBRyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzlCLEdBQUcsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5QixHQUFHLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDL0I7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFJLFdBQVc7UUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFNUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLElBQUEsd0JBQXFCLEVBQ25CO1lBQ0UsUUFBUTtZQUNSLElBQUksRUFBRSxJQUFJLHdCQUFhLENBQUMsUUFBUSxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxvQkFBWTtZQUNwQixRQUFRLEVBQUUsUUFBUTtZQUNsQixjQUFjO1lBQ2QsY0FBYyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUM7U0FDNUUsRUFDRCxTQUFTLENBQ1YsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUNwQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsR0FBRyxvQkFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsT0FBTyxFQUFFO29CQUNQLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDakMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLElBQUksRUFBRTt3QkFDSixRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVksS0FBSyxJQUFJO3dCQUNyQyxPQUFPLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7cUJBQzNEO2lCQUNGO2dCQUNELFNBQVMsRUFBRTtvQkFDVCxHQUFHLEVBQUU7d0JBQ0gsV0FBVyxFQUFFLEtBQUssQ0FBQyxtQkFBbUI7d0JBQ3RDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRTtxQkFDNUQ7b0JBQ0QsR0FBRyxjQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDO2lCQUM1RDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sSUFBSSxvQ0FBbUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFDcEUsT0FBTyxFQUFFLHVCQUFlO1FBQ3hCLGtHQUFrRztRQUNsRyxpR0FBaUc7UUFDakcsb0RBQW9EO1FBQ3BELElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1lBQ3JCLFdBQVcsRUFBRSx5Q0FBeUMsSUFBSSxDQUFDLFNBQVMsQ0FDbEUsVUFBVSxDQUFDLElBQUksQ0FDaEIsY0FBYztTQUNoQixDQUFDLENBQUM7UUFDSCxJQUFJLEVBQUU7WUFDSixLQUFLLEVBQUUsWUFBWTtZQUNuQixPQUFPO1lBQ1AsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsMkNBQTJDLEVBQUU7WUFDOUUsV0FBVyxFQUFFLEdBQ1gsU0FBUyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsbUJBQ3JDLElBQUksa0JBQWtCLEVBQUU7U0FDekI7UUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztLQUN4QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBdUI7SUFDdEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQyJ9
|
|
443
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1kb2N1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL29wZW5hcGktZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa2FBLDBEQTBIQztBQUVELDRDQUVDO0FBN2hCRCxtRUFBc0Y7QUFFdEYsc0VBQTZDO0FBQzdDLHVDQWNtQjtBQUNuQixzRUFBcUQ7QUFDckQsK0NBQWtDO0FBQ2xDLCtEQUE2RDtBQUM3RCxpRUFBK0Q7QUFFbEQsUUFBQSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQzFCLFFBQUEsWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUV4QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFDcEMsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDO0FBRW5DLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXRFLE1BQU0sY0FBYyxHQUEyQjtJQUM3QyxHQUFHLEVBQUUsa1ZBQWtWO0lBQ3ZWLEdBQUcsRUFBRSwwQ0FBMEM7SUFDL0MsR0FBRyxFQUFFLDBPQUEwTztJQUMvTyxHQUFHLEVBQUUseUNBQXlDO0lBQzlDLEdBQUcsRUFBRSw2Q0FBNkMsb0JBQVUsRUFBRTtJQUM5RCxHQUFHLEVBQUUsNlNBQTZTO0lBQ2xULEdBQUcsRUFBRSx1SUFBdUk7SUFDNUksR0FBRyxFQUFFLDhQQUE4UCxvQ0FBaUIsQ0FBQyxhQUFhLFdBQVcsb0NBQWlCLENBQUMsZ0JBQWdCLDRUQUE0VDtJQUMzb0IsR0FBRyxFQUFFLCtGQUErRjtJQUNwRyxHQUFHLEVBQUUsaUZBQWlGO0lBQ3RGLEdBQUcsRUFBRSw2TkFBNk47SUFDbE8sR0FBRyxFQUFFLGlHQUFpRztJQUN0RyxHQUFHLEVBQUUsa1RB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
|
|
@@ -5,8 +5,9 @@ export interface OpenApiRoutesOptions {
|
|
|
5
5
|
version: string;
|
|
6
6
|
enabled: boolean;
|
|
7
7
|
hasAiQueryRoute: boolean;
|
|
8
|
+
publicUrl?: string;
|
|
8
9
|
/** Absent (no agent or no read-model configuration) serves the generic document. */
|
|
9
10
|
source?: UnfoldSource;
|
|
10
11
|
}
|
|
11
|
-
export default function createOpenApiRoutes({ version, enabled, source, hasAiQueryRoute, }: OpenApiRoutesOptions): Middleware;
|
|
12
|
+
export default function createOpenApiRoutes({ version, enabled, source, hasAiQueryRoute, publicUrl, }: OpenApiRoutesOptions): Middleware;
|
|
12
13
|
//# sourceMappingURL=openapi-routes.d.ts.map
|
|
@@ -13,9 +13,9 @@ const bff_local_errors_1 = require("../http/bff-local-errors");
|
|
|
13
13
|
exports.OPENAPI_PATH = '/agent/openapi.json';
|
|
14
14
|
const READ_METHODS = new Set(['GET', 'HEAD']);
|
|
15
15
|
const MAX_GENERATION_RETRIES = 3;
|
|
16
|
-
function createOpenApiRoutes({ version, enabled, source, hasAiQueryRoute, }) {
|
|
16
|
+
function createOpenApiRoutes({ version, enabled, source, hasAiQueryRoute, publicUrl, }) {
|
|
17
17
|
const generic = enabled && !source
|
|
18
|
-
? (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version, { hasAiQueryRoute }))
|
|
18
|
+
? (0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version, { hasAiQueryRoute, publicUrl }))
|
|
19
19
|
: undefined;
|
|
20
20
|
// Memoized on the read-model identity: the store builds a new one per schema generation, so the
|
|
21
21
|
// document is rebuilt exactly when the schema it describes changed.
|
|
@@ -35,6 +35,7 @@ function createOpenApiRoutes({ version, enabled, source, hasAiQueryRoute, }) {
|
|
|
35
35
|
const { document, unfolding } = await (0, unfolded_document_1.default)(source, readModel, token, {
|
|
36
36
|
version,
|
|
37
37
|
hasAiQueryRoute,
|
|
38
|
+
publicUrl,
|
|
38
39
|
});
|
|
39
40
|
// A schema refresh landing during the capabilities fan-out mixes the new generation's field sets
|
|
40
41
|
// into this generation's collections, relations and actions. Such a document must not be served
|
|
@@ -68,4 +69,4 @@ function createOpenApiRoutes({ version, enabled, source, hasAiQueryRoute, }) {
|
|
|
68
69
|
ctx.body = document;
|
|
69
70
|
};
|
|
70
71
|
}
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9vcGVuYXBpLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF5QkEsc0NBNkVDO0FBbEdELHlEQUErRTtBQUMvRSw0RUFBd0Q7QUFDeEQsMkNBQW9EO0FBQ3BELHFFQUFrRjtBQUNsRiwrREFBMkQ7QUFFOUMsUUFBQSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFFbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUU5QyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQVdqQyxTQUF3QixtQkFBbUIsQ0FBQyxFQUMxQyxPQUFPLEVBQ1AsT0FBTyxFQUNQLE1BQU0sRUFDTixlQUFlLEVBQ2YsU0FBUyxHQUNZO0lBQ3JCLE1BQU0sT0FBTyxHQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU07UUFDaEIsQ0FBQyxDQUFDLElBQUEsbUNBQWdCLEVBQUMsSUFBQSwwQ0FBdUIsRUFBQyxPQUFPLEVBQUUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWhCLGdHQUFnRztJQUNoRyxvRUFBb0U7SUFDcEUsSUFBSSxRQUFnRSxDQUFDO0lBRXJFLEtBQUssVUFBVSxlQUFlLENBQzVCLEdBQThCLEVBQzlCLFlBQVksR0FBRyxzQkFBc0I7UUFFckMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLE9BQWlCLENBQUM7UUFFdEMsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFFRCw0RkFBNEY7UUFDNUYseUZBQXlGO1FBQ3pGLE1BQU0sS0FBSyxHQUFHLElBQUEsdUNBQWlCLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLHNDQUFnQixFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RCxJQUFJLFFBQVEsRUFBRSxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUVoRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBQSwyQkFBcUIsRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtZQUNwRixPQUFPO1lBQ1AsZUFBZTtZQUNmLFNBQVM7U0FDVixDQUFDLENBQUM7UUFFSCxpR0FBaUc7UUFDakcsZ0dBQWdHO1FBQ2hHLGlHQUFpRztRQUNqRyxpR0FBaUc7UUFDakcsSUFBSSxDQUFDLE1BQU0sSUFBQSxzQ0FBZ0IsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6RCxPQUFPLGVBQWUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxnR0FBZ0c7UUFDaEcsNkZBQTZGO1FBQzdGLCtGQUErRjtRQUMvRiw2RkFBNkY7UUFDN0YsbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxJQUFBLGlDQUFxQixFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsUUFBUSxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTyxLQUFLLFVBQVUsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQzNDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxvQkFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUksRUFBRSxDQUFDO1lBRWIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUEsa0NBQWUsR0FBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1QyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { UnfoldedCollection } from './unfolding';
|
|
2
|
+
import type { ReferenceObject, SchemaObject } from 'openapi3-ts/oas31';
|
|
3
|
+
/**
|
|
4
|
+
* The key a field really carries in a response record. `agent-client` deserializes the agent's
|
|
5
|
+
* JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
|
|
6
|
+
* `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
|
|
7
|
+
* under that name and RETURNED as `firstName`. The same library rather than a transcription: the
|
|
8
|
+
* transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
|
|
9
|
+
* anything failing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function recordKey(field: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* The record shape of one collection. The properties are what the capabilities report, and nothing
|
|
14
|
+
* more is forbidden: the capabilities route leaves out a OneToOne relation that the default
|
|
15
|
+
* projection returns, so a closed schema would reject responses the runtime really sends. `id` wins
|
|
16
|
+
* over any field of that name, because the deserializer overwrites the attribute with the resource
|
|
17
|
+
* id.
|
|
18
|
+
*/
|
|
19
|
+
export default function recordSchema(collection: UnfoldedCollection, forestMeta: ReferenceObject): SchemaObject;
|
|
20
|
+
export declare function listResponseSchema(collection: UnfoldedCollection, record: ReferenceObject): SchemaObject;
|
|
21
|
+
//# sourceMappingURL=record-schemas.d.ts.map
|
|
@@ -0,0 +1,149 @@
|
|
|
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.recordKey = recordKey;
|
|
7
|
+
exports.default = recordSchema;
|
|
8
|
+
exports.listResponseSchema = listResponseSchema;
|
|
9
|
+
const inflected_1 = __importDefault(require("inflected"));
|
|
10
|
+
const field_schemas_1 = __importDefault(require("./field-schemas"));
|
|
11
|
+
const names_1 = require("./names");
|
|
12
|
+
const pack_id_1 = require("../data/pack-id");
|
|
13
|
+
/**
|
|
14
|
+
* The key a field really carries in a response record. `agent-client` deserializes the agent's
|
|
15
|
+
* JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
|
|
16
|
+
* `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
|
|
17
|
+
* under that name and RETURNED as `firstName`. The same library rather than a transcription: the
|
|
18
|
+
* transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
|
|
19
|
+
* anything failing.
|
|
20
|
+
*/
|
|
21
|
+
function recordKey(field) {
|
|
22
|
+
return inflected_1.default.camelize(inflected_1.default.underscore(field), false);
|
|
23
|
+
}
|
|
24
|
+
// The flat id is the JSON:API resource id, which is a string by specification whatever the key
|
|
25
|
+
// column holds. `__forest.primaryKey` is the same id unpacked and typed, so the two forms of one
|
|
26
|
+
// record disagree by construction — the trap this schema exists to name.
|
|
27
|
+
const ID_SCHEMA = {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'The record id, always a string — the agent serializes it as the JSON:API resource id, even ' +
|
|
30
|
+
'when the key column is a Number. `__forest.primaryKey` carries the same id TYPED, so ' +
|
|
31
|
+
`comparing the two without coercion fails. A composite key is its values joined by ` +
|
|
32
|
+
`${(0, names_1.quoted)(pack_id_1.PACKED_ID_SEPARATOR)}.`,
|
|
33
|
+
};
|
|
34
|
+
function isReference(schema) {
|
|
35
|
+
return '$ref' in schema;
|
|
36
|
+
}
|
|
37
|
+
function collapsedSchema(names, tail) {
|
|
38
|
+
return {
|
|
39
|
+
description: `${names.join(', ')} all reach the response under this single key, so which one it holds ` +
|
|
40
|
+
`is not determined here.${tail}`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* One published field, at every depth: renamed to the key the response carries it under, and
|
|
45
|
+
* widened to accept null. The capabilities report a column type and never its nullability, so a
|
|
46
|
+
* nullable column answers `null` against a type this schema would otherwise declare non-null — a
|
|
47
|
+
* generated client validating the response would reject what the runtime really sends. An
|
|
48
|
+
* unconstrained schema already accepts null and keeps its type as it is. Renaming and widening are
|
|
49
|
+
* one traversal because they visit the same structure. The rename is as lossy one level down as it
|
|
50
|
+
* is at the top: two members collapsing onto one key would silently drop one, so that key is
|
|
51
|
+
* published unconstrained and names them all instead.
|
|
52
|
+
*/
|
|
53
|
+
function publishedSchema(schema) {
|
|
54
|
+
const published = typeof schema.type === 'string' ? { ...schema, type: [schema.type, 'null'] } : { ...schema };
|
|
55
|
+
if (schema.items !== undefined && !isReference(schema.items)) {
|
|
56
|
+
published.items = publishedSchema(schema.items);
|
|
57
|
+
}
|
|
58
|
+
const { properties } = schema;
|
|
59
|
+
if (properties !== undefined) {
|
|
60
|
+
const byKey = new Map();
|
|
61
|
+
Object.keys(properties).forEach(name => {
|
|
62
|
+
const key = recordKey(name);
|
|
63
|
+
const collapsed = byKey.get(key);
|
|
64
|
+
if (collapsed)
|
|
65
|
+
collapsed.push(name);
|
|
66
|
+
else
|
|
67
|
+
byKey.set(key, [name]);
|
|
68
|
+
});
|
|
69
|
+
published.properties = Object.fromEntries([...byKey].map(([key, names]) => {
|
|
70
|
+
if (names.length > 1)
|
|
71
|
+
return [key, collapsedSchema(names.map(names_1.quoted), '')];
|
|
72
|
+
const nested = properties[names[0]];
|
|
73
|
+
return [key, isReference(nested) ? nested : publishedSchema(nested)];
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
return published;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The schema of one field, under the key the response carries it as. Several fields can collapse to
|
|
80
|
+
* the same key — the transform is lossy, `first_name` and `firstName` both yield `firstName` — and
|
|
81
|
+
* which one wins depends on the order the agent serialized them in, so the type is left open rather
|
|
82
|
+
* than picked.
|
|
83
|
+
*/
|
|
84
|
+
function propertySchema(key, fields) {
|
|
85
|
+
const names = fields.map(field => (0, names_1.quoted)(field.name));
|
|
86
|
+
if (fields.length > 1) {
|
|
87
|
+
return collapsedSchema(names, ' Project one of them at a time to know.');
|
|
88
|
+
}
|
|
89
|
+
const [field] = fields;
|
|
90
|
+
const schema = publishedSchema((0, field_schemas_1.default)(field.type));
|
|
91
|
+
if (field.name === key)
|
|
92
|
+
return schema;
|
|
93
|
+
const description = [schema.description, `The ${names.join(', ')} field.`]
|
|
94
|
+
.filter(Boolean)
|
|
95
|
+
.join(' ');
|
|
96
|
+
return { ...schema, description };
|
|
97
|
+
}
|
|
98
|
+
function fieldProperties(projectable) {
|
|
99
|
+
const byKey = new Map();
|
|
100
|
+
projectable.forEach(field => {
|
|
101
|
+
const key = recordKey(field.name);
|
|
102
|
+
const collapsed = byKey.get(key);
|
|
103
|
+
if (collapsed)
|
|
104
|
+
collapsed.push(field);
|
|
105
|
+
else
|
|
106
|
+
byKey.set(key, [field]);
|
|
107
|
+
});
|
|
108
|
+
return Object.fromEntries([...byKey].map(([key, fields]) => [key, propertySchema(key, fields)]));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The record shape of one collection. The properties are what the capabilities report, and nothing
|
|
112
|
+
* more is forbidden: the capabilities route leaves out a OneToOne relation that the default
|
|
113
|
+
* projection returns, so a closed schema would reject responses the runtime really sends. `id` wins
|
|
114
|
+
* over any field of that name, because the deserializer overwrites the attribute with the resource
|
|
115
|
+
* id.
|
|
116
|
+
*/
|
|
117
|
+
function recordSchema(collection, forestMeta) {
|
|
118
|
+
return {
|
|
119
|
+
type: 'object',
|
|
120
|
+
description: `A record of ${(0, names_1.quoted)(collection.name)}. It carries the fields the request projected — ` +
|
|
121
|
+
'omit `projection` and the agent returns them all. The properties below are the ones the ' +
|
|
122
|
+
"collection's capabilities report; a record can carry more, such as a to-one relation. " +
|
|
123
|
+
'Every field is nullable: the capabilities report a column type and never its nullability, ' +
|
|
124
|
+
'so a null is always possible whatever the type says.',
|
|
125
|
+
properties: {
|
|
126
|
+
...fieldProperties(collection.fields.projectable),
|
|
127
|
+
id: ID_SCHEMA,
|
|
128
|
+
__forest: forestMeta,
|
|
129
|
+
},
|
|
130
|
+
required: ['id', '__forest'],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function listResponseSchema(collection, record) {
|
|
134
|
+
return {
|
|
135
|
+
type: 'object',
|
|
136
|
+
description: `A page of ${(0, names_1.quoted)(collection.name)} records. The list never carries a total: call the ` +
|
|
137
|
+
'count endpoint for that, which is why `countStatus` is always `not_requested`.',
|
|
138
|
+
properties: {
|
|
139
|
+
data: { type: 'array', items: record },
|
|
140
|
+
meta: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: { countStatus: { type: 'string', const: 'not_requested' } },
|
|
143
|
+
required: ['countStatus'],
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
required: ['data', 'meta'],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9yZWNvcmQtc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWlCQSw4QkFFQztBQXFIRCwrQkFtQkM7QUFFRCxnREFtQkM7QUE3S0QsMERBQWtDO0FBRWxDLG9FQUE0QztBQUM1QyxtQ0FBaUM7QUFDakMsNkNBQXNEO0FBRXREOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLG1CQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsaUdBQWlHO0FBQ2pHLHlFQUF5RTtBQUN6RSxNQUFNLFNBQVMsR0FBaUI7SUFDOUIsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQ1QsNkZBQTZGO1FBQzdGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsR0FBRyxJQUFBLGNBQU0sRUFBQyw2QkFBbUIsQ0FBQyxHQUFHO0NBQ3BDLENBQUM7QUFFRixTQUFTLFdBQVcsQ0FBQyxNQUFzQztJQUN6RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQWUsRUFBRSxJQUFZO0lBQ3BELE9BQU87UUFDTCxXQUFXLEVBQ1QsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1RUFBdUU7WUFDMUYsMEJBQTBCLElBQUksRUFBRTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQW9CO0lBQzNDLE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENB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
|
|
@@ -100,6 +100,10 @@ export declare const ActionResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
100
100
|
type: z.ZodLiteral<"redirect">;
|
|
101
101
|
path: z.ZodString;
|
|
102
102
|
}, z.core.$strip>], "type">;
|
|
103
|
+
export declare const ForestRecordMetaSchema: z.ZodObject<{
|
|
104
|
+
collection: z.ZodString;
|
|
105
|
+
primaryKey: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
106
|
+
}, z.core.$strip>;
|
|
103
107
|
export declare const ListResponseSchema: z.ZodObject<{
|
|
104
108
|
data: z.ZodArray<z.ZodIntersection<z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodObject<{
|
|
105
109
|
__forest: z.ZodObject<{
|