@forestadmin/agent-bff 1.23.6 → 1.23.8
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 +53 -31
- package/dist/action/action-execute-mapper.d.ts +3 -3
- package/dist/action/action-form-mapper.d.ts +2 -1
- package/dist/action/action-form-mapper.js +12 -8
- package/dist/action/action-routes-middleware.js +15 -4
- package/dist/action/action-values-validator.d.ts +4 -0
- package/dist/action/action-values-validator.js +79 -0
- package/dist/action/agent-action-client.d.ts +1 -0
- package/dist/action/agent-action-client.js +1 -1
- package/dist/agent/create-agent-http-requester.d.ts +3 -0
- package/dist/agent/create-agent-http-requester.js +25 -12
- 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/context/build-context.d.ts +1 -1
- 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/agent-query.d.ts +15 -28
- package/dist/data/agent-query.js +66 -35
- package/dist/data/data-routes-middleware.js +5 -5
- package/dist/data/request-schemas.d.ts +38 -16
- package/dist/data/request-schemas.js +26 -19
- package/dist/docs/docs-samples.d.ts +3 -2
- package/dist/docs/docs-samples.js +4 -3
- package/dist/http/agent-error-mapper.d.ts +2 -1
- package/dist/http/agent-error-mapper.js +8 -1
- 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 +12 -7
- package/dist/openapi/field-schemas.d.ts +5 -4
- package/dist/openapi/field-schemas.js +24 -22
- package/dist/openapi/openapi-document.d.ts +3 -1
- package/dist/openapi/openapi-document.js +50 -15
- package/dist/openapi/openapi-routes.d.ts +2 -1
- package/dist/openapi/openapi-routes.js +4 -3
- package/dist/openapi/schemas.d.ts +44 -15
- package/dist/openapi/schemas.js +145 -40
- package/dist/openapi/unfolded-document.d.ts +2 -1
- package/dist/openapi/unfolded-document.js +3 -3
- package/dist/openapi/unfolded-paths.js +86 -50
- package/dist/openapi/unfolding.d.ts +2 -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/dist/read-model/capabilities-cache.d.ts +1 -11
- package/dist/read-model/capabilities-cache.js +1 -1
- package/dist/read-model/field-type.d.ts +17 -0
- package/dist/read-model/field-type.js +42 -0
- package/dist/validation/validation-errors.d.ts +6 -0
- package/dist/validation/validation-errors.js +14 -1
- package/package.json +4 -4
package/dist/cli-dispatch.js
CHANGED
|
@@ -105,14 +105,15 @@ async function renderOpenApi(env, logger) {
|
|
|
105
105
|
const unfoldable = authSecret && wantsUnfolding(env)
|
|
106
106
|
? { source: (0, cli_core_1.resolveUnfoldSource)((0, env_config_1.parseConfig)(env), logger), authSecret }
|
|
107
107
|
: undefined;
|
|
108
|
+
const publicUrl = (0, env_config_1.parsePublicUrl)(env.BFF_PUBLIC_URL);
|
|
108
109
|
const hasAiQueryRoute = publishesAiQuery(env, logger);
|
|
109
110
|
if (!unfoldable?.source) {
|
|
110
111
|
logger('Warn', `Emitting the generic OpenAPI document: ${NOTHING_TO_UNFOLD}`);
|
|
111
|
-
return `${(0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version_1.default, { hasAiQueryRoute }))}\n`;
|
|
112
|
+
return `${(0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version_1.default, { hasAiQueryRoute, publicUrl }))}\n`;
|
|
112
113
|
}
|
|
113
114
|
const { source } = unfoldable;
|
|
114
115
|
const readModel = await source.store.getReadModel();
|
|
115
|
-
const { document, unfolding } = await (0, unfolded_document_1.default)(source, readModel, () => (0, unfolded_document_1.issueOpenApiAgentToken)(unfoldable.authSecret), { version: version_1.default, hasAiQueryRoute });
|
|
116
|
+
const { document, unfolding } = await (0, unfolded_document_1.default)(source, readModel, () => (0, unfolded_document_1.issueOpenApiAgentToken)(unfoldable.authSecret), { version: version_1.default, hasAiQueryRoute, publicUrl });
|
|
116
117
|
// Not one collection came back with its field set, so the agent was unreachable throughout. The
|
|
117
118
|
// paths are real but every field schema is free-form, which is not the document this command
|
|
118
119
|
// promises — a CI job regenerating it needs something to branch on, and the degraded notes buried
|
|
@@ -181,4 +182,4 @@ async function dispatchCli(argv, env, logger) {
|
|
|
181
182
|
process.stdout.write(document);
|
|
182
183
|
return { exitCode: 0 };
|
|
183
184
|
}
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWRpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS1kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnRkEsc0NBNENDO0FBZ0RELDhCQWdEQztBQXpORCwyQkFBOEM7QUFDOUMsZ0RBQXdCO0FBRXhCLCtFQUE0RDtBQUM1RCxvRUFBMkQ7QUFDM0QsdURBQTZFO0FBQzdFLG9EQUFrRTtBQUNsRSxxQ0FBK0M7QUFDL0MsaUVBQXVGO0FBQ3ZGLGlGQUE0RjtBQUM1RixtREFBc0Q7QUFDdEQsd0RBQWdDO0FBRW5CLFFBQUEsbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBRWxELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUVsQixRQUFBLEtBQUssR0FBRzs7Ozs7Ozs7OztvQ0FVZSwyQkFBbUI7Ozs7b0RBSUgsQ0FBQztBQUV4QyxRQUFBLElBQUksR0FBRyxvQ0FBb0MsQ0FBQztBQUV6RCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFPbkQsTUFBTSxXQUFXLEdBQUc7SUFDbEIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsV0FBVztDQUNILENBQUM7QUFFWCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUM7QUFFbkYsU0FBUyxjQUFjLENBQUMsR0FBc0I7SUFDNUMsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFF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
|
|
@@ -7,6 +7,7 @@ export interface BFFConfig {
|
|
|
7
7
|
forestServerUrl?: string;
|
|
8
8
|
forestAppUrl?: string;
|
|
9
9
|
agentUrl?: string;
|
|
10
|
+
publicUrl?: string;
|
|
10
11
|
tokenEncryptionKey?: string;
|
|
11
12
|
allowedOrigins: string[];
|
|
12
13
|
invalidAllowedOrigins: string[];
|
|
@@ -14,6 +15,8 @@ export interface BFFConfig {
|
|
|
14
15
|
agentTimeoutMs?: number;
|
|
15
16
|
aiTimeoutMs: number;
|
|
16
17
|
openapiEnabled: boolean;
|
|
18
|
+
rateLimitMaxRequests: number;
|
|
19
|
+
rateLimitWindowMs: number;
|
|
17
20
|
httpPort: number;
|
|
18
21
|
presence: PresenceMap;
|
|
19
22
|
hasAllRequired: boolean;
|
|
@@ -21,5 +24,10 @@ export interface BFFConfig {
|
|
|
21
24
|
export declare const DEFAULT_AGENT_TIMEOUT_MS = 10000;
|
|
22
25
|
export declare const DEFAULT_AI_TIMEOUT_MS = 120000;
|
|
23
26
|
export declare const MAX_TIMEOUT_MS = 2147483647;
|
|
27
|
+
export declare const DEFAULT_RATE_LIMIT_MAX_REQUESTS = 300;
|
|
28
|
+
export declare const DEFAULT_RATE_LIMIT_WINDOW_MS = 60000;
|
|
29
|
+
export declare const MAX_RATE_LIMIT_REQUESTS = 10000;
|
|
30
|
+
export declare const MIN_RATE_LIMIT_WINDOW_MS = 1000;
|
|
31
|
+
export declare function parsePublicUrl(raw?: string): string | undefined;
|
|
24
32
|
export declare function parseConfig(env: NodeJS.ProcessEnv): BFFConfig;
|
|
25
33
|
//# sourceMappingURL=env-config.d.ts.map
|
|
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MAX_TIMEOUT_MS = exports.DEFAULT_AI_TIMEOUT_MS = exports.DEFAULT_AGENT_TIMEOUT_MS = exports.REQUIRED_KEYS = void 0;
|
|
6
|
+
exports.MIN_RATE_LIMIT_WINDOW_MS = exports.MAX_RATE_LIMIT_REQUESTS = exports.DEFAULT_RATE_LIMIT_WINDOW_MS = exports.DEFAULT_RATE_LIMIT_MAX_REQUESTS = exports.MAX_TIMEOUT_MS = exports.DEFAULT_AI_TIMEOUT_MS = exports.DEFAULT_AGENT_TIMEOUT_MS = exports.REQUIRED_KEYS = void 0;
|
|
7
|
+
exports.parsePublicUrl = parsePublicUrl;
|
|
7
8
|
exports.parseConfig = parseConfig;
|
|
8
9
|
const zod_1 = require("zod");
|
|
9
10
|
const origin_1 = require("../cors/origin");
|
|
@@ -22,6 +23,10 @@ const DECIMAL_INTEGER = /^\d+$/;
|
|
|
22
23
|
exports.DEFAULT_AGENT_TIMEOUT_MS = 10000;
|
|
23
24
|
exports.DEFAULT_AI_TIMEOUT_MS = 120000;
|
|
24
25
|
exports.MAX_TIMEOUT_MS = 2147483647;
|
|
26
|
+
exports.DEFAULT_RATE_LIMIT_MAX_REQUESTS = 300;
|
|
27
|
+
exports.DEFAULT_RATE_LIMIT_WINDOW_MS = 60000;
|
|
28
|
+
exports.MAX_RATE_LIMIT_REQUESTS = 10000;
|
|
29
|
+
exports.MIN_RATE_LIMIT_WINDOW_MS = 1000;
|
|
25
30
|
const MAX_PORT = 65535;
|
|
26
31
|
const ENCRYPTION_KEY_BYTES = 32;
|
|
27
32
|
const BASE64_PATTERN = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
@@ -29,19 +34,42 @@ const HTTP_URL_SCHEMA = zod_1.z.url({ protocol: /^https?$/ });
|
|
|
29
34
|
function normalize(value) {
|
|
30
35
|
return value === undefined || value.trim() === '' ? undefined : value;
|
|
31
36
|
}
|
|
32
|
-
function
|
|
33
|
-
const
|
|
34
|
-
if (
|
|
35
|
-
return
|
|
36
|
-
const
|
|
37
|
-
if (Number.isNaN(
|
|
38
|
-
throw new errors_1.ConfigurationError(`Invalid configuration:
|
|
37
|
+
function parseBoundedInteger(raw, envName, { min, max, fallback }) {
|
|
38
|
+
const value = normalize(raw);
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
return fallback;
|
|
41
|
+
const parsed = DECIMAL_INTEGER.test(value.trim()) ? Number(value.trim()) : NaN;
|
|
42
|
+
if (Number.isNaN(parsed) || parsed < min || parsed > max) {
|
|
43
|
+
throw new errors_1.ConfigurationError(`Invalid configuration: ${envName} must be an integer between ${min} and ${max}.`);
|
|
39
44
|
}
|
|
40
|
-
return
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
function parsePort(raw) {
|
|
48
|
+
return parseBoundedInteger(raw, 'HTTP_PORT', {
|
|
49
|
+
min: 0,
|
|
50
|
+
max: MAX_PORT,
|
|
51
|
+
fallback: defaults_1.default,
|
|
52
|
+
});
|
|
41
53
|
}
|
|
42
54
|
function isHttpUrl(value) {
|
|
43
55
|
return !/\s/.test(value) && HTTP_URL_SCHEMA.safeParse(value).success;
|
|
44
56
|
}
|
|
57
|
+
function parsePublicUrl(raw) {
|
|
58
|
+
const value = normalize(raw);
|
|
59
|
+
if (value === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
if (!isHttpUrl(value)) {
|
|
62
|
+
throw new errors_1.ConfigurationError('Invalid configuration: BFF_PUBLIC_URL must be a valid http(s) URL.');
|
|
63
|
+
}
|
|
64
|
+
if (value.includes('?') || value.includes('#')) {
|
|
65
|
+
throw new errors_1.ConfigurationError('Invalid configuration: BFF_PUBLIC_URL must not carry a query string or fragment.');
|
|
66
|
+
}
|
|
67
|
+
const url = new URL(value);
|
|
68
|
+
if (url.username !== '' || url.password !== '') {
|
|
69
|
+
throw new errors_1.ConfigurationError('Invalid configuration: BFF_PUBLIC_URL must not carry credentials.');
|
|
70
|
+
}
|
|
71
|
+
return url.href.replace(/\/+$/, '');
|
|
72
|
+
}
|
|
45
73
|
function isValidEncryptionKey(value) {
|
|
46
74
|
return BASE64_PATTERN.test(value) && Buffer.from(value, 'base64').length === ENCRYPTION_KEY_BYTES;
|
|
47
75
|
}
|
|
@@ -53,14 +81,7 @@ function parseEncryptionKey(raw) {
|
|
|
53
81
|
return value;
|
|
54
82
|
}
|
|
55
83
|
function parseTimeoutMs(raw, envName, defaultMs) {
|
|
56
|
-
|
|
57
|
-
if (value === undefined)
|
|
58
|
-
return defaultMs;
|
|
59
|
-
const timeout = DECIMAL_INTEGER.test(value.trim()) ? Number(value.trim()) : NaN;
|
|
60
|
-
if (Number.isNaN(timeout) || timeout === 0 || timeout > exports.MAX_TIMEOUT_MS) {
|
|
61
|
-
throw new errors_1.ConfigurationError(`Invalid configuration: ${envName} must be a positive integer of at most ${exports.MAX_TIMEOUT_MS} milliseconds.`);
|
|
62
|
-
}
|
|
63
|
-
return timeout;
|
|
84
|
+
return parseBoundedInteger(raw, envName, { min: 1, max: exports.MAX_TIMEOUT_MS, fallback: defaultMs });
|
|
64
85
|
}
|
|
65
86
|
function parseDefaultTimezone(raw) {
|
|
66
87
|
const value = normalize(raw);
|
|
@@ -95,6 +116,7 @@ function parseConfig(env) {
|
|
|
95
116
|
forestServerUrl: normalized.FOREST_SERVER_URL,
|
|
96
117
|
forestAppUrl: normalized.FOREST_APP_URL,
|
|
97
118
|
agentUrl: normalized.AGENT_URL,
|
|
119
|
+
publicUrl: parsePublicUrl(env.BFF_PUBLIC_URL),
|
|
98
120
|
tokenEncryptionKey,
|
|
99
121
|
allowedOrigins,
|
|
100
122
|
invalidAllowedOrigins,
|
|
@@ -102,9 +124,19 @@ function parseConfig(env) {
|
|
|
102
124
|
agentTimeoutMs: parseTimeoutMs(env.BFF_AGENT_TIMEOUT_MS, 'BFF_AGENT_TIMEOUT_MS', exports.DEFAULT_AGENT_TIMEOUT_MS),
|
|
103
125
|
aiTimeoutMs: parseTimeoutMs(env.BFF_AI_TIMEOUT_MS, 'BFF_AI_TIMEOUT_MS', exports.DEFAULT_AI_TIMEOUT_MS),
|
|
104
126
|
openapiEnabled: parseOpenApiEnabled(env.BFF_OPENAPI_ENABLED),
|
|
127
|
+
rateLimitMaxRequests: parseBoundedInteger(env.BFF_RATE_LIMIT_MAX_REQUESTS, 'BFF_RATE_LIMIT_MAX_REQUESTS', {
|
|
128
|
+
min: 1,
|
|
129
|
+
max: exports.MAX_RATE_LIMIT_REQUESTS,
|
|
130
|
+
fallback: exports.DEFAULT_RATE_LIMIT_MAX_REQUESTS,
|
|
131
|
+
}),
|
|
132
|
+
rateLimitWindowMs: parseBoundedInteger(env.BFF_RATE_LIMIT_WINDOW_MS, 'BFF_RATE_LIMIT_WINDOW_MS', {
|
|
133
|
+
min: exports.MIN_RATE_LIMIT_WINDOW_MS,
|
|
134
|
+
max: exports.MAX_TIMEOUT_MS,
|
|
135
|
+
fallback: exports.DEFAULT_RATE_LIMIT_WINDOW_MS,
|
|
136
|
+
}),
|
|
105
137
|
httpPort: parsePort(env.HTTP_PORT),
|
|
106
138
|
presence,
|
|
107
139
|
hasAllRequired: exports.REQUIRED_KEYS.every(key => presence[key]) && tokenEncryptionKey !== undefined,
|
|
108
140
|
};
|
|
109
141
|
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvZW52LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUEwRkEsd0NBMEJDO0FBNENELGtDQStEQztBQS9ORCw2QkFBd0I7QUFFeEIsMkNBQXFEO0FBQ3JELDJEQUEyQztBQUMzQyxzQ0FBK0M7QUFDL0MsbURBQXVEO0FBRTFDLFFBQUEsYUFBYSxHQUFHO0lBQzNCLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLGdCQUFnQjtJQUNoQixXQUFXO0NBQ0gsQ0FBQztBQUlYLE1BQU0sUUFBUSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFVLENBQUM7QUF5Qi9FLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUNuQixRQUFBLHdCQUF3QixHQUFHLEtBQU0sQ0FBQztBQUNsQyxRQUFBLHFCQUFxQixHQUFHLE1BQU8sQ0FBQztBQUNoQyxRQUFBLGNBQWMsR0FBRyxVQUFhLENBQUM7QUFDL0IsUUFBQSwrQkFBK0IsR0FBRyxHQUFHLENBQUM7QUFDdEMsUUFBQSw0QkFBNEIsR0FBRyxLQUFNLENBQUM7QUFDdEMsUUFBQSx1QkFBdUIsR0FBRyxLQUFNLENBQUM7QUFDakMsUUFBQSx3QkFBd0IsR0FBRyxJQUFLLENBQUM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDO0FBQ2hELE1BQU0sZUFBZSxHQUFHLE9BQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUV4RCxTQUFTLFNBQVMsQ0FBQyxLQUF5QjtJQUMxQyxPQUFPLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FB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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FieldType } from '../read-model/
|
|
1
|
+
import type { FieldType } from '../read-model/field-type';
|
|
2
2
|
import type ReadModel from '../read-model/read-model';
|
|
3
3
|
import type { RelationshipType } from '../read-model/read-model';
|
|
4
4
|
import type { ForestSchemaAction, ForestSchemaCollection } from '@forestadmin/forestadmin-client';
|
package/dist/cors/origin.d.ts
CHANGED
package/dist/cors/origin.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasOrigin = hasOrigin;
|
|
3
4
|
exports.normalizeOrigin = normalizeOrigin;
|
|
4
5
|
exports.parseAllowedOrigins = parseAllowedOrigins;
|
|
5
6
|
exports.originAllowed = originAllowed;
|
|
7
|
+
function hasOrigin(raw) {
|
|
8
|
+
return raw !== undefined && raw !== null && raw.trim() !== '';
|
|
9
|
+
}
|
|
6
10
|
function normalizeOrigin(raw) {
|
|
7
|
-
if (raw
|
|
11
|
+
if (!hasOrigin(raw))
|
|
8
12
|
return null;
|
|
9
13
|
const trimmed = raw.trim();
|
|
10
|
-
if (trimmed === '
|
|
14
|
+
if (trimmed === 'null')
|
|
11
15
|
return null;
|
|
12
16
|
let url;
|
|
13
17
|
try {
|
|
@@ -44,4 +48,4 @@ function originAllowed(requestOrigin, allowList) {
|
|
|
44
48
|
return false;
|
|
45
49
|
return allowList.some(entry => normalizeOrigin(entry) === normalized);
|
|
46
50
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcnMvb3JpZ2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOEJBRUM7QUFFRCwwQ0FpQkM7QUFFRCxrREFzQkM7QUFFRCxzQ0FLQztBQXBERCxTQUFnQixTQUFTLENBQUMsR0FBOEI7SUFDdEQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLEdBQThCO0lBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFakMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksT0FBTyxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUVwQyxJQUFJLEdBQVEsQ0FBQztJQUViLElBQUksQ0FBQztRQUNILEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUV2QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLEdBQXVCO0lBSXpELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUVoRixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBRTdCLE1BQU0sT0FBTyxHQUFHLEdBQUc7U0FDaEIsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFakMsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsSUFBSSxVQUFVLEtBQUssSUFBSTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLGFBQWlDLEVBQUUsU0FBbUI7SUFDbEYsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELElBQUksVUFBVSxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV0QyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDeEUsQ0FBQyJ9
|
|
@@ -7,10 +7,11 @@ function createPerKeyOriginMiddleware() {
|
|
|
7
7
|
return async function perKeyOriginMiddleware(ctx, next) {
|
|
8
8
|
const identity = ctx.state.apiKeyIdentity;
|
|
9
9
|
const allowedOrigins = identity?.allowedOrigins ?? [];
|
|
10
|
-
|
|
10
|
+
const origin = ctx.get('Origin');
|
|
11
|
+
if (allowedOrigins.length > 0 && (0, origin_1.hasOrigin)(origin) && !(0, origin_1.originAllowed)(origin, allowedOrigins)) {
|
|
11
12
|
throw (0, bff_http_error_1.originNotAllowed)();
|
|
12
13
|
}
|
|
13
14
|
await next();
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyLWtleS1vcmlnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29ycy9wZXIta2V5LW9yaWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLCtDQVlDO0FBZkQscUNBQW9EO0FBQ3BELDJEQUEwRDtBQUUxRCxTQUF3Qiw0QkFBNEI7SUFDbEQsT0FBTyxLQUFLLFVBQVUsc0JBQXNCLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDcEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUEyRCxDQUFDO1FBQ3ZGLE1BQU0sY0FBYyxHQUFHLFFBQVEsRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFBLGtCQUFTLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFBLHNCQUFhLEVBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDN0YsTUFBTSxJQUFBLGlDQUFnQixHQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -1,42 +1,29 @@
|
|
|
1
|
+
import type { PageInput, SortClauseInput } from './request-schemas';
|
|
2
|
+
import type { Logger } from '../ports/logger-port';
|
|
3
|
+
import type { z } from 'zod';
|
|
4
|
+
import { CountFlatInputs, ListFlatInputs, RelationCountFlatInputs, RelationListFlatInputs } from './request-schemas';
|
|
1
5
|
import { MAX_FILTER_DEPTH } from '../validation/capabilities-validator';
|
|
2
6
|
export { MAX_FILTER_DEPTH as MAX_PARSED_FILTER_DEPTH };
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
limit: number;
|
|
9
|
-
offset: number;
|
|
10
|
-
}
|
|
11
|
-
export interface ListRequestBody {
|
|
12
|
-
filter?: unknown;
|
|
13
|
-
projection?: string[];
|
|
14
|
-
sort?: BffSortClause[];
|
|
15
|
-
page?: BffPage;
|
|
16
|
-
search?: string;
|
|
17
|
-
searchExtended?: boolean;
|
|
18
|
-
}
|
|
19
|
-
export interface CountRequestBody {
|
|
20
|
-
filter?: unknown;
|
|
21
|
-
search?: string;
|
|
22
|
-
searchExtended?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export type RelationListRequestBody = ListRequestBody & {
|
|
7
|
+
export type BffSortClause = z.infer<typeof SortClauseInput>;
|
|
8
|
+
export type BffPage = z.infer<typeof PageInput>;
|
|
9
|
+
export type ListRequestBody = z.infer<typeof ListFlatInputs>;
|
|
10
|
+
export type CountRequestBody = z.infer<typeof CountFlatInputs>;
|
|
11
|
+
export type RelationListRequestBody = z.infer<typeof RelationListFlatInputs> & {
|
|
25
12
|
parentId: string;
|
|
26
13
|
};
|
|
27
|
-
export type RelationCountRequestBody =
|
|
14
|
+
export type RelationCountRequestBody = z.infer<typeof RelationCountFlatInputs> & {
|
|
28
15
|
parentId: string;
|
|
29
16
|
};
|
|
30
17
|
export type AgentQuery = Record<string, unknown> & {
|
|
31
18
|
timezone: string;
|
|
32
19
|
};
|
|
33
|
-
export declare function parseListRequest(body: unknown): ListRequestBody;
|
|
34
|
-
export declare function parseCountRequest(body: unknown): CountRequestBody;
|
|
20
|
+
export declare function parseListRequest(body: unknown, logger: Logger): ListRequestBody;
|
|
21
|
+
export declare function parseCountRequest(body: unknown, logger: Logger): CountRequestBody;
|
|
35
22
|
export declare function buildListAgentQuery(collection: string, timezone: string, body: ListRequestBody): AgentQuery;
|
|
36
23
|
export declare function buildCountAgentQuery(timezone: string, body: CountRequestBody): AgentQuery;
|
|
37
24
|
export declare function collectListFieldPaths(body: ListRequestBody): string[];
|
|
38
|
-
export declare function parseParentId(parentId: unknown): string;
|
|
39
|
-
export declare function parseRelationListRequest(body: unknown): RelationListRequestBody;
|
|
40
|
-
export declare function parseRelationCountRequest(body: unknown): RelationCountRequestBody;
|
|
25
|
+
export declare function parseParentId(parentId: unknown, logger: Logger): string;
|
|
26
|
+
export declare function parseRelationListRequest(body: unknown, logger: Logger): RelationListRequestBody;
|
|
27
|
+
export declare function parseRelationCountRequest(body: unknown, logger: Logger): RelationCountRequestBody;
|
|
41
28
|
export declare function collectCountFieldPaths(body: CountRequestBody): string[];
|
|
42
29
|
//# sourceMappingURL=agent-query.d.ts.map
|
package/dist/data/agent-query.js
CHANGED
|
@@ -11,6 +11,7 @@ exports.parseRelationListRequest = parseRelationListRequest;
|
|
|
11
11
|
exports.parseRelationCountRequest = parseRelationCountRequest;
|
|
12
12
|
exports.collectCountFieldPaths = collectCountFieldPaths;
|
|
13
13
|
const request_schemas_1 = require("./request-schemas");
|
|
14
|
+
const bff_http_error_1 = require("../http/bff-http-error");
|
|
14
15
|
const bff_local_errors_1 = require("../http/bff-local-errors");
|
|
15
16
|
const capabilities_validator_1 = require("../validation/capabilities-validator");
|
|
16
17
|
Object.defineProperty(exports, "MAX_PARSED_FILTER_DEPTH", { enumerable: true, get: function () { return capabilities_validator_1.MAX_FILTER_DEPTH; } });
|
|
@@ -18,55 +19,80 @@ const validation_errors_1 = require("../validation/validation-errors");
|
|
|
18
19
|
function isPlainObject(value) {
|
|
19
20
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
+
const LEAF_KEYS = ['field', 'operator', 'value'];
|
|
23
|
+
const BRANCH_KEYS = ['aggregator', 'conditions'];
|
|
24
|
+
function loggingRejections(logger, parse) {
|
|
25
|
+
try {
|
|
26
|
+
return parse();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error instanceof bff_http_error_1.BffHttpError) {
|
|
30
|
+
logger('Warn', 'Request body rejected', { reason: error.message });
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// The tree is closed like the flat body is: a leaf carrying `valu` instead of `value` builds a
|
|
36
|
+
// condition with `value: undefined`, which the agent reads as null and runs — a typo must not
|
|
37
|
+
// silently change the returned rows.
|
|
38
|
+
function assertNoStrayKey(node, allowed) {
|
|
39
|
+
const stray = Object.keys(node).find(key => !allowed.includes(key));
|
|
40
|
+
if (stray !== undefined) {
|
|
41
|
+
throw (0, bff_local_errors_1.invalidRequest)(`A filter node cannot carry "${stray}"`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function assertFilterNode(node, depth = 0) {
|
|
22
45
|
if (depth > capabilities_validator_1.MAX_FILTER_DEPTH)
|
|
23
46
|
throw (0, validation_errors_1.filterTooDeep)(capabilities_validator_1.MAX_FILTER_DEPTH);
|
|
24
|
-
if (
|
|
47
|
+
if (!isPlainObject(node))
|
|
25
48
|
return;
|
|
26
49
|
const readableAsBranch = (0, capabilities_validator_1.isBranch)(node);
|
|
27
50
|
if ((0, capabilities_validator_1.isLeaf)(node) && readableAsBranch) {
|
|
28
51
|
throw (0, bff_local_errors_1.invalidRequest)('A filter node cannot carry both "field" and "conditions"');
|
|
29
52
|
}
|
|
30
53
|
if (readableAsBranch) {
|
|
31
|
-
node
|
|
54
|
+
assertNoStrayKey(node, BRANCH_KEYS);
|
|
55
|
+
node.conditions.forEach(condition => assertFilterNode(condition, depth + 1));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if ((0, capabilities_validator_1.isLeaf)(node)) {
|
|
59
|
+
assertNoStrayKey(node, LEAF_KEYS);
|
|
60
|
+
return;
|
|
32
61
|
}
|
|
62
|
+
// Neither readable as a leaf nor as a branch: `feild` instead of `field` reaches the agent as a
|
|
63
|
+
// node it cannot act on. An empty object stays allowed — it is how an absent filter is spelled.
|
|
64
|
+
assertNoStrayKey(node, []);
|
|
33
65
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Checks the flat inputs against the shared schema and reports the first failure as
|
|
36
|
-
* 400 invalid_request, so a malformed shape (`projection` as a string, a fractional `page.limit`)
|
|
37
|
-
* surfaces as a client error rather than a 500 from an array method blowing up downstream.
|
|
38
|
-
*
|
|
39
|
-
* Unknown keys are left alone: the object schemas ignore them, so `filter`, `timezone` and
|
|
40
|
-
* `parentId` travel through untouched and the body is returned by reference, not rebuilt.
|
|
41
|
-
*/
|
|
42
66
|
function assertFlatInputs(schema, body) {
|
|
43
67
|
const result = schema.safeParse(body);
|
|
44
68
|
if (result.success)
|
|
45
69
|
return;
|
|
46
|
-
const
|
|
70
|
+
const { issues } = result.error;
|
|
71
|
+
const issue = issues.find(candidate => candidate.code === 'unrecognized_keys') ?? issues[0];
|
|
47
72
|
const path = issue.path.join('.');
|
|
48
|
-
|
|
73
|
+
const reason = path ? `${path}: ${issue.message}` : issue.message;
|
|
74
|
+
throw (0, bff_local_errors_1.invalidRequest)(reason);
|
|
49
75
|
}
|
|
50
76
|
function assertFilter(filter) {
|
|
51
77
|
if (filter === undefined)
|
|
52
78
|
return;
|
|
53
79
|
if (!isPlainObject(filter))
|
|
54
80
|
throw (0, bff_local_errors_1.invalidRequest)('filter must be an object');
|
|
55
|
-
|
|
81
|
+
assertFilterNode(filter);
|
|
56
82
|
}
|
|
57
|
-
function
|
|
58
|
-
if (!isPlainObject(body))
|
|
83
|
+
function parseRequest(schema, body) {
|
|
84
|
+
if (!isPlainObject(body)) {
|
|
59
85
|
throw (0, bff_local_errors_1.invalidRequest)('Request body must be an object');
|
|
60
|
-
|
|
86
|
+
}
|
|
87
|
+
assertFlatInputs(schema, body);
|
|
61
88
|
assertFilter(body.filter);
|
|
62
89
|
return body;
|
|
63
90
|
}
|
|
64
|
-
function
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return body;
|
|
91
|
+
function parseListRequest(body, logger) {
|
|
92
|
+
return loggingRejections(logger, () => parseRequest(request_schemas_1.ListFlatInputs, body));
|
|
93
|
+
}
|
|
94
|
+
function parseCountRequest(body, logger) {
|
|
95
|
+
return loggingRejections(logger, () => parseRequest(request_schemas_1.CountFlatInputs, body));
|
|
70
96
|
}
|
|
71
97
|
function collectFilterFields(filter, acc) {
|
|
72
98
|
if ((0, capabilities_validator_1.isBranch)(filter)) {
|
|
@@ -79,9 +105,6 @@ function collectFilterFields(filter, acc) {
|
|
|
79
105
|
function serializeSort(sort) {
|
|
80
106
|
return sort.map(({ field, direction }) => (direction === 'desc' ? `-${field}` : field)).join(',');
|
|
81
107
|
}
|
|
82
|
-
// `parseListRequest` guarantees `limit` > 0 and `offset` >= 0 are integers; this only enforces the
|
|
83
|
-
// page-model rule. The agent paginates by page number/size, so an arbitrary offset that is not a
|
|
84
|
-
// whole multiple of the limit cannot be expressed — reject it rather than return a shifted window.
|
|
85
108
|
function serializePage(page) {
|
|
86
109
|
const { limit, offset } = page;
|
|
87
110
|
if (offset % limit !== 0) {
|
|
@@ -140,10 +163,11 @@ function collectListFieldPaths(body) {
|
|
|
140
163
|
// The parent record id is opaque: a packed/composite id must survive unchanged, so its content is
|
|
141
164
|
// never inspected — only presence and primitive type. A finite number (single numeric pk) is
|
|
142
165
|
// coerced to string; anything else is a BFF-local 400 with no agent call.
|
|
143
|
-
function
|
|
166
|
+
function readParentId(parentId) {
|
|
144
167
|
if (typeof parentId === 'string') {
|
|
145
|
-
if (parentId.trim() === '')
|
|
168
|
+
if (parentId.trim() === '') {
|
|
146
169
|
throw (0, bff_local_errors_1.invalidRequest)('parentId must not be empty');
|
|
170
|
+
}
|
|
147
171
|
return parentId;
|
|
148
172
|
}
|
|
149
173
|
if (typeof parentId === 'number' && Number.isFinite(parentId)) {
|
|
@@ -151,17 +175,24 @@ function parseParentId(parentId) {
|
|
|
151
175
|
}
|
|
152
176
|
throw (0, bff_local_errors_1.invalidRequest)('parentId is required and must be a non-empty string or a number');
|
|
153
177
|
}
|
|
154
|
-
function
|
|
155
|
-
|
|
156
|
-
|
|
178
|
+
function parseParentId(parentId, logger) {
|
|
179
|
+
return loggingRejections(logger, () => readParentId(parentId));
|
|
180
|
+
}
|
|
181
|
+
function parseRelationRequest(schema, body, logger) {
|
|
182
|
+
return loggingRejections(logger, () => {
|
|
183
|
+
const parentId = readParentId(body?.parentId);
|
|
184
|
+
return { ...parseRequest(schema, body), parentId };
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function parseRelationListRequest(body, logger) {
|
|
188
|
+
return parseRelationRequest(request_schemas_1.RelationListFlatInputs, body, logger);
|
|
157
189
|
}
|
|
158
|
-
function parseRelationCountRequest(body) {
|
|
159
|
-
|
|
160
|
-
return { ...parseCountRequest(body), parentId };
|
|
190
|
+
function parseRelationCountRequest(body, logger) {
|
|
191
|
+
return parseRelationRequest(request_schemas_1.RelationCountFlatInputs, body, logger);
|
|
161
192
|
}
|
|
162
193
|
function collectCountFieldPaths(body) {
|
|
163
194
|
const paths = [];
|
|
164
195
|
collectFilterFields(body.filter, paths);
|
|
165
196
|
return paths;
|
|
166
197
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS9hZ2VudC1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5SEEsNENBRUM7QUFFRCw4Q0FFQztBQWlERCxrREFjQztBQUVELG9EQU9DO0FBRUQsc0RBTUM7QUFxQkQsc0NBRUM7QUFVRCw0REFFQztBQUVELDhEQUVDO0FBRUQsd0RBS0M7QUF6UEQsdURBSzJCO0FBQzNCLDJEQUFzRDtBQUN0RCwrREFBMEQ7QUFDMUQsaUZBQTBGO0FBRzdELHdHQUhwQix5Q0FBZ0IsT0FHMkI7QUFGcEQsdUVBQWdFO0FBb0JoRSxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFFakQsU0FBUyxpQkFBaUIsQ0FBSSxNQUFjLEVBQUUsS0FBYztJQUMxRCxJQUFJLENBQUM7UUFDSCxPQUFPLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksNkJBQVksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsOEZBQThGO0FBQzlGLHFDQUFxQztBQUNyQyxTQUFTLGdCQUFn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
|