@venizia/ignis-kernel 0.2.1-3 → 0.2.1-4

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 (57) hide show
  1. package/dist/cjs/base/controllers/factory/controller.d.ts +56 -2
  2. package/dist/cjs/base/controllers/factory/controller.d.ts.map +1 -1
  3. package/dist/cjs/base/controllers/rest/base.d.ts +70 -3
  4. package/dist/cjs/base/controllers/rest/base.d.ts.map +1 -1
  5. package/dist/cjs/base/controllers/rest/base.js +30 -3
  6. package/dist/cjs/base/controllers/rest/base.js.map +1 -1
  7. package/dist/cjs/base/controllers/rest/extras.d.ts +49 -0
  8. package/dist/cjs/base/controllers/rest/extras.d.ts.map +1 -0
  9. package/dist/cjs/base/controllers/rest/extras.js +153 -0
  10. package/dist/cjs/base/controllers/rest/extras.js.map +1 -0
  11. package/dist/cjs/base/controllers/rest/index.d.ts +1 -0
  12. package/dist/cjs/base/controllers/rest/index.d.ts.map +1 -1
  13. package/dist/cjs/base/controllers/rest/index.js +1 -0
  14. package/dist/cjs/base/controllers/rest/index.js.map +1 -1
  15. package/dist/cjs/base/repositories/common/extra-request.d.ts +26 -0
  16. package/dist/cjs/base/repositories/common/extra-request.d.ts.map +1 -0
  17. package/dist/cjs/base/repositories/common/extra-request.js +21 -0
  18. package/dist/cjs/base/repositories/common/extra-request.js.map +1 -0
  19. package/dist/cjs/base/repositories/common/response-reader.d.ts +52 -0
  20. package/dist/cjs/base/repositories/common/response-reader.d.ts.map +1 -0
  21. package/dist/cjs/base/repositories/common/response-reader.js +98 -0
  22. package/dist/cjs/base/repositories/common/response-reader.js.map +1 -0
  23. package/dist/cjs/base/repositories/common/types/results.d.ts +2 -1
  24. package/dist/cjs/base/repositories/common/types/results.d.ts.map +1 -1
  25. package/dist/cjs/repository.d.ts +3 -0
  26. package/dist/cjs/repository.d.ts.map +1 -1
  27. package/dist/cjs/repository.js +7 -1
  28. package/dist/cjs/repository.js.map +1 -1
  29. package/dist/esm/base/controllers/factory/controller.d.ts +56 -2
  30. package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
  31. package/dist/esm/base/controllers/rest/base.d.ts +70 -3
  32. package/dist/esm/base/controllers/rest/base.d.ts.map +1 -1
  33. package/dist/esm/base/controllers/rest/base.js +30 -3
  34. package/dist/esm/base/controllers/rest/base.js.map +1 -1
  35. package/dist/esm/base/controllers/rest/extras.d.ts +49 -0
  36. package/dist/esm/base/controllers/rest/extras.d.ts.map +1 -0
  37. package/dist/esm/base/controllers/rest/extras.js +149 -0
  38. package/dist/esm/base/controllers/rest/extras.js.map +1 -0
  39. package/dist/esm/base/controllers/rest/index.d.ts +1 -0
  40. package/dist/esm/base/controllers/rest/index.d.ts.map +1 -1
  41. package/dist/esm/base/controllers/rest/index.js +1 -0
  42. package/dist/esm/base/controllers/rest/index.js.map +1 -1
  43. package/dist/esm/base/repositories/common/extra-request.d.ts +26 -0
  44. package/dist/esm/base/repositories/common/extra-request.d.ts.map +1 -0
  45. package/dist/esm/base/repositories/common/extra-request.js +17 -0
  46. package/dist/esm/base/repositories/common/extra-request.js.map +1 -0
  47. package/dist/esm/base/repositories/common/response-reader.d.ts +52 -0
  48. package/dist/esm/base/repositories/common/response-reader.d.ts.map +1 -0
  49. package/dist/esm/base/repositories/common/response-reader.js +94 -0
  50. package/dist/esm/base/repositories/common/response-reader.js.map +1 -0
  51. package/dist/esm/base/repositories/common/types/results.d.ts +2 -1
  52. package/dist/esm/base/repositories/common/types/results.d.ts.map +1 -1
  53. package/dist/esm/repository.d.ts +3 -0
  54. package/dist/esm/repository.d.ts.map +1 -1
  55. package/dist/esm/repository.js +4 -0
  56. package/dist/esm/repository.js.map +1 -1
  57. package/package.json +2 -2
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpResponseReader = void 0;
4
+ const common_1 = require("@venizia/ignis-helpers/common");
5
+ /**
6
+ * What an IGNIS server answers - `Content-Range`, the error envelope - read once, here, for every
7
+ * client of that server: the http connector, and a client that reads it without the connector.
8
+ */
9
+ class HttpResponseReader {
10
+ static isPlainObject(value) {
11
+ return (!!value && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype);
12
+ }
13
+ /** An empty string reads as absent, so a fallback still applies. */
14
+ static toText(value) {
15
+ return typeof value === 'string' && value !== '' ? value : undefined;
16
+ }
17
+ /**
18
+ * A `Content-Range` header as the IGNIS server writes it: `records 0-24/137` -> skip 0, total 137;
19
+ * an empty page, `records *\/137` -> total 137. Anything else, including an absent header or an
20
+ * unknown total, is `undefined`.
21
+ */
22
+ static parseContentRange(opts) {
23
+ const { header } = opts;
24
+ if (!header) {
25
+ return undefined;
26
+ }
27
+ const range = header.match(/(\d+)\s*-\s*(\d+)\s*\/\s*(\d+)/);
28
+ if (range) {
29
+ return { skip: Number(range[1]), total: Number(range[3]) };
30
+ }
31
+ const unsatisfied = header.match(/\*\s*\/\s*(\d+)/);
32
+ if (unsatisfied) {
33
+ return { total: Number(unsatisfied[1]) };
34
+ }
35
+ return undefined;
36
+ }
37
+ /**
38
+ * The IGNIS error envelope - `{ message, statusCode, normalized: { text, code, args }, requestId,
39
+ * extra, details }` - read off a parsed response body. A server configured with `error.rootKey`
40
+ * wraps it under that key; pass the same `rootKey` to unwrap it. A body without that key, or with a
41
+ * non-object under it (a proxy's `{ error: 'Bad Gateway' }`), is read as it stands.
42
+ *
43
+ * A body that is not a plain object yields `{}`; any other body yields its known fields, each
44
+ * `undefined` when absent or mistyped. An empty string reads as absent.
45
+ */
46
+ static readErrorEnvelope(opts) {
47
+ const { body, rootKey } = opts;
48
+ const wrapped = rootKey && HttpResponseReader.isPlainObject(body) ? body[rootKey] : undefined;
49
+ const envelope = HttpResponseReader.isPlainObject(wrapped) ? wrapped : body;
50
+ if (!HttpResponseReader.isPlainObject(envelope)) {
51
+ return {};
52
+ }
53
+ const { message, statusCode, normalized, requestId, extra, details } = envelope;
54
+ const normalizedRecord = HttpResponseReader.isPlainObject(normalized) ? normalized : {};
55
+ const { text, code, args } = normalizedRecord;
56
+ return {
57
+ message: HttpResponseReader.toText(message),
58
+ statusCode: typeof statusCode === 'number' ? statusCode : undefined,
59
+ normalized: {
60
+ text: HttpResponseReader.toText(text),
61
+ code: HttpResponseReader.toText(code),
62
+ args: HttpResponseReader.isPlainObject(args) ? { ...args } : undefined,
63
+ },
64
+ requestId: HttpResponseReader.toText(requestId),
65
+ extra: HttpResponseReader.isPlainObject(extra) ? { ...extra } : undefined,
66
+ details: HttpResponseReader.isPlainObject(details) ? { ...details } : undefined,
67
+ };
68
+ }
69
+ /** A failed response's envelope. A body that is not JSON yields `{}`, and the status alone still describes it. */
70
+ static async readError(opts) {
71
+ const text = await opts.response.text().catch(() => '');
72
+ let body;
73
+ try {
74
+ body = text ? JSON.parse(text) : undefined;
75
+ }
76
+ catch {
77
+ return {};
78
+ }
79
+ return HttpResponseReader.readErrorEnvelope({ body, rootKey: opts.rootKey });
80
+ }
81
+ /**
82
+ * A body the server marked with `x-response-extra` is `{ data, extra }`: its rows and what it
83
+ * answered beside them. Any other body is returned as it stands - an unmarked object is never
84
+ * unwrapped, so a row that has `data` and `extra` columns of its own is never misread.
85
+ */
86
+ static readExtra(opts) {
87
+ const { body, headers } = opts;
88
+ const isMarked = headers.has(common_1.HTTP.Headers.RESPONSE_EXTRA);
89
+ if (!isMarked ||
90
+ !HttpResponseReader.isPlainObject(body) ||
91
+ !HttpResponseReader.isPlainObject(body.extra)) {
92
+ return { body };
93
+ }
94
+ return { body: body.data, extra: { ...body.extra } };
95
+ }
96
+ }
97
+ exports.HttpResponseReader = HttpResponseReader;
98
+ //# sourceMappingURL=response-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-reader.js","sourceRoot":"","sources":["../../../../../src/base/repositories/common/response-reader.ts"],"names":[],"mappings":";;;AAAA,0DAAqD;AAGrD;;;GAGG;AACH,MAAa,kBAAkB;IAC7B,MAAM,CAAC,aAAa,CAAC,KAAc;QACjC,OAAO,CACL,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAC1F,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,MAAM,CAAC,MAAM,CAAC,KAAc;QAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAExB;QACC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC7D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACpD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAyC;QAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAE/B,MAAM,OAAO,GAAG,OAAO,IAAI,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5E,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;QAChF,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC;QAE9C,OAAO;YACL,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3C,UAAU,EAAE,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACnE,UAAU,EAAE;gBACV,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrC,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;aACvE;YACD,SAAS,EAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/C,KAAK,EAAE,kBAAkB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;YACzE,OAAO,EAAE,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SAChF,CAAC;IACJ,CAAC;IAED,kHAAkH;IAClH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAA8C;QACnE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAExD,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,IAAsD;QAIrE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAE1D,IACE,CAAC,QAAQ;YACT,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC;YACvC,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAC7C,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IACvD,CAAC;CACF;AAhHD,gDAgHC"}
@@ -15,9 +15,10 @@ export declare const buildDataRange: (opts: {
15
15
  dataLength: number;
16
16
  total: number;
17
17
  }) => TDataRange;
