@forestadmin/agent-bff 1.16.0 → 1.18.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.
Files changed (41) hide show
  1. package/README.md +15 -1
  2. package/dist/action/action-form-mapper.d.ts +2 -1
  3. package/dist/action/action-form-mapper.js +1 -1
  4. package/dist/action/agent-action-client.d.ts +2 -1
  5. package/dist/action/agent-action-client.js +1 -1
  6. package/dist/cli-core.d.ts +3 -0
  7. package/dist/cli-core.js +52 -10
  8. package/dist/cli-dispatch.d.ts +8 -2
  9. package/dist/cli-dispatch.js +90 -9
  10. package/dist/data/data-routes-middleware.js +3 -12
  11. package/dist/data/pack-id.d.ts +1 -0
  12. package/dist/data/pack-id.js +4 -3
  13. package/dist/openapi/collect-unfolding.d.ts +23 -0
  14. package/dist/openapi/collect-unfolding.js +144 -0
  15. package/dist/openapi/component-pool.d.ts +18 -0
  16. package/dist/openapi/component-pool.js +28 -0
  17. package/dist/openapi/field-schemas.d.ts +9 -0
  18. package/dist/openapi/field-schemas.js +43 -0
  19. package/dist/openapi/names.d.ts +16 -0
  20. package/dist/openapi/names.js +28 -0
  21. package/dist/openapi/openapi-document.d.ts +2 -1
  22. package/dist/openapi/openapi-document.js +112 -66
  23. package/dist/openapi/openapi-routes.d.ts +4 -1
  24. package/dist/openapi/openapi-routes.js +46 -9
  25. package/dist/openapi/schemas.d.ts +14 -1
  26. package/dist/openapi/schemas.js +11 -10
  27. package/dist/openapi/unfolded-document.d.ts +28 -0
  28. package/dist/openapi/unfolded-document.js +52 -0
  29. package/dist/openapi/unfolded-paths.d.ts +20 -0
  30. package/dist/openapi/unfolded-paths.js +408 -0
  31. package/dist/openapi/unfolding.d.ts +66 -0
  32. package/dist/openapi/unfolding.js +17 -0
  33. package/dist/read-model/agent-capabilities-fetcher.d.ts +8 -3
  34. package/dist/read-model/agent-capabilities-fetcher.js +15 -7
  35. package/dist/read-model/capabilities-cache.d.ts +11 -1
  36. package/dist/read-model/capabilities-cache.js +1 -1
  37. package/dist/read-model/read-model.d.ts +14 -0
  38. package/dist/read-model/read-model.js +36 -2
  39. package/dist/validation/operator-normalizer.d.ts +6 -0
  40. package/dist/validation/operator-normalizer.js +11 -1
  41. package/package.json +4 -4
package/README.md CHANGED
@@ -25,6 +25,20 @@ forest-bff openapi --output # writes ./openapi.json
25
25
  forest-bff openapi --output docs/api.json # writes that path