18
- /** The `shouldQueryRange: true` result envelope. */
18
+ /** The `shouldQueryRange: true` result envelope; `extra` carries what a list answered beside its rows - see `x-request-extra`. */
19
19
  export type TDataWithRange<R> = {
20
20
  data: Array<R>;
21
21
  range: TDataRange;
22
+ extra?: Record<string, unknown>;
22
23
  };
23
24
  //# sourceMappingURL=results.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../../../../src/base/repositories/common/types/results.ts"],"names":[],"mappings":"AAAA,uLAAuL;AACvL,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,yFAAyF;AACzF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,cAAc,GAAI,MAAM;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,UAKH,CAAC;AAEF,oDAAoD;AACpD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../../../../src/base/repositories/common/types/results.ts"],"names":[],"mappings":"AAAA,uLAAuL;AACvL,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,yFAAyF;AACzF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,cAAc,GAAI,MAAM;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,UAKH,CAAC;AAEF,kIAAkI;AAClI,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC"}
@@ -16,6 +16,9 @@ export { AbstractRepository } from './base/repositories/core/abstract';
16
16
  export { AbstractDataSource } from './base/datasources/abstract';
17
17
  export type { ICreatableRepository, ICrudRepository, IDeletableRepository, IPersistableRepository, IReadableRepository, IRepository, IUpdatableRepository, } from './base/repositories/common/types/contracts';