26
26
  ```
27
27
 
28
+ The document comes in two forms, and the command picks one from the environment:
29
+
30
+ - **Unfolded** when `FOREST_SERVER_URL`, `FOREST_ENV_SECRET`, `FOREST_AUTH_SECRET` and `AGENT_URL`
31
+ are all set: one path per exposed collection, per to-many relation and per action, each carrying
32
+ the collection's real field set. This is the form to generate a client from. The command reads the
33
+ Forest schema and asks the agent for each collection's capabilities, signing its own short-lived
34
+ agent token with `FOREST_AUTH_SECRET`. A deployment configured this way but whose schema cannot be
35
+ read exits 1 rather than emitting the generic document, which would look like a complete answer.
36
+ - **Generic** when that configuration is absent: the six runtime routes with `{collection}`,
37
+ `{relation}` and `{action}` as path parameters and no field enumerated. `info.description` says
38
+ which form the document is.
39
+
40
+ Either way the runtime routes stay generic — only the document unfolds.
41
+
28
42
  `--output` takes the next argument as the destination unless it is empty or starts with
29
43
  `-`; the default `openapi.json` is written only when `--output` is the last argument, and
30
44
  a leftover token is rejected like any other extra. A missing parent directory is created,
@@ -58,7 +72,7 @@ yarn start:dev # node --env-file=.env dist/cli.js
58
72
  | `HTTP_PORT` | no | Server port, integer 0–65535. Defaults to `3450`. `0` binds an OS-assigned ephemeral port. |
59
73
  | `BFF_ALLOWED_ORIGINS`| no | Comma-separated CORS allow-list of exact origins (scheme + host + port). No wildcard. Empty ⇒ no cross-origin browser access. |
60
74
  | `BFF_DEFAULT_TIMEZONE`| no | Fallback IANA timezone used when a request carries neither an `X-Forest-Timezone` header nor a body `timezone`. |
61
- | `BFF_OPENAPI_ENABLED` | no | Serve `GET/HEAD /agent/openapi.json` (auth-gated) when `true`. Defaults to `true`. Set to `false` for customers who do not want the HTTP surface exposed: an authenticated `GET`/`HEAD` then gets `404 openapi_disabled`, other methods fall through to the agent routes exactly as they do when enabled, and `forest-bff openapi` keeps working either way. Accepted values: `true`/`false`. |
75
+ | `BFF_OPENAPI_ENABLED` | no | Serve `GET/HEAD /agent/openapi.json` (auth-gated) when `true`. Defaults to `true`. Set to `false` for customers who do not want the HTTP surface exposed: an authenticated `GET`/`HEAD` then gets `404 openapi_disabled`, other methods fall through to the agent routes exactly as they do when enabled, and `forest-bff openapi` keeps working either way. Accepted values: `true`/`false`. **The served document is unfolded and is not filtered per caller**: any authenticated caller, whatever their role, reads the name of every exposed collection, relation and field. Set this to `false` if that surface must not be reachable over HTTP. |
62
76
 
63
77
  ### Config validation
64
78
 
@@ -2,7 +2,8 @@ import type { ActionForm } from './agent-action-client';
2
2
  import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
3
3
  export interface ActionFormFieldResponse {
4
4
  name: string;
5
- type: string;
5
+ /** Verbatim from the agent, so a list type is `['String']` rather than `'StringList'`. */
6
+ type: string | [string];
6
7
  value: unknown;
7
8
  isRequired: boolean;
8
9
  enumValues?: string[] | null;
@@ -30,4 +30,4 @@ function mapActionForm(action, skippedFields, layout) {
30
30
  layout,
31
31
  };
32
32
  }
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWZvcm0tbWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbi9hY3Rpb24tZm9ybS1tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1QkEsc0NBaUNDO0FBckRELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztBQWtCekIsa0dBQWtHO0FBQ2xHLDhGQUE4RjtBQUM5RixTQUFnQixhQUFhLENBQzNCLE1BQWtCLEVBQ2xCLGFBQXVCLEVBQ3ZCLE1BQTZDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUVsQyxNQUFNLGNBQWMsR0FBRyxNQUFNO1NBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUM7U0FDNUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFakMsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxHQUE0QjtnQkFDcEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxLQUFLO2FBQ3hDLENBQUM7WUFFRixxRUFBcUU7WUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1RixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDRixVQUFVLEVBQUUsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQ3ZDLGNBQWM7UUFDZCxhQUFhO1FBQ2IsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIn0=
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWZvcm0tbWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbi9hY3Rpb24tZm9ybS1tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3QkEsc0NBaUNDO0FBdERELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztBQW1CekIsa0dBQWtHO0FBQ2xHLDhGQUE4RjtBQUM5RixTQUFnQixhQUFhLENBQzNCLE1BQWtCLEVBQ2xCLGFBQXVCLEVBQ3ZCLE1BQTZDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUVsQyxNQUFNLGNBQWMsR0FBRyxNQUFNO1NBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUM7U0FDNUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFakMsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxHQUE0QjtnQkFDcEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxLQUFLO2FBQ3hDLENBQUM7WUFFRixxRUFBcUU7WUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1RixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDRixVQUFVLEVBQUUsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQ3ZDLGNBQWM7UUFDZCxhQUFhO1FBQ2IsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIn0=
@@ -2,7 +2,8 @@ import type { ActionEndpointsByCollection } from '@forestadmin/agent-client';
2
2
  import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
3
3
  export interface ActionFormField {
4
4
  getName(): string;
5
- getType(): string;
5
+ /** A list type is the array the agent sent, `['String']`, not `'StringList'`. */
6
+ getType(): string | [string];
6
7
  getValue(): unknown;
7
8
  isRequired(): boolean | undefined;
8
9
  }
@@ -32,4 +32,4 @@ function createAgentActionClient({ agentUrl, token, actionEndpoints, timeoutMs,
32
32
  loadAction: (collection, action, recordIds) => client.collection(collection).action(action, { recordIds }),
33
33
  };
34
34
  }
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtYWN0aW9uLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb24vYWdlbnQtYWN0aW9uLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQThDQSw0Q0FJQztBQU9ELDBDQWlCQztBQXZFRCw0REFBb0U7QUFFcEUsdUdBQTRFO0FBb0M1RSxtR0FBbUc7QUFDbkcscUdBQXFHO0FBQ3JHLGdHQUFnRztBQUNoRyxrR0FBa0c7QUFDbEcsMEZBQTBGO0FBQzFGLFNBQWdCLGdCQUFnQixDQUFDLE1BQWtCO0lBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQXdELENBQUM7SUFFdEYsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQXdCLHVCQUF1QixDQUFDLEVBQzlDLFFBQVEsRUFDUixLQUFLLEVBQ0wsZUFBZSxFQUNmLFNBQVMsR0FDZ0I7SUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBQSxzQ0FBdUIsRUFBQztRQUNyQyxHQUFHLEVBQUUsUUFBUTtRQUNiLEtBQUs7UUFDTCxlQUFlO1FBQ2YsYUFBYSxFQUFFLElBQUEscUNBQXdCLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7S0FDcEUsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FDNUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7S0FDOUQsQ0FBQztBQUNKLENBQUMifQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtYWN0aW9uLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb24vYWdlbnQtYWN0aW9uLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQStDQSw0Q0FJQztBQU9ELDBDQWlCQztBQXhFRCw0REFBb0U7QUFFcEUsdUdBQTRFO0FBcUM1RSxtR0FBbUc7QUFDbkcscUdBQXFHO0FBQ3JHLGdHQUFnRztBQUNoRyxrR0FBa0c7QUFDbEcsMEZBQTBGO0FBQzFGLFNBQWdCLGdCQUFnQixDQUFDLE1BQWtCO0lBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQXdELENBQUM7SUFFdEYsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQXdCLHVCQUF1QixDQUFDLEVBQzlDLFFBQVEsRUFDUixLQUFLLEVBQ0wsZUFBZSxFQUNmLFNBQVMsR0FDZ0I7SUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBQSxzQ0FBdUIsRUFBQztRQUNyQyxHQUFHLEVBQUUsUUFBUTtRQUNiLEtBQUs7UUFDTCxlQUFlO1FBQ2YsYUFBYSxFQUFFLElBQUEscUNBQXdCLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7S0FDcEUsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FDNUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7S0FDOUQsQ0FBQztBQUNKLENBQUMifQ==
@@ -1,5 +1,8 @@
1
+ import type { BFFConfig } from './config/env-config';
2
+ import type { UnfoldSource } from './openapi/unfolded-document';
1
3
  import type { Logger } from './ports/logger-port';
2
4
  import BFFHttpServer from './http/bff-http-server';
5
+ export declare function resolveUnfoldSource(config: BFFConfig, logger: Logger): UnfoldSource | undefined;
3
6
  export default function runCli(env: NodeJS.ProcessEnv, logger?: Logger): Promise<BFFHttpServer>;
4
7
  export declare function reportFatalError(err: unknown): void;
5
8
  //# sourceMappingURL=cli-core.d.ts.map
package/dist/cli-core.js CHANGED
@@ -3,6 +3,7 @@ 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.resolveUnfoldSource = resolveUnfoldSource;
6
7
  exports.default = runCli;
7
8
  exports.reportFatalError = reportFatalError;
8
9
  const bodyparser_1 = require("@koa/bodyparser");
@@ -116,19 +117,56 @@ function buildApiKeyMiddleware(config, logger) {
116
117
  });
117
118
  return (0, api_key_middleware_1.default)({ authenticator, logger });
118
119
  }
119
- // Data and action routes share one read-model store (a single cache, a single schema fetch). The
120
- // data middleware falls through to the action middleware on a non-data path.
121
- function buildAgentRouteMiddlewares(config, logger) {
120
+ /**
121
+ * The read-model store the data routes, the action routes, the permissions endpoint and the OpenAPI
122
+ * unfolding all share — one cache, one schema fetch. Needs no agent: the permissions endpoint and the
123
+ * schema itself come from the SaaS.
124
+ */
125
+ function resolveReadModelBundle(config, logger, metrics) {
122
126
  const apiKeyConfig = resolveApiKeyConfig(config);
123
- if (!apiKeyConfig) {
124
- logger('Warn', 'Data, action and permissions endpoints disabled: FOREST_SERVER_URL, FOREST_ENV_SECRET or FOREST_AUTH_SECRET is missing');
125
- return [(0, agent_stub_1.default)()];
126
- }
127
+ if (!apiKeyConfig)
128
+ return undefined;
127
129
  const { store } = (0, create_read_model_1.default)({
128
130
  forestServerUrl: apiKeyConfig.forestServerUrl,
129
131
  envSecret: apiKeyConfig.forestEnvSecret,
130
132
  logger,
133
+ metrics,
131
134
  });
135
+ return { store, apiKeyConfig };
136
+ }
137
+ /**
138
+ * When unfolding is possible, in ONE place: the document needs the AGENT_URL the store does not,
139
+ * because a collection's field set comes from the agent capabilities. The server passes the bundle it
140
+ * already built for the data routes; the CLI goes through `resolveUnfoldSource`. Silent on purpose —
141
+ * the two report a missing configuration differently.
142
+ */
143
+ function toUnfoldSource(bundle, config, logger) {
144
+ if (!bundle || !config.agentUrl)
145
+ return undefined;
146
+ return {
147
+ store: bundle.store,
148
+ agentUrl: config.agentUrl,
149
+ timeoutMs: config.agentTimeoutMs,
150
+ logger,
151
+ };
152
+ }
153
+ /**
154
+ * Metrics are dropped rather than logged: without an explicit sink `createReadModel` builds a console
155
+ * one, which reports gauges at `Info`, and `createConsoleLogger` sends `Info` to `console.info` — the
156
+ * stdout the document is written to. The server keeps its metrics; the export has no sink for them
157
+ * anyway.
158
+ */
159
+ const UNMEASURED = { increment: () => undefined, gauge: () => undefined };
160
+ function resolveUnfoldSource(config, logger) {
161
+ return toUnfoldSource(resolveReadModelBundle(config, logger, UNMEASURED), config, logger);
162
+ }
163
+ // The data middleware falls through to the action middleware on a non-data path.
164
+ function buildAgentRouteMiddlewares(bundle, config, logger) {
165
+ if (!bundle) {
166
+ logger('Warn', 'Data, action and permissions endpoints disabled: FOREST_SERVER_URL, FOREST_ENV_SECRET or FOREST_AUTH_SECRET is missing');
167
+ return [(0, agent_stub_1.default)()];
168
+ }
169
+ const { store, apiKeyConfig } = bundle;
132
170
  const { agentUrl, agentTimeoutMs: timeoutMs } = config;
133
171
  const permissionsMiddleware = (0, permissions_routes_middleware_1.default)({
134
172
  store,
@@ -156,13 +194,17 @@ function buildAgentMiddlewares(config, logger) {
156
194
  return [];
157
195
  }
158
196
  const apiKeyStep = buildApiKeyMiddleware(config, logger) ?? createApiKeyUnavailableGuard(logger);
197
+ // One store for the whole edge. The document only unfolds when the agent is reachable too: with no
198
+ // AGENT_URL every data path answers 501, so concrete paths would advertise a dead surface.
199
+ const bundle = resolveReadModelBundle(config, logger);
200
+ const source = toUnfoldSource(bundle, config, logger);
159
201
  const chain = [
160
202
  (0, auth_mode_middleware_1.default)({ authSecret: forestAuthSecret }),
161
203
  apiKeyStep,
162
204
  (0, per_key_origin_1.default)(),
163
- (0, openapi_routes_1.default)({ version: version_1.default, enabled: config.openapiEnabled }),
205
+ (0, openapi_routes_1.default)({ version: version_1.default, enabled: config.openapiEnabled, source }),
164
206
  (0, timezone_middleware_1.default)({ defaultTimezone }),
165
- ...buildAgentRouteMiddlewares(config, logger),
207
+ ...buildAgentRouteMiddlewares(bundle, config, logger),
166
208
  ];
167
209
  return chain.map(agentScoped);
168
210
  }
@@ -197,4 +239,4 @@ function reportFatalError(err) {
197
239
  process.stderr.write(`Error: ${(0, errors_1.extractErrorMessage)(err)}\n`);
198
240
  process.exitCode = 1;
199
241
  }
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvT0EseUJBa0NDO0FBRUQsNENBR0M7QUF2UUQsZ0RBQTZDO0FBRTdDLGlHQUE2RTtBQUM3RSwrRUFBNEQ7QUFDNUQsb0VBQTJEO0FBQzNELDRGQUF3RTtBQUN4RSw4RUFBb0Q7QUFDcEQsc0ZBQWtFO0FBQ2xFLDRFQUF5RDtBQUN6RCx1RkFBbUU7QUFDbkUsb0RBQWtEO0FBQ2xELDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFDQUErQztBQUMvQywwREFBcUQ7QUFDckQsNkVBQW1EO0FBQ25ELG1FQUEyQztBQUMzQywrRUFBNEQ7QUFDNUQsd0ZBQThEO0FBQzlELHdFQUFxRDtBQUNyRCwwRUFBK0Q7QUFDL0Qsd0VBQXFEO0FBQ3JELDhFQUEyRDtBQUMzRCx3RkFBK0Q7QUFDL0QsMEZBQWlFO0FBQ2pFLGdIQUE0RjtBQUM1Rix1RkFBNkQ7QUFDN0QseUZBQXNFO0FBQ3RFLHdEQUFnQztBQUVoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpDLFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFVBQXNCO0lBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDLENB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
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE4TkEsa0RBRUM7QUFzRUQseUJBa0NDO0FBRUQsNENBR0M7QUF0VUQsZ0RBQTZDO0FBRTdDLGlHQUE2RTtBQUM3RSwrRUFBNEQ7QUFDNUQsb0VBQTJEO0FBQzNELDRGQUF3RTtBQUN4RSw4RUFBb0Q7QUFDcEQsc0ZBQWtFO0FBQ2xFLDRFQUF5RDtBQUN6RCx1RkFBbUU7QUFDbkUsb0RBQWtEO0FBQ2xELDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFDQUErQztBQUMvQywwREFBcUQ7QUFDckQsNkVBQW1EO0FBQ25ELG1FQUEyQztBQUMzQywrRUFBNEQ7QUFDNUQsd0ZBQThEO0FBQzlELHdFQUFxRDtBQUNyRCwwRUFBK0Q7QUFDL0Qsd0VBQXFEO0FBQ3JELDhFQUEyRDtBQUMzRCx3RkFBK0Q7QUFDL0QsMEZBQWlFO0FBQ2pFLGdIQUE0RjtBQUM1Rix1RkFBNkQ7QUFDN0QseUZBQXNFO0FBQ3RFLHdEQUFnQztBQUVoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpDLFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFVBQXNCO0lBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJ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
@@ -1,12 +1,18 @@
1
1
  import type BFFHttpServer from './http/bff-http-server';
2
2
  import type { Logger } from './ports/logger-port';
3
3
  export declare const DEFAULT_OUTPUT_FILE = "openapi.json";
4
- export declare const USAGE = "Usage: forest-bff [command]\n\nCommands:\n (none) Start the BFF server, configured from the environment.\n openapi Write the OpenAPI document to stdout. Needs no configuration.\n --output [file] Write to a file instead of stdout, defaulting\n to openapi.json in the current directory.\n\nOptions:\n -h, --help Show this help and exit.\n -v, --version Show the package version and exit.";
4
+ export declare const USAGE = "Usage: forest-bff [command]\n\nCommands:\n (none) Start the BFF server, configured from the environment.\n openapi Write the OpenAPI document to stdout. Needs no configuration, but\n a deployment configured to reach its Forest schema and its agent\n (FOREST_SERVER_URL, FOREST_ENV_SECRET, FOREST_AUTH_SECRET,\n AGENT_URL) unfolds one path per collection, relation and action\n instead of the generic ones.\n --output [file] Write to a file instead of stdout, defaulting\n to openapi.json in the current directory.\n\nOptions:\n -h, --help Show this help and exit.\n -v, --version Show the package version and exit.";
5
5
  export declare const HINT = "Run 'forest-bff --help' for usage.";
6
6
  export interface DispatchOutcome {
7
7
  exitCode: number;
8
8
  server?: BFFHttpServer;
9
9
  }
10
- export declare function renderOpenApi(): string;
10
+ /**
11
+ * Unfolds when the deployment is configured to be inspected, and emits the generic document when it
12
+ * is not configured at all — the command keeps working without configuration. A deployment that IS
13
+ * configured but whose schema cannot be read fails instead of quietly degrading: it asked for the
14
+ * unfolded document, and a generic one would look like a complete answer.
15
+ */
16
+ export declare function renderOpenApi(env: NodeJS.ProcessEnv, logger: Logger): Promise<string>;
11
17
  export default function dispatchCli(argv: string[], env: NodeJS.ProcessEnv, logger?: Logger): Promise<DispatchOutcome>;
12
18
  //# sourceMappingURL=cli-dispatch.d.ts.map
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -8,9 +41,13 @@ exports.renderOpenApi = renderOpenApi;
8
41
  exports.default = dispatchCli;
9
42
  const fs_1 = require("fs");
10
43
  const path_1 = __importDefault(require("path"));
11
- const cli_core_1 = __importDefault(require("./cli-core"));
44
+ const console_logger_1 = __importDefault(require("./adapters/console-logger"));
45
+ const cli_core_1 = __importStar(require("./cli-core"));
46
+ const env_config_1 = require("./config/env-config");
12
47
  const errors_1 = require("./errors");
13
48
  const openapi_document_1 = require("./openapi/openapi-document");
49
+ const unfolded_document_1 = __importStar(require("./openapi/unfolded-document"));
50
+ const unfolding_1 = require("./openapi/unfolding");
14
51
  const version_1 = __importDefault(require("./version"));
15
52
  exports.DEFAULT_OUTPUT_FILE = 'openapi.json';
16
53
  const OUTPUT_FLAG = '--output';
@@ -18,7 +55,11 @@ exports.USAGE = `Usage: forest-bff [command]
18
55
 
19
56
  Commands:
20
57
  (none) Start the BFF server, configured from the environment.
21
- openapi Write the OpenAPI document to stdout. Needs no configuration.
58
+ openapi Write the OpenAPI document to stdout. Needs no configuration, but
59
+ a deployment configured to reach its Forest schema and its agent
60
+ (FOREST_SERVER_URL, FOREST_ENV_SECRET, FOREST_AUTH_SECRET,
61
+ AGENT_URL) unfolds one path per collection, relation and action
62
+ instead of the generic ones.
22
63
  --output [file] Write to a file instead of stdout, defaulting
23
64
  to ${exports.DEFAULT_OUTPUT_FILE} in the current directory.
24
65
 
@@ -28,8 +69,47 @@ Options:
28
69
  exports.HINT = "Run 'forest-bff --help' for usage.";
29
70
  const HELP_FLAGS = new Set(['-h', '--help']);
30
71
  const VERSION_FLAGS = new Set(['-v', '--version']);
31
- function renderOpenApi() {
32
- return `${(0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version_1.default))}\n`;
72
+ const UNFOLD_VARS = [
73
+ 'FOREST_SERVER_URL',
74
+ 'FOREST_ENV_SECRET',
75
+ 'FOREST_AUTH_SECRET',
76
+ 'AGENT_URL',
77
+ ];
78
+ const NOTHING_TO_UNFOLD = `${UNFOLD_VARS.join(', ')} must all be set to unfold it`;
79
+ function wantsUnfolding(env) {
80
+ return UNFOLD_VARS.every(name => (env[name] ?? '').trim() !== '');
81
+ }
82
+ /**
83
+ * Unfolds when the deployment is configured to be inspected, and emits the generic document when it
84
+ * is not configured at all — the command keeps working without configuration. A deployment that IS
85
+ * configured but whose schema cannot be read fails instead of quietly degrading: it asked for the
86
+ * unfolded document, and a generic one would look like a complete answer.
87
+ */
88
+ async function renderOpenApi(env, logger) {
89
+ const authSecret = env.FOREST_AUTH_SECRET;
90
+ // `parseConfig` validates the WHOLE server configuration, including settings the export has nothing
91
+ // to do with (HTTP_PORT, the OAuth keys, the default timezone). A deployment that never asked for an
92
+ // unfolded document must not see its export die on one of those, so the config is parsed only once
93
+ // the four variables unfolding needs are all present — and from there a bad value is a real failure.
94
+ const unfoldable = authSecret && wantsUnfolding(env)
95
+ ? { source: (0, cli_core_1.resolveUnfoldSource)((0, env_config_1.parseConfig)(env), logger), authSecret }
96
+ : undefined;
97
+ if (!unfoldable?.source) {
98
+ logger('Warn', `Emitting the generic OpenAPI document: ${NOTHING_TO_UNFOLD}`);
99
+ return `${(0, openapi_document_1.serializeOpenApi)((0, openapi_document_1.generateOpenApiDocument)(version_1.default))}\n`;
100
+ }
101
+ const { source } = unfoldable;
102
+ const readModel = await source.store.getReadModel();
103
+ const { document, unfolding } = await (0, unfolded_document_1.default)(source, readModel, () => (0, unfolded_document_1.issueOpenApiAgentToken)(unfoldable.authSecret), version_1.default);
104
+ // Not one collection came back with its field set, so the agent was unreachable throughout. The
105
+ // paths are real but every field schema is free-form, which is not the document this command
106
+ // promises — a CI job regenerating it needs something to branch on, and the degraded notes buried
107
+ // in the descriptions are not it. One odd collection stays a warning, not a failure.
108
+ if ((0, unfolding_1.isFullyDegraded)(unfolding)) {
109
+ throw new Error('No collection could be described: the agent answered no capabilities call, so every field ' +
110
+ 'schema in the document would be free-form. Check AGENT_URL and the agent, then retry.');
111
+ }
112
+ return `${document}\n`;
33
113
  }
34
114
  function rejectCli(reason) {
35
115
  process.stderr.write(`${reason}\n${exports.HINT}\n`);
@@ -46,12 +126,12 @@ function parseOutputOption(rest) {
46
126
  extras: [...rest.slice(0, index), ...rest.slice(index + (takesValue ? 2 : 1))],
47
127
  };
48
128
  }
49
- function writeOpenApiFile(file) {
129
+ function writeOpenApiFile(file, document) {
50
130
  const asDirectory = file.endsWith('/') || file.endsWith(path_1.default.sep);
51
131
  const destination = path_1.default.resolve(process.cwd(), asDirectory ? path_1.default.join(file, exports.DEFAULT_OUTPUT_FILE) : file);
52
132
  try {
53
133
  (0, fs_1.mkdirSync)(path_1.default.dirname(destination), { recursive: true });
54
- (0, fs_1.writeFileSync)(destination, renderOpenApi());
134
+ (0, fs_1.writeFileSync)(destination, document);
55
135
  }
56
136
  catch (error) {
57
137
  process.stderr.write(`Cannot write ${destination}: ${(0, errors_1.extractErrorMessage)(error)}\n`);
@@ -82,10 +162,11 @@ async function dispatchCli(argv, env, logger) {
82
162
  if (extras.length > 0) {
83
163
  return rejectCli(`openapi accepts only --output, got: ${extras.map(extra => JSON.stringify(extra)).join(' ')}`);
84
164
  }
165
+ const document = await renderOpenApi(env, logger ?? (0, console_logger_1.default)());
85
166
  if (file !== undefined) {
86
- return writeOpenApiFile(file);
167
+ return writeOpenApiFile(file, document);
87
168
  }
88
- process.stdout.write(renderOpenApi());
169
+ process.stdout.write(document);
89
170
  return { exitCode: 0 };
90
171
  }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWRpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS1kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFxQ0Esc0NBRUM7QUFnREQsOEJBOENDO0FBbElELDJCQUE4QztBQUM5QyxnREFBd0I7QUFFeEIsMERBQWdDO0FBQ2hDLHFDQUErQztBQUMvQyxpRUFBdUY7QUFDdkYsd0RBQWdDO0FBRW5CLFFBQUEsbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBRWxELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUVsQixRQUFBLEtBQUssR0FBRzs7Ozs7O29DQU1lLDJCQUFtQjs7OztvREFJSCxDQUFDO0FBRXhDLFFBQUEsSUFBSSxHQUFHLG9DQUFvQyxDQUFDO0FBRXpELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQU9uRCxTQUFnQixhQUFhO0lBQzNCLE9BQU8sR0FBRyxJQUFBLG1DQUFnQixFQUFDLElBQUEsMENBQXVCLEVBQUMsaUJBQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsTUFBYztJQUMvQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sS0FBSyxZQUFJLElBQUksQ0FBQyxDQUFDO0lBRTdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQU9ELFNBQVMsaUJBQWlCLENBQUMsSUFBYztJQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXhDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sRUFBRSxNQUFN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
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWRpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS1kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnRUEsc0NBdUNDO0FBZ0RELDhCQWdEQztBQXBNRCwyQkFBOEM7QUFDOUMsZ0RBQXdCO0FBRXhCLCtFQUE0RDtBQUM1RCx1REFBeUQ7QUFDekQsb0RBQWtEO0FBQ2xELHFDQUErQztBQUMvQyxpRUFBdUY7QUFDdkYsaUZBQTRGO0FBQzVGLG1EQUFzRDtBQUN0RCx3REFBZ0M7QUFFbkIsUUFBQSxtQkFBbUIsR0FBRyxjQUFjLENBQUM7QUFFbEQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBRWxCLFFBQUEsS0FBSyxHQUFHOzs7Ozs7Ozs7O29DQVVlLDJCQUFtQjs7OztvREFJSCxDQUFDO0FBRXhDLFFBQUEsSUFBSSxHQUFHLG9DQUFvQyxDQUFDO0FBRXpELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQU9uRCxNQUFNLFdBQVcsR0FBRztJQUNsQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixXQUFXO0NBQ0gsQ0FBQztBQUVYLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQztBQUVuRixTQUFTLGNBQWMsQ0FBQyxHQUFzQjtJQUM1QyxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENB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
@@ -14,15 +14,6 @@ const capabilities_validator_1 = require("../validation/capabilities-validator")
14
14
  const relation_field_guard_1 = __importDefault(require("../validation/relation-field-guard"));
15
15
  const DATA_ROUTE = /^\/agent\/v1\/([^/]+)\/(list|count)$/;
16
16
  const RELATION_ROUTE = /^\/agent\/v1\/([^/]+)\/relations\/([^/]+)\/(list|count)$/;
17
- // Only to-many relations expose list/count on the agent; to-one relations get update-relation only.
18
- // A polymorphic relation carrying multiple targets is always the to-one (PolymorphicManyToOne) side.
19
- function resolveForeignCollection(target) {
20
- if (!target || !('target' in target))
21
- return null;
22
- if (target.type !== 'HasMany' && target.type !== 'BelongsToMany')
23
- return null;
24
- return target.target;
25
- }
26
17
  // The route's allow-list check ran against the read-model captured before this request awaited the
27
18
  // capabilities; a refresh in that window can drop the collection, so it is re-checked against the
28
19
  // generation the capabilities belong to. The agent stays the authority (it asserts canBrowse itself)
@@ -101,7 +92,7 @@ async function handleCount(ctx, body, deps) {
101
92
  }
102
93
  function assertRelationStillExposed(readModel, deps) {
103
94
  assertCollectionStillAllowed(readModel, deps.collection);
104
- const stillTargets = resolveForeignCollection(readModel.getRelationTarget(deps.collection, deps.relation));
95
+ const stillTargets = readModel.getListableRelationTarget(deps.collection, deps.relation);
105
96
  if (stillTargets !== deps.foreignCollection) {
106
97
  throw (0, bff_local_errors_1.unknownRelation)(`Unknown relation: ${deps.collection}.${deps.relation}`);
107
98
  }
@@ -144,7 +135,7 @@ async function handleRelation(ctx, rawBody, match, { deps, readModel }) {
144
135
  const operation = match[3];
145
136
  // The URL identity (does this listable relation exist?) is resolved before the body,
146
137
  // so a bad path 404s before its payload is inspected.
147
- const foreignCollection = resolveForeignCollection(readModel.getRelationTarget(deps.collection, relation));
138
+ const foreignCollection = readModel.getListableRelationTarget(deps.collection, relation);
148
139
  // TODO(PRD-672): the read-model's relation map is the allow-list, so an absent/to-one/polymorphic
149
140
  // relation cannot be told from a disallowed one — every non-listable relation maps to 404 here;
150
141
  // `relation_not_allowed` (403) has no local trigger, mirroring `collection_not_allowed`.
@@ -212,4 +203,4 @@ function createDataRoutesMiddleware({ store, agentUrl, timeoutMs, logger, create
212
203
  }
213
204
  };
214
205
  }
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2RhdGEtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErVEEsNkNBMERDO0FBM1dELDRFQUErRDtBQUMvRCwrQ0FTdUI7QUFDdkIseURBQXVFO0FBQ3ZFLHFFQUtxQztBQUNyQywrREFBOEU7QUFDOUUsMEdBQXNGO0FBQ3RGLGlGQUc4QztBQUM5Qyw4RkFBNEU7QUFFNUUsTUFBTSxVQUFVLEdBQUcsc0NBQXNDLENBQUM7QUFDMUQsTUFBTSxjQUFjLEdBQUcsMERBQTBELENBQUM7QUFFbEYsb0dBQW9HO0FBQ3BHLHFHQUFxRztBQUNyRyxTQUFTLHdCQUF3QixDQUFDLE1BQWtDO0lBQ2xFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNsRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTlFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN2QixDQUFDO0FBdUJELG1HQUFtRztBQUNuRyxrR0FBa0c7QUFDbEcscUdBQXFHO0FBQ3JHLDJGQUEyRjtBQUMzRixTQUFTLDRCQUE0QixDQUFDLFNBQW9CLEVBQUUsVUFBa0I7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7UUFBRSxNQUFNLElBQUEsb0NBQWlCLEdBQUUsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUErQztJQUN4RSxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFB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
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2RhdGEtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFrVEEsNkNBMERDO0FBOVZELDRFQUErRDtBQUMvRCwrQ0FTdUI7QUFDdkIseURBQXVFO0FBQ3ZFLHFFQUtxQztBQUNyQywrREFBOEU7QUFDOUUsMEdBQXNGO0FBQ3RGLGlGQUc4QztBQUM5Qyw4RkFBNEU7QUFFNUUsTUFBTSxVQUFVLEdBQUcsc0NBQXNDLENBQUM7QUFDMUQsTUFBTSxjQUFjLEdBQUcsMERBQTBELENBQUM7QUF1QmxGLG1HQUFtRztBQUNuRyxrR0FBa0c7QUFDbEcscUdBQXFHO0FBQ3JHLDJGQUEyRjtBQUMzRixTQUFTLDRCQUE0QixDQUFDLFNBQW9CLEVBQUUsVUFBa0I7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7UUFBRSxNQUFNLElBQUEsb0NBQWlCLEdBQUUsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUErQztJQUN4RSxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFVBQVU7S0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixJQUF3QixFQUN4QixVQUFrQjtJQUVsQixPQUFPLElBQUEsK0JBQVMsRUFDZCxHQUFHLEVBQUUsQ0FDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDeEIsVUFBVSxFQUNWLElBQUEsb0NBQThCLEVBQUM7UUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1FBQ3ZC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
@@ -1,4 +1,5 @@
1
1
  import type { PrimaryKeyField } from '../read-model/read-model';
2
+ export declare const PACKED_ID_SEPARATOR = "|";
2
3
  /**
3
4
  * Rebuild the structured primary key of a record from its opaque packed id, mirroring the agent's
4
5
  * `IdUtils.packId`/`unpackId` (`|`-joined values, `Number` columns cast back to numbers). Returns a
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PACKED_ID_SEPARATOR = void 0;
3
4
  exports.default = unpackPrimaryKey;
4
5
  const bff_local_errors_1 = require("../http/bff-local-errors");
5
- const PACKED_ID_SEPARATOR = '|';
6
+ exports.PACKED_ID_SEPARATOR = '|';
6
7
  // The only column type unpacked to a number, mirroring the agent's `IdUtils.unpackId`.
7
8
  const NUMBER_COLUMN_TYPE = 'Number';
8
9
  /**
@@ -15,7 +16,7 @@ function unpackPrimaryKey(packedId, primaryKeys) {
15
16
  if (primaryKeys.length === 0) {
16
17
  throw (0, bff_local_errors_1.mappingError)('Cannot build primary key: the collection exposes no key metadata');
17
18
  }
18
- const values = packedId.split(PACKED_ID_SEPARATOR);
19
+ const values = packedId.split(exports.PACKED_ID_SEPARATOR);
19
20
  if (values.length !== primaryKeys.length) {
20
21
  throw (0, bff_local_errors_1.mappingError)(`Cannot build primary key: expected ${primaryKeys.length} values, found ${values.length}`);
21
22
  }
@@ -34,4 +35,4 @@ function unpackPrimaryKey(packedId, primaryKeys) {
34
35
  });
35
36
  return result;
36
37
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFjay1pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3BhY2staWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxtQ0F1Q0M7QUFwREQsK0RBQXdEO0FBRXhELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRWhDLHVGQUF1RjtBQUN2RixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztBQUVwQzs7Ozs7R0FLRztBQUNILFNBQXdCLGdCQUFnQixDQUN0QyxRQUFnQixFQUNoQixXQUE4QjtJQUU5QixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFBLCtCQUFZLEVBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRW5ELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFBLCtCQUFZLEVBQ2hCLHNDQUFzQyxXQUFXLENBQUMsTUFBTSxrQkFBa0IsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUMxRixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFvQyxFQUFFLENBQUM7SUFFbkQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QixJQUFJLElBQUksS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFFckIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFBLCtCQUFZLEVBQ2hCLG9EQUFvRCxLQUFLLFVBQVUsSUFBSSxHQUFHLENBQzNFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMifQ==
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFjay1pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3BhY2staWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZUEsbUNBdUNDO0FBcERELCtEQUF3RDtBQUUzQyxRQUFBLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUV2Qyx1RkFBdUY7QUFDdkYsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUM7QUFFcEM7Ozs7O0dBS0c7QUFDSCxTQUF3QixnQkFBZ0IsQ0FDdEMsUUFBZ0IsRUFDaEIsV0FBOEI7SUFFOUIsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBQSwrQkFBWSxFQUFDLGtFQUFrRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsMkJBQW1CLENBQUMsQ0FBQztJQUVuRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBQSwrQkFBWSxFQUNoQixzQ0FBc0MsV0FBVyxDQUFDLE1BQU0sa0JBQWtCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDMUYsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBb0MsRUFBRSxDQUFDO0lBRW5ELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBRXJCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBQSwrQkFBWSxFQUNoQixvREFBb0QsS0FBSyxVQUFVLElBQUksR0FBRyxDQUMzRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIn0=
@@ -0,0 +1,23 @@
1
+ import type { Unfolding } from './unfolding';
2
+ import type { Logger } from '../ports/logger-port';
3
+ import type { CapabilitiesFetcher } from '../read-model/capabilities-cache';
4
+ import type ReadModel from '../read-model/read-model';
5
+ import type ReadModelStore from '../read-model/read-model-store';
6
+ export declare const CAPABILITIES_CONCURRENCY = 10;
7
+ export interface CollectUnfoldingOptions {
8
+ readModel: ReadModel;
9
+ store: ReadModelStore;
10
+ capabilitiesFetcher: CapabilitiesFetcher;
11
+ logger: Logger;
12
+ concurrency?: number;
13
+ }
14
+ /**
15
+ * Collects everything the document unfolds. Sorted at every level so two runs over one schema
16
+ * produce byte-identical documents — the route/CLI comparison depends on it.
17
+ *
18
+ * A schema refresh landing mid-collect can mix the new generation's field sets into this snapshot's
19
+ * structure. Detecting it belongs to the caller, which knows whether the read-model it passed is
20
+ * still the current one once this resolves.
21
+ */
22
+ export default function collectUnfolding(options: CollectUnfoldingOptions): Promise<Unfolding>;
23
+ //# sourceMappingURL=collect-unfolding.d.ts.map