18
18
  export { buildDataRange } from './base/repositories/common/types/results';
19
+ export { HttpResponseReader } from './base/repositories/common/response-reader';
20
+ export { HttpExtraRequest } from './base/repositories/common/extra-request';
21
+ export type { TExtraRequest, TExtraResult } from './base/repositories/common/extra-request';
19
22
  export { DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, RepositoryOperationScopes, RepositoryTypes, } from './base/repositories/common/constants';
20
23
  export type { TRepositoryType } from './base/repositories/common/constants';
21
24
  export { CoreErrorCodes, SearchErrorCodes } from './common/error-codes';
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,oBAAoB,GACrB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI1E,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,GAChB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAEnG,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGvE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,oBAAoB,GACrB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAI5F,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,GAChB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAEnG,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGvE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
@@ -14,13 +14,19 @@
14
14
  * Weight is a contract, checked by `src/__tests__/bundle/browser-weight.test.ts`.
15
15
  */
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.SchemaTypes = exports.AbstractEntity = exports.throwNotSupported = exports.SearchErrorCodes = exports.CoreErrorCodes = exports.RepositoryTypes = exports.RepositoryOperationScopes = exports.DEFAULT_MAX_LIMIT = exports.DEFAULT_LIMIT = exports.buildDataRange = exports.AbstractDataSource = exports.AbstractRepository = void 0;
17
+ exports.SchemaTypes = exports.AbstractEntity = exports.throwNotSupported = exports.SearchErrorCodes = exports.CoreErrorCodes = exports.RepositoryTypes = exports.RepositoryOperationScopes = exports.DEFAULT_MAX_LIMIT = exports.DEFAULT_LIMIT = exports.HttpExtraRequest = exports.HttpResponseReader = exports.buildDataRange = exports.AbstractDataSource = exports.AbstractRepository = void 0;
18
18
  var abstract_1 = require("./base/repositories/core/abstract");
19
19
  Object.defineProperty(exports, "AbstractRepository", { enumerable: true, get: function () { return abstract_1.AbstractRepository; } });
20
20
  var abstract_2 = require("./base/datasources/abstract");
21
21
  Object.defineProperty(exports, "AbstractDataSource", { enumerable: true, get: function () { return abstract_2.AbstractDataSource; } });
22
22
  var results_1 = require("./base/repositories/common/types/results");
23
23
  Object.defineProperty(exports, "buildDataRange", { enumerable: true, get: function () { return results_1.buildDataRange; } });
24
+ // How a client reads what an IGNIS server answers - shared by the http connector and any client
25
+ // that reads the same server without it.
26
+ var response_reader_1 = require("./base/repositories/common/response-reader");
27
+ Object.defineProperty(exports, "HttpResponseReader", { enumerable: true, get: function () { return response_reader_1.HttpResponseReader; } });
28
+ var extra_request_1 = require("./base/repositories/common/extra-request");
29
+ Object.defineProperty(exports, "HttpExtraRequest", { enumerable: true, get: function () { return extra_request_1.HttpExtraRequest; } });
24
30
  // What a repository on any transport raises and bounds itself by - the constants, the error codes,
25
31
  // and the helper an engine that lacks an operation throws through.
26
32
  var constants_1 = require("./base/repositories/common/constants");
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAEH,8DAAuE;AAA9D,8GAAA,kBAAkB,OAAA;AAC3B,wDAAiE;AAAxD,8GAAA,kBAAkB,OAAA;AAY3B,oEAA0E;AAAjE,yGAAA,cAAc,OAAA;AAEvB,mGAAmG;AACnG,mEAAmE;AACnE,kEAK8C;AAJ5C,0GAAA,aAAa,OAAA;AACb,8GAAA,iBAAiB,OAAA;AACjB,sHAAA,yBAAyB,OAAA;AACzB,4GAAA,eAAe,OAAA;AAGjB,oDAAwE;AAA/D,6GAAA,cAAc,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AACzC,2DAA8D;AAArD,kHAAA,iBAAiB,OAAA;AAK1B,mGAAmG;AACnG,qFAAqF;AACrF,2CAAoD;AAA3C,sGAAA,cAAc,OAAA;AACvB,4DAA6D;AAApD,wGAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAEH,8DAAuE;AAA9D,8GAAA,kBAAkB,OAAA;AAC3B,wDAAiE;AAAxD,8GAAA,kBAAkB,OAAA;AAY3B,oEAA0E;AAAjE,yGAAA,cAAc,OAAA;AAEvB,gGAAgG;AAChG,yCAAyC;AACzC,8EAAgF;AAAvE,qHAAA,kBAAkB,OAAA;AAC3B,0EAA4E;AAAnE,iHAAA,gBAAgB,OAAA;AAGzB,mGAAmG;AACnG,mEAAmE;AACnE,kEAK8C;AAJ5C,0GAAA,aAAa,OAAA;AACb,8GAAA,iBAAiB,OAAA;AACjB,sHAAA,yBAAyB,OAAA;AACzB,4GAAA,eAAe,OAAA;AAGjB,oDAAwE;AAA/D,6GAAA,cAAc,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AACzC,2DAA8D;AAArD,kHAAA,iBAAiB,OAAA;AAK1B,mGAAmG;AACnG,qFAAqF;AACrF,2CAAoD;AAA3C,sGAAA,cAAc,OAAA;AACvB,4DAA6D;AAApD,wGAAA,WAAW,OAAA"}
@@ -79,6 +79,9 @@ export declare class ControllerFactory extends BaseHelper {
79
79
  context: RequestContext;
80
80
  payload: ResponseData;
81
81
  }): ResponseData | import("@venizia/ignis-helpers/common").TNullable<ResponseSchema>;
82
+ getRequestedExtras(opts: {
83
+ context: import("../index.js").TRouteContext<RouteEnv>;
84
+ }): Array<import("../index.js").IRequestedExtra>;
82
85
  respond<R>(opts: {
83
86
  context: import("../index.js").TRouteContext<RouteEnv>;
84
87
  format: import("../index.js").TResponseFormat;
@@ -87,10 +90,61 @@ export declare class ControllerFactory extends BaseHelper {
87
90
  data?: import("@venizia/ignis-helpers/common").TNullable<R>;
88
91
  };
89
92
  range?: import("../../repositories/index.js").TDataRange;
90
- }): import("@venizia/ignis-helpers/common").TNullable<R> | {
93
+ extra?: never;
94
+ }): R | {
91
95
  count: number;
92
96
  data?: import("@venizia/ignis-helpers/common").TNullable<R>;
93
- };
97
+ } | null | undefined;
98
+ respond<R, Extra extends Record<string, import("../index.js").TResponseExtra>>(opts: {
99
+ context: import("../index.js").TRouteContext<RouteEnv>;
100
+ format: import("../index.js").TResponseFormat;
101
+ payload: {
102
+ count: number;
103
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
104
+ };
105
+ range?: import("../../repositories/index.js").TDataRange;
106
+ extra: Extra;
107
+ }): Promise<R | {
108
+ count: number;
109
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
110
+ } | {
111
+ count?: number;
112
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
113
+ extra: Partial<Record<keyof Extra, unknown>>;
114
+ } | null | undefined>;
115
+ respond<R>(opts: {
116
+ context: import("../index.js").TRouteContext<RouteEnv>;
117
+ format: import("../index.js").TResponseFormat;
118
+ payload: {
119
+ count: number;
120
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
121
+ };
122
+ range?: import("../../repositories/index.js").TDataRange;
123
+ extra?: Record<string, import("../index.js").TResponseExtra>;
124
+ }): ValueOrPromise<R | {
125
+ count?: number;
126
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
127
+ extra?: Record<string, unknown>;
128
+ } | null | undefined>;
129
+ respondWithExtra<R>(opts: {
130
+ context: import("../index.js").TRouteContext<RouteEnv>;
131
+ payload: {
132
+ count: number;
133
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
134
+ };
135
+ extra: Record<string, import("../index.js").TResponseExtra>;
136
+ }): Promise<R | {
137
+ count: number;
138
+ data?: import("@venizia/ignis-helpers/common").TNullable<R>;
139
+ } | {
140
+ count: number;
141
+ data: import("@venizia/ignis-helpers/common").TNullable<R>;
142
+ extra: Record<string, unknown>;
143
+ } | {
144
+ data: import("@venizia/ignis-helpers/common").TNullable<R>;
145
+ extra: Record<string, unknown>;
146
+ count?: undefined;
147
+ } | null | undefined>;
94
148
  setListHeaders(opts: {
95
149
  context: import("../index.js").TRouteContext<RouteEnv>;
96
150
  count: number;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../../src/base/controllers/factory/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAY,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,WAAW,CAAC;AAKnB,6EAA6E;AAC7E,qBAAa,iBAAkB,SAAQ,UAAU;;IAK/C,MAAM,CAAC,oBAAoB,CACzB,OAAO,SAAS,cAAc,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAAC,gBAAgB,CAAC,EACnF,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,EACxD,QAAQ,SAAS,GAAG,GAAG,GAAG,EAC1B,WAAW,SAAS,MAAM,GAAG,EAAE,EAC/B,QAAQ,SAAS,MAAM,GAAG,GAAG,EAC7B,mBAAmB,SAAS,MAAM,GAAG,EAAE,EACvC,WAAW,SAAS,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,EACvD,cAAc,SAAS,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAC7D,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC;yBAwCtB,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC;YAUvE,iGAAiG;uBAC7E,cAAc,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBADkB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyF/D"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../../src/base/controllers/factory/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAY,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,WAAW,CAAC;AAKnB,6EAA6E;AAC7E,qBAAa,iBAAkB,SAAQ,UAAU;;IAK/C,MAAM,CAAC,oBAAoB,CACzB,OAAO,SAAS,cAAc,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAAC,gBAAgB,CAAC,EACnF,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,EACxD,QAAQ,SAAS,GAAG,GAAG,GAAG,EAC1B,WAAW,SAAS,MAAM,GAAG,EAAE,EAC/B,QAAQ,SAAS,MAAM,GAAG,GAAG,EAC7B,mBAAmB,SAAS,MAAM,GAAG,EAAE,EACvC,WAAW,SAAS,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,EACvD,cAAc,SAAS,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAC7D,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC;yBAwCtB,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC;YAUvE,iGAAiG;uBAC7E,cAAc,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBADkB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyF/D"}
@@ -5,6 +5,7 @@ import type { Env, Schema } from 'hono';
5
5
  import type { TResponseFormat } from '../common/constants.js';
6
6
  import type { IAuthRouteConfig, IBindRouteOptions, IDefineRouteOptions, TRouteContext, TRouteHandler } from '../common/types/index.js';
7
7
  import { AbstractRestController } from './abstract.js';
8
+ import type { IRequestedExtra, TResponseExtra } from './extras.js';
8
9
  /** `Content-Range` of a page: inclusive `end`, and `records * /<total>` (no space) when the page is empty. Exported so a route that writes the header itself uses the one formatter. */
9
10
  export declare const toContentRange: (opts: {
10
11
  range: TDataRange;
@@ -29,7 +30,21 @@ export declare abstract class BaseRestController<RouteEnv extends Env = Env, Rou
29
30
  context: RequestContext;
30
31
  payload: ResponseData;
31
32
  }): TNullable<ResponseSchema> | ResponseData;
32
- /** The one response call. Sets `X-Response-Format`, and with `range` (a list) also `Content-Range` - `payload.count` is the rows of THIS response, never the total - then normalizes count/data per the request-count header. */
33
+ /** `x-request-extra`, parsed: `name`, `-name` (a default switched off) and `name(key,key)`. */
34
+ getRequestedExtras(opts: {
35
+ context: TRouteContext<RouteEnv>;
36
+ }): Array<IRequestedExtra>;
37
+ /**
38
+ * The one response call. Sets `X-Response-Format`, and with `range` (a list) also `Content-Range` -
39
+ * `payload.count` is the rows of THIS response, never the total - then normalizes count/data per
40
+ * the request-count header.
41
+ *
42
+ * `extra` offers figures beside the rows (see {@link TResponseExtra}): each runs when the client
43
+ * names it in `x-request-extra`, or always when it is a default. When any runs, the body is
44
+ * `{ data, extra }` (with `count` when it is requested); when none does, nothing is computed and the
45
+ * body is what it would be without `extra`. A name the route does not offer is a 400 listing the
46
+ * ones it does.
47
+ */
33
48
  respond<R>(opts: {
34
49
  context: TRouteContext<RouteEnv>;
35
50
  format: TResponseFormat;
@@ -38,10 +53,62 @@ export declare abstract class BaseRestController<RouteEnv extends Env = Env, Rou
38
53
  data?: TNullable<R>;
39
54
  };
40
55
  range?: TDataRange;
41
- }): TNullable<R> | {
56
+ extra?: never;
57
+ }): R | {
58
+ count: number;
59
+ data?: TNullable<R>;
60
+ } | null | undefined;
61
+ respond<R, Extra extends Record<string, TResponseExtra>>(opts: {
62
+ context: TRouteContext<RouteEnv>;
63
+ format: TResponseFormat;
64
+ payload: {
65
+ count: number;
66
+ data?: TNullable<R>;
67
+ };
68
+ range?: TDataRange;
69
+ extra: Extra;
70
+ }): Promise<R | {
42
71
  count: number;
43
72
  data?: TNullable<R>;
44
- };
73
+ } | {
74
+ count?: number;
75
+ data?: TNullable<R>;
76
+ extra: Partial<Record<keyof Extra, unknown>>;
77
+ } | null | undefined>;
78
+ respond<R>(opts: {
79
+ context: TRouteContext<RouteEnv>;
80
+ format: TResponseFormat;
81
+ payload: {
82
+ count: number;
83
+ data?: TNullable<R>;
84
+ };
85
+ range?: TDataRange;
86
+ extra?: Record<string, TResponseExtra>;
87
+ }): ValueOrPromise<R | {
88
+ count?: number;
89
+ data?: TNullable<R>;
90
+ extra?: Record<string, unknown>;
91
+ } | null | undefined>;
92
+ /** The `extra` half of `respond`: resolves what was asked against what is offered, runs it in parallel. */
93
+ respondWithExtra<R>(opts: {
94
+ context: TRouteContext<RouteEnv>;
95
+ payload: {
96
+ count: number;
97
+ data?: TNullable<R>;
98
+ };
99
+ extra: Record<string, TResponseExtra>;
100
+ }): Promise<R | {
101
+ count: number;
102
+ data?: TNullable<R>;
103
+ } | {
104
+ count: number;
105
+ data: TNullable<R>;
106
+ extra: Record<string, unknown>;
107
+ } | {
108
+ data: TNullable<R>;
109
+ extra: Record<string, unknown>;
110
+ count?: undefined;
111
+ } | null | undefined>;
45
112
  /** The list headers without the body, for a list whose body is not a `{ count, data }` envelope: `Content-Range`, `X-Response-Count` = rows in THIS response, `X-Response-Format: array`. Pass a `range`, or `offset` + `total` for an engine that reports those (a search page): the range is derived with the same inclusive-end rule. */
46
113
  setListHeaders(opts: {
47
114
  context: TRouteContext<RouteEnv>;
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/base/controllers/rest/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGxF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,wLAAwL;AACxL,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,MAI3E,CAAC;AAEF,2GAA2G;AAC3G,8BAAsB,kBAAkB,CACtC,QAAQ,SAAS,GAAG,GAAG,GAAG,EAC1B,WAAW,SAAS,MAAM,GAAG,EAAE,EAC/B,QAAQ,SAAS,MAAM,GAAG,GAAG,EAC7B,mBAAmB,SAAS,MAAM,GAAG,EAAE,EACvC,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CACvF,SAAQ,sBAAsB,CAC9B,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,mBAAmB,EACnB,WAAW,CACZ;IACC,0FAA0F;IAC1F,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE;IAWzE,uJAAuJ;IACvJ,kBAAkB,CAChB,cAAc,SAAS,OAAO,EAC9B,cAAc,SAAS,aAAa,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,EACxE,YAAY,SAAS;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;KAClC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAA;KAAE,EACvD,IAAI,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,YAAY,CAAA;KAAE;IAc1D,iOAAiO;IACjO,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE;QACf,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,EAAE,eAAe,CAAC;QACxB,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;SAAE,CAAC;QAChD,KAAK,CAAC,EAAE,UAAU,CAAC;KACpB;eArBc,MAAM;;;IAgCrB,4UAA4U;IAC5U,cAAc,CACZ,IAAI,EAAE;QAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,CAC1D;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAC1D;IAaH,mPAAmP;IACnP,aAAa,CAAC,YAAY,GAAG,OAAO,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;KAAE,GACrE,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAGxE,uFAAuF;IACvF,SAAS,CAAC,WAAW,SAAS,gBAAgB,EAAE,IAAI,EAAE;QACpD,OAAO,EAAE,WAAW,CAAC;KACtB,GAAG,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;IAcnE,uEAAuE;IACvE,WAAW,CAAC,WAAW,SAAS,gBAAgB,EAAE,YAAY,GAAG,OAAO,EAAE,IAAI,EAAE;QAC9E,OAAO,EAAE,WAAW,CAAC;QACrB,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;KACzD,GAAG,mBAAmB,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;IAarE,sEAAsE;IACtE,cAAc,CAAC,WAAW,SAAS,gBAAgB,EAAE,YAAY,GAAG,OAAO,EAAE,IAAI,EAAE;QACjF,OAAO,EAAE,WAAW,CAAC;QACrB,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;KACzD,GAAG,mBAAmB,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;CAYtE"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/base/controllers/rest/base.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { HTTP } from '@venizia/ignis-helpers/common';
3
3
  import { executeWithPerformanceMeasure, toBoolean } from '@venizia/ignis-helpers/core';
4
4
  import { ResponseFormats } from '../common/constants.js';
5
5
  import { AbstractRestController } from './abstract.js';
6
+ import { ResponseExtras } from './extras.js';
6
7
  /** `Content-Range` of a page: inclusive `end`, and `records * /<total>` (no space) when the page is empty. Exported so a route that writes the header itself uses the one formatter. */
7
8
  export const toContentRange = (opts) => {
8
9
  const { range, count } = opts;
@@ -33,14 +34,40 @@ export class BaseRestController extends AbstractRestController {
33
34
  }
34
35
  return payload.data;
35
36
  }
36
- /** The one response call. Sets `X-Response-Format`, and with `range` (a list) also `Content-Range` - `payload.count` is the rows of THIS response, never the total - then normalizes count/data per the request-count header. */
37
+ /** `x-request-extra`, parsed: `name`, `-name` (a default switched off) and `name(key,key)`. */
38
+ getRequestedExtras(opts) {
39
+ return ResponseExtras.parse({ header: opts.context.req.header(HTTP.Headers.REQUEST_EXTRA) });
40
+ }
37
41
  respond(opts) {
38
- const { context, format, payload, range } = opts;
42
+ const { context, format, payload, range, extra } = opts;
39
43
  if (range) {
40
44
  context.header(HTTP.Headers.CONTENT_RANGE, toContentRange({ range, count: payload.count }));
41
45
  }
42
46
  context.header(HTTP.Headers.RESPONSE_FORMAT, format);
43
- return this.normalizeCountData({ context, payload });
47
+ if (!extra) {
48
+ return this.normalizeCountData({ context, payload });
49
+ }
50
+ return this.respondWithExtra({ context, payload, extra });
51
+ }
52
+ /** The `extra` half of `respond`: resolves what was asked against what is offered, runs it in parallel. */
53
+ async respondWithExtra(opts) {
54
+ const { context, payload, extra } = opts;
55
+ const plan = ResponseExtras.resolve({
56
+ requested: this.getRequestedExtras({ context }),
57
+ offered: extra,
58
+ });
59
+ if (plan.size === 0) {
60
+ return this.normalizeCountData({ context, payload });
61
+ }
62
+ const computed = await ResponseExtras.compute({ plan, offered: extra });
63
+ // Rows still counted in the header; the body is an object, since an array cannot carry extras.
64
+ // `x-response-extra` marks it, so a client unwraps `{ data, extra }` only when the server says so.
65
+ context.header(HTTP.Headers.RESPONSE_COUNT_DATA, payload.count.toString());
66
+ context.header(HTTP.Headers.RESPONSE_EXTRA, Object.keys(computed).join(','));
67
+ const useCountData = toBoolean(context.req.header(HTTP.Headers.REQUEST_COUNT_DATA) ?? 'true');
68
+ return useCountData
69
+ ? { count: payload.count, data: payload.data, extra: computed }
70
+ : { data: payload.data, extra: computed };
44
71
  }
45
72
  /** The list headers without the body, for a list whose body is not a `{ count, data }` envelope: `Content-Range`, `X-Response-Count` = rows in THIS response, `X-Response-Format: array`. Pass a `range`, or `offset` + `total` for an engine that reports those (a search page): the range is derived with the same inclusive-end rule. */
46
73
  setListHeaders(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../src/base/controllers/rest/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../src/base/controllers/rest/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { ValueOrPromise } from '@venizia/ignis-helpers/common';
2
+ /**
3
+ * A figure a list route offers beside its rows:
4
+ * - a function runs when the client names it;
5
+ * - `{ isDefault: true, compute }` always runs, unless the client switches it off with `-name`;
6
+ * - `{ keys, compute }` is a group - the client names the keys it wants (`facets(status,tag)`), and
7
+ * `compute` receives exactly those, so one aggregate pass serves them all.
8
+ */
9
+ export type TResponseExtra = (() => ValueOrPromise<unknown>) | {
10
+ isDefault: boolean;
11
+ compute: () => ValueOrPromise<unknown>;
12
+ keys?: never;
13
+ } | {
14
+ keys: ReadonlyArray<string>;
15
+ compute: (opts: {
16
+ keys: Array<string>;
17
+ }) => ValueOrPromise<unknown>;
18
+ isDefault?: never;
19
+ };
20
+ /** One entry of `x-request-extra`: `name`, `-name` (a default switched off), `-*` (every default off) or `name(key,key)`. */
21
+ export interface IRequestedExtra {
22
+ name: string;
23
+ isExcluded: boolean;
24
+ keys?: Array<string>;
25
+ }
26
+ /** Parses `x-request-extra` and resolves it against what a route offers. */
27
+ export declare class ResponseExtras {
28
+ /** The entries of the header, in the order written. Malformed input is a 400 naming it. */
29
+ static parse(opts: {
30
+ header?: string | null;
31
+ }): Array<IRequestedExtra>;
32
+ /**
33
+ * What to compute: the asked-for extras and the defaults, minus the ones switched off - each with the
34
+ * keys asked for, de-duplicated in the order asked. Every name and key is checked against `offered`.
35
+ */
36
+ static resolve(opts: {
37
+ requested: Array<IRequestedExtra>;
38
+ offered: Record<string, TResponseExtra>;
39
+ }): Map<string, Array<string> | undefined>;
40
+ /** Runs the plan in parallel; each value under its name. */
41
+ static compute(opts: {
42
+ plan: Map<string, Array<string> | undefined>;
43
+ offered: Record<string, TResponseExtra>;
44
+ }): Promise<Record<string, unknown>>;
45
+ /** Commas inside `( )` belong to the keys, not to the list of extras. */
46
+ private static splitTopLevel;
47
+ private static badRequest;
48
+ }
49
+ //# sourceMappingURL=extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.d.ts","sourceRoot":"","sources":["../../../../../src/base/controllers/rest/extras.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAIpE;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACtB,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC,GAC/B;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5E;IACE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAE,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC;IACpE,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB,CAAC;AAEN,6HAA6H;AAC7H,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACtB;AASD,4EAA4E;AAC5E,qBAAa,cAAc;IACzB,2FAA2F;IAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,KAAK,CAAC,eAAe,CAAC;IAmCtE;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QACnB,SAAS,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;KACzC,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IA6E1C,4DAA4D;WAC/C,OAAO,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;QAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;KACzC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAyBpC,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,aAAa;IAyB5B,OAAO,CAAC,MAAM,CAAC,UAAU;CAM1B"}