@forestadmin/agent 1.0.0-beta.8 → 1.0.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 (149) hide show
  1. package/dist/agent.d.ts +76 -0
  2. package/dist/agent.js +133 -0
  3. package/dist/framework-mounter.d.ts +43 -0
  4. package/dist/framework-mounter.js +157 -0
  5. package/dist/index.d.ts +7 -4
  6. package/dist/index.js +10 -21
  7. package/dist/routes/access/api-chart.d.ts +16 -0
  8. package/dist/routes/access/api-chart.js +47 -0
  9. package/dist/{agent/routes → routes}/access/chart.d.ts +1 -0
  10. package/dist/routes/access/chart.js +162 -0
  11. package/dist/{agent/routes → routes}/access/count-related.d.ts +0 -0
  12. package/dist/routes/access/count-related.js +31 -0
  13. package/dist/{agent/routes → routes}/access/count.d.ts +0 -0
  14. package/dist/routes/access/count.js +31 -0
  15. package/dist/{agent/routes → routes}/access/csv-related.d.ts +0 -0
  16. package/dist/routes/access/csv-related.js +33 -0
  17. package/dist/{agent/routes → routes}/access/csv.d.ts +0 -0
  18. package/dist/routes/access/csv.js +31 -0
  19. package/dist/{agent/routes → routes}/access/get.d.ts +0 -0
  20. package/dist/routes/access/get.js +29 -0
  21. package/dist/{agent/routes → routes}/access/list-related.d.ts +0 -0
  22. package/dist/routes/access/list-related.js +25 -0
  23. package/dist/{agent/routes → routes}/access/list.d.ts +0 -0
  24. package/dist/routes/access/list.js +22 -0
  25. package/dist/{agent/routes → routes}/base-route.d.ts +0 -1
  26. package/dist/routes/base-route.js +13 -0
  27. package/dist/{agent/routes → routes}/collection-route.d.ts +0 -0
  28. package/dist/{agent/routes → routes}/collection-route.js +1 -1
  29. package/dist/{agent/routes → routes}/index.d.ts +0 -0
  30. package/dist/routes/index.js +108 -0
  31. package/dist/{agent/routes → routes}/modification/action.d.ts +0 -1
  32. package/dist/routes/modification/action.js +104 -0
  33. package/dist/routes/modification/associate-related.d.ts +12 -0
  34. package/dist/routes/modification/associate-related.js +51 -0
  35. package/dist/{agent/routes → routes}/modification/create.d.ts +0 -0
  36. package/dist/routes/modification/create.js +83 -0
  37. package/dist/{agent/routes → routes}/modification/delete.d.ts +0 -0
  38. package/dist/routes/modification/delete.js +41 -0
  39. package/dist/{agent/routes → routes}/modification/dissociate-delete-related.d.ts +0 -0
  40. package/dist/routes/modification/dissociate-delete-related.js +89 -0
  41. package/dist/routes/modification/update-field.d.ts +9 -0
  42. package/dist/routes/modification/update-field.js +39 -0
  43. package/dist/{agent/routes → routes}/modification/update-relation.d.ts +0 -0
  44. package/dist/routes/modification/update-relation.js +59 -0
  45. package/dist/{agent/routes → routes}/modification/update.d.ts +0 -0
  46. package/dist/routes/modification/update.js +31 -0
  47. package/dist/{agent/routes → routes}/relation-route.d.ts +0 -0
  48. package/dist/{agent/routes → routes}/relation-route.js +1 -1
  49. package/dist/{agent/routes → routes}/security/authentication.d.ts +1 -3
  50. package/dist/routes/security/authentication.js +74 -0
  51. package/dist/{agent/routes → routes}/security/ip-whitelist.d.ts +0 -0
  52. package/dist/{agent/routes → routes}/security/ip-whitelist.js +1 -1
  53. package/dist/{agent/routes → routes}/security/scope-invalidation.d.ts +0 -0
  54. package/dist/{agent/routes → routes}/security/scope-invalidation.js +1 -1
  55. package/dist/{agent/routes → routes}/system/error-handling.d.ts +2 -0
  56. package/dist/routes/system/error-handling.js +75 -0
  57. package/dist/{agent/routes → routes}/system/healthcheck.d.ts +0 -0
  58. package/dist/{agent/routes → routes}/system/healthcheck.js +1 -1
  59. package/dist/{agent/routes → routes}/system/logger.d.ts +0 -0
  60. package/dist/{agent/routes → routes}/system/logger.js +2 -2
  61. package/dist/{agent/services → services}/index.d.ts +0 -0
  62. package/dist/{agent/services → services}/index.js +2 -2
  63. package/dist/{agent/services → services}/permissions.d.ts +0 -0
  64. package/dist/services/permissions.js +85 -0
  65. package/dist/{agent/services → services}/serializer.d.ts +0 -5
  66. package/dist/services/serializer.js +120 -0
  67. package/dist/types.d.ts +28 -3
  68. package/dist/types.js +21 -1
  69. package/dist/{agent/utils → utils}/body-parser.d.ts +0 -0
  70. package/dist/{agent/utils → utils}/body-parser.js +1 -1
  71. package/dist/utils/condition-tree-parser.d.ts +11 -0
  72. package/dist/utils/condition-tree-parser.js +53 -0
  73. package/dist/{agent/utils → utils}/context-filter-factory.d.ts +0 -0
  74. package/dist/{agent/utils → utils}/context-filter-factory.js +1 -2
  75. package/dist/{agent/utils → utils}/csv-generator.d.ts +2 -2
  76. package/dist/utils/csv-generator.js +39 -0
  77. package/dist/{agent/utils → utils}/csv-route-context.d.ts +0 -0
  78. package/dist/utils/csv-route-context.js +14 -0
  79. package/dist/{agent/utils → utils}/forest-http-api.d.ts +5 -3
  80. package/dist/utils/forest-http-api.js +180 -0
  81. package/dist/{agent/utils → utils}/forest-schema/action-values.d.ts +2 -2
  82. package/dist/utils/forest-schema/action-values.js +144 -0
  83. package/dist/{agent/utils → utils}/forest-schema/emitter.d.ts +2 -2
  84. package/dist/utils/forest-schema/emitter.js +70 -0
  85. package/dist/{agent/utils → utils}/forest-schema/filterable.d.ts +0 -0
  86. package/dist/{agent/utils → utils}/forest-schema/filterable.js +1 -1
  87. package/dist/{agent/utils → utils}/forest-schema/generator-actions.d.ts +1 -1
  88. package/dist/utils/forest-schema/generator-actions.js +99 -0
  89. package/dist/{agent/utils → utils}/forest-schema/generator-collection.d.ts +1 -1
  90. package/dist/{agent/utils → utils}/forest-schema/generator-collection.js +3 -3
  91. package/dist/{agent/utils → utils}/forest-schema/generator-fields.d.ts +1 -0
  92. package/dist/utils/forest-schema/generator-fields.js +160 -0
  93. package/dist/{agent/utils → utils}/forest-schema/generator-segments.d.ts +0 -0
  94. package/dist/{agent/utils → utils}/forest-schema/generator-segments.js +1 -1
  95. package/dist/{agent/utils → utils}/forest-schema/types.d.ts +10 -4
  96. package/dist/{agent/utils → utils}/forest-schema/types.js +1 -1
  97. package/dist/{agent/utils → utils}/forest-schema/validation.d.ts +1 -1
  98. package/dist/utils/forest-schema/validation.js +28 -0
  99. package/dist/{agent/utils → utils}/id.d.ts +0 -0
  100. package/dist/utils/id.js +43 -0
  101. package/dist/{agent/utils/http-driver-options.d.ts → utils/options-validator.d.ts} +4 -5
  102. package/dist/utils/options-validator.js +92 -0
  103. package/dist/{agent/utils → utils}/query-string.d.ts +2 -2
  104. package/dist/utils/query-string.js +134 -0
  105. package/package.json +14 -3
  106. package/CHANGELOG.md +0 -457
  107. package/dist/agent/forestadmin-http-driver.d.ts +0 -34
  108. package/dist/agent/forestadmin-http-driver.js +0 -72
  109. package/dist/agent/routes/access/chart.js +0 -147
  110. package/dist/agent/routes/access/count-related.js +0 -24
  111. package/dist/agent/routes/access/count.js +0 -24
  112. package/dist/agent/routes/access/csv-related.js +0 -33
  113. package/dist/agent/routes/access/csv.js +0 -30
  114. package/dist/agent/routes/access/get.js +0 -28
  115. package/dist/agent/routes/access/list-related.js +0 -26
  116. package/dist/agent/routes/access/list.js +0 -23
  117. package/dist/agent/routes/base-route.js +0 -16
  118. package/dist/agent/routes/index.js +0 -90
  119. package/dist/agent/routes/modification/action.js +0 -103
  120. package/dist/agent/routes/modification/associate-related.d.ts +0 -12
  121. package/dist/agent/routes/modification/associate-related.js +0 -49
  122. package/dist/agent/routes/modification/create.js +0 -81
  123. package/dist/agent/routes/modification/delete.js +0 -40
  124. package/dist/agent/routes/modification/dissociate-delete-related.js +0 -88
  125. package/dist/agent/routes/modification/update-relation.js +0 -53
  126. package/dist/agent/routes/modification/update.js +0 -29
  127. package/dist/agent/routes/security/authentication.js +0 -86
  128. package/dist/agent/routes/system/error-handling.js +0 -56
  129. package/dist/agent/services/permissions.js +0 -79
  130. package/dist/agent/services/serializer.js +0 -120
  131. package/dist/agent/types.d.ts +0 -23
  132. package/dist/agent/types.js +0 -22
  133. package/dist/agent/utils/csv-generator.js +0 -39
  134. package/dist/agent/utils/csv-route-context.js +0 -14
  135. package/dist/agent/utils/forest-http-api.js +0 -173
  136. package/dist/agent/utils/forest-schema/action-values.js +0 -144
  137. package/dist/agent/utils/forest-schema/emitter.js +0 -70
  138. package/dist/agent/utils/forest-schema/generator-actions.js +0 -99
  139. package/dist/agent/utils/forest-schema/generator-fields.js +0 -131
  140. package/dist/agent/utils/forest-schema/validation.js +0 -26
  141. package/dist/agent/utils/http-driver-options.js +0 -93
  142. package/dist/agent/utils/id.js +0 -43
  143. package/dist/agent/utils/query-string.js +0 -130
  144. package/dist/builder/agent.d.ts +0 -82
  145. package/dist/builder/agent.js +0 -123
  146. package/dist/builder/collection.d.ts +0 -148
  147. package/dist/builder/collection.js +0 -226
  148. package/dist/builder/types.d.ts +0 -5
  149. package/dist/builder/types.js +0 -3
@@ -6,12 +6,10 @@ import BaseRoute from '../base-route';
6
6
  export default class Authentication extends BaseRoute {
7
7
  readonly type = RouteType.Authentication;
8
8
  private client;
9
- private get redirectUrl();
10
9
  bootstrap(): Promise<void>;
11
10
  setupRoutes(router: Router): void;
12
11
  handleAuthentication(context: Context): Promise<void>;
13
12
  handleAuthenticationCallback(context: Context): Promise<void>;
14
- handleAuthenticationLogout(context: Context): Promise<void>;
15
- private checkRenderingId;
13
+ private static checkRenderingId;
16
14
  }
17
15
  //# sourceMappingURL=authentication.d.ts.map
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const openid_client_1 = require("openid-client");
7
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
8
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
9
+ const koa_jwt_1 = __importDefault(require("koa-jwt"));
10
+ const types_1 = require("../../types");
11
+ const base_route_1 = __importDefault(require("../base-route"));
12
+ const forest_http_api_1 = __importDefault(require("../../utils/forest-http-api"));
13
+ class Authentication extends base_route_1.default {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.type = types_1.RouteType.Authentication;
17
+ }
18
+ async bootstrap() {
19
+ // Retrieve OpenId Issuer from forestadmin-server
20
+ // We can't use 'Issuer.discover' because the oidc config is behind an auth-wall.
21
+ const issuer = new openid_client_1.Issuer(await forest_http_api_1.default.getOpenIdIssuerMetadata(this.options));
22
+ const registration = {
23
+ token_endpoint_auth_method: 'none',
24
+ };
25
+ // Register a new oidc client
26
+ this.client = await issuer.Client.register(registration, {
27
+ initialAccessToken: this.options.envSecret,
28
+ });
29
+ }
30
+ setupRoutes(router) {
31
+ router.post('/authentication', this.handleAuthentication.bind(this));
32
+ router.get('/authentication/callback', this.handleAuthenticationCallback.bind(this));
33
+ router.use((0, koa_jwt_1.default)({ secret: this.options.authSecret, cookie: 'forest_session_token' }));
34
+ }
35
+ async handleAuthentication(context) {
36
+ const renderingId = Number(context.request.body?.renderingId);
37
+ Authentication.checkRenderingId(renderingId);
38
+ const authorizationUrl = this.client.authorizationUrl({
39
+ scope: 'openid email profile',
40
+ state: JSON.stringify({ renderingId }),
41
+ });
42
+ context.response.body = { authorizationUrl };
43
+ }
44
+ async handleAuthenticationCallback(context) {
45
+ // Retrieve renderingId
46
+ const { query } = context.request;
47
+ const state = query.state.toString();
48
+ let renderingId;
49
+ try {
50
+ renderingId = JSON.parse(state).renderingId;
51
+ Authentication.checkRenderingId(renderingId);
52
+ }
53
+ catch {
54
+ throw new datasource_toolkit_1.ValidationError('Failed to retrieve renderingId from query[state]');
55
+ }
56
+ // Retrieve user
57
+ const tokenSet = await this.client.callback(undefined, query, { state });
58
+ const accessToken = tokenSet.access_token;
59
+ const user = await forest_http_api_1.default.getUserInformation(this.options, renderingId, accessToken);
60
+ // Generate final token.
61
+ const token = jsonwebtoken_1.default.sign(user, this.options.authSecret, { expiresIn: '1 hours' });
62
+ context.response.body = {
63
+ token,
64
+ tokenData: jsonwebtoken_1.default.decode(token),
65
+ };
66
+ }
67
+ static checkRenderingId(renderingId) {
68
+ if (Number.isNaN(renderingId)) {
69
+ throw new datasource_toolkit_1.ValidationError('Rendering id must be a number');
70
+ }
71
+ }
72
+ }
73
+ exports.default = Authentication;
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3NlY3VyaXR5L2F1dGhlbnRpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQWlFO0FBQ2pFLHdFQUFrRTtBQUVsRSxnRUFBd0M7QUFDeEMsc0RBQTBCO0FBRzFCLHVDQUF3QztBQUN4QywrREFBc0M7QUFDdEMsa0ZBQXdEO0FBRXhELE1BQXFCLGNBQWUsU0FBUSxvQkFBUztJQUFyRDs7UUFDVyxTQUFJLEdBQUcsaUJBQVMsQ0FBQyxjQUFjLENBQUM7SUFzRTNDLENBQUM7SUFsRVUsS0FBSyxDQUFDLFNBQVM7UUFDdEIsaURBQWlEO1FBQ2pELGlGQUFpRjtRQUNqRixNQUFNLE1BQU0sR0FBRyxJQUFJLHNCQUFNLENBQUMsTUFBTSx5QkFBYSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXJGLE1BQU0sWUFBWSxHQUFHO1lBQ25CLDBCQUEwQixFQUFFLE1BQTBCO1NBQ3ZELENBQUM7UUFFRiw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtZQUN2RCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7U0FDM0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXJGLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBQSxpQkFBRyxFQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQWdCO1FBQ2hELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5RCxjQUFjLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFN0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BELEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUN2QyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxPQUFnQjtRQUN4RCx1QkFBdUI7UUFDdkIsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxJQUFJLFdBQW1CLENBQUM7UUFFeEIsSUFBSTtZQUNGLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUM1QyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUM7UUFBQyxNQUFNO1lBQ04sTUFBTSxJQUFJLG9DQUFlLENBQUMsa0RBQWtELENBQUMsQ0FBQztTQUMvRTtRQUVELGdCQUFnQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSx5QkFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTVGLHdCQUF3QjtRQUN4QixNQUFNLEtBQUssR0FBRyxzQkFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUV6RixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRztZQUN0QixLQUFLO1lBQ0wsU0FBUyxFQUFFLHNCQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFtQjtRQUNqRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0IsTUFBTSxJQUFJLG9DQUFlLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7Q0FDRjtBQXZFRCxpQ0F1RUMifQ==
@@ -32,4 +32,4 @@ class IpWhitelist extends base_route_1.default {
32
32
  }
33
33
  }
34
34
  exports.default = IpWhitelist;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXAtd2hpdGVsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9zZWN1cml0eS9pcC13aGl0ZWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxzRUFBcUM7QUFHckMsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUN0QyxrRkFBc0Y7QUFFdEYsTUFBcUIsV0FBWSxTQUFRLG9CQUFTO0lBQWxEOztRQUNFLFNBQUksR0FBRyxpQkFBUyxDQUFDLGNBQWMsQ0FBQztJQTBCbEMsQ0FBQztJQXRCQyxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHFCQUFxQjtJQUNaLEtBQUssQ0FBQyxTQUFTO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSx5QkFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFnQixFQUFFLElBQVU7UUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLHlCQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRWxGLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFRLENBQUMsU0FBUyxFQUFFLHdCQUF3QixTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQ2hGO1NBQ0Y7UUFFRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQTNCRCw4QkEyQkMifQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXAtd2hpdGVsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9zZWN1cml0eS9pcC13aGl0ZWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxzRUFBcUM7QUFHckMsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUN0QyxrRkFBc0Y7QUFFdEYsTUFBcUIsV0FBWSxTQUFRLG9CQUFTO0lBQWxEOztRQUNFLFNBQUksR0FBRyxpQkFBUyxDQUFDLGNBQWMsQ0FBQztJQTBCbEMsQ0FBQztJQXRCQyxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHFCQUFxQjtJQUNaLEtBQUssQ0FBQyxTQUFTO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSx5QkFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFnQixFQUFFLElBQVU7UUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLHlCQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRWxGLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFRLENBQUMsU0FBUyxFQUFFLHdCQUF3QixTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQ2hGO1NBQ0Y7UUFFRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQTNCRCw4QkEyQkMifQ==
@@ -25,4 +25,4 @@ class ScopeInvalidation extends base_route_1.default {
25
25
  }
26
26
  }
27
27
  exports.default = ScopeInvalidation;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGUtaW52YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9zZWN1cml0eS9zY29wZS1pbnZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx3RUFBa0U7QUFHbEUsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUV0QyxNQUFxQixpQkFBa0IsU0FBUSxvQkFBUztJQUF4RDs7UUFDVyxTQUFJLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7SUFrQnpDLENBQUM7SUFoQkMsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCwwRkFBMEY7SUFDbEYsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFnQjtRQUM1QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsZ0JBQVEsQ0FBQyxTQUFTLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBbkJELG9DQW1CQyJ9
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGUtaW52YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9zZWN1cml0eS9zY29wZS1pbnZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx3RUFBa0U7QUFHbEUsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUV0QyxNQUFxQixpQkFBa0IsU0FBUSxvQkFBUztJQUF4RDs7UUFDVyxTQUFJLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7SUFrQnpDLENBQUM7SUFoQkMsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCwwRkFBMEY7SUFDbEYsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFnQjtRQUM1QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsZ0JBQVEsQ0FBQyxTQUFTLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBbkJELG9DQW1CQyJ9
@@ -6,6 +6,8 @@ export default class ErrorHandling extends BaseRoute {
6
6
  type: RouteType;
7
7
  setupRoutes(router: Router): void;
8
8
  private errorHandler;
9
+ private getErrorStatus;
10
+ private getErrorMessage;
9
11
  private debugLogError;
10
12
  }
11
13
  //# sourceMappingURL=error-handling.d.ts.map
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const koa_1 = require("koa");
7
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
8
+ const types_1 = require("../../types");
9
+ const base_route_1 = __importDefault(require("../base-route"));
10
+ class ErrorHandling extends base_route_1.default {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.type = types_1.RouteType.ErrorHandler;
14
+ }
15
+ setupRoutes(router) {
16
+ router.use(this.errorHandler.bind(this));
17
+ }
18
+ async errorHandler(context, next) {
19
+ try {
20
+ await next();
21
+ }
22
+ catch (e) {
23
+ context.response.status = this.getErrorStatus(e);
24
+ context.response.body = { errors: [{ detail: this.getErrorMessage(e) }] };
25
+ if (!this.options.isProduction) {
26
+ process.nextTick(() => this.debugLogError(context, e));
27
+ }
28
+ }
29
+ }
30
+ getErrorStatus(error) {
31
+ if (error instanceof datasource_toolkit_1.ValidationError)
32
+ return types_1.HttpCode.BadRequest;
33
+ if (error instanceof datasource_toolkit_1.ForbiddenError)
34
+ return types_1.HttpCode.Forbidden;
35
+ if (error instanceof datasource_toolkit_1.UnprocessableError)
36
+ return types_1.HttpCode.Unprocessable;
37
+ if (error instanceof koa_1.HttpError)
38
+ return error.status;
39
+ return types_1.HttpCode.InternalServerError;
40
+ }
41
+ getErrorMessage(error) {
42
+ if (error instanceof koa_1.HttpError ||
43
+ error instanceof datasource_toolkit_1.ValidationError ||
44
+ error instanceof datasource_toolkit_1.UnprocessableError ||
45
+ error instanceof datasource_toolkit_1.ForbiddenError) {
46
+ return error.message;
47
+ }
48
+ if (this.options.customizeErrorMessage) {
49
+ const message = this.options.customizeErrorMessage(error);
50
+ if (message)
51
+ return message;
52
+ }
53
+ return 'Unexpected error';
54
+ }
55
+ debugLogError(context, error) {
56
+ const { request } = context;
57
+ const query = JSON.stringify(request.query, null, ' ')?.replace(/"/g, '');
58
+ console.error('');
59
+ console.error(`\x1b[33m===== An exception was raised =====\x1b[0m`);
60
+ console.error(`${request.method} \x1b[34m${request.path}\x1b[36m?${query}\x1b[0m`);
61
+ if (request.method === 'POST' || request.method === 'PUT' || request.method === 'PATCH') {
62
+ const body = JSON.stringify(request.body, null, ' ')?.replace(/"/g, '');
63
+ console.error('');
64
+ console.error(`Body \x1b[36m${body}\x1b[0m`);
65
+ }
66
+ console.error('');
67
+ console.error('\x1b[31m', error.message, '\x1b[0m');
68
+ console.error('');
69
+ console.error(error.stack);
70
+ console.error(`\x1b[33m===================================\x1b[0m`);
71
+ console.error('');
72
+ }
73
+ }
74
+ exports.default = ErrorHandling;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3N5c3RlbS9lcnJvci1oYW5kbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUErQztBQUMvQyx3RUFJeUM7QUFHekMsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUV0QyxNQUFxQixhQUFjLFNBQVEsb0JBQVM7SUFBcEQ7O1FBQ0UsU0FBSSxHQUFHLGlCQUFTLENBQUMsWUFBWSxDQUFDO0lBbUVoQyxDQUFDO0lBakVDLFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFnQixFQUFFLElBQVU7UUFDckQsSUFBSTtZQUNGLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDZDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFMUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEQ7U0FDRjtJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsS0FBWTtRQUNqQyxJQUFJLEtBQUssWUFBWSxvQ0FBZTtZQUFFLE9BQU8sZ0JBQVEsQ0FBQyxVQUFVLENBQUM7UUFDakUsSUFBSSxLQUFLLFlBQVksbUNBQWM7WUFBRSxPQUFPLGdCQUFRLENBQUMsU0FBUyxDQUFDO1FBQy9ELElBQUksS0FBSyxZQUFZLHVDQUFrQjtZQUFFLE9BQU8sZ0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFDdkUsSUFBSSxLQUFLLFlBQVksZUFBUztZQUFFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUVwRCxPQUFPLGdCQUFRLENBQUMsbUJBQW1CLENBQUM7SUFDdEMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxLQUFZO1FBQ2xDLElBQ0UsS0FBSyxZQUFZLGVBQVM7WUFDMUIsS0FBSyxZQUFZLG9DQUFlO1lBQ2hDLEtBQUssWUFBWSx1Q0FBa0I7WUFDbkMsS0FBSyxZQUFZLG1DQUFjLEVBQy9CO1lBQ0EsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsSUFBSSxPQUFPO2dCQUFFLE9BQU8sT0FBTyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWdCLEVBQUUsS0FBWTtRQUNsRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUNwRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sWUFBWSxPQUFPLENBQUMsSUFBSSxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUM7UUFFbkYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtZQUN2RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBcEVELGdDQW9FQyJ9
@@ -19,4 +19,4 @@ class HealthCheck extends base_route_1.default {
19
19
  }
20
20
  }
21
21
  exports.default = HealthCheck;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL3N5c3RlbS9oZWFsdGhjaGVjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLHVDQUFrRDtBQUNsRCwrREFBc0M7QUFFdEMsTUFBcUIsV0FBWSxTQUFRLG9CQUFTO0lBQWxEOztRQUNFLFNBQUksR0FBRyxpQkFBUyxDQUFDLFdBQVcsQ0FBQztJQVUvQixDQUFDO0lBUkMsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFZO1FBQ3JDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUNqRSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxnQkFBUSxDQUFDLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFYRCw4QkFXQyJ9
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3N5c3RlbS9oZWFsdGhjaGVjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLHVDQUFrRDtBQUNsRCwrREFBc0M7QUFFdEMsTUFBcUIsV0FBWSxTQUFRLG9CQUFTO0lBQWxEOztRQUNFLFNBQUksR0FBRyxpQkFBUyxDQUFDLFdBQVcsQ0FBQztJQVUvQixDQUFDO0lBUkMsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFZO1FBQ3JDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUNqRSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxnQkFBUSxDQUFDLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFYRCw4QkFXQyJ9
File without changes
@@ -8,7 +8,7 @@ const base_route_1 = __importDefault(require("../base-route"));
8
8
  class Logger extends base_route_1.default {
9
9
  constructor() {
10
10
  super(...arguments);
11
- this.type = types_1.RouteType.Logger;
11
+ this.type = types_1.RouteType.LoggerHandler;
12
12
  }
13
13
  setupRoutes(router) {
14
14
  router.use(this.logger.bind(this));
@@ -32,4 +32,4 @@ class Logger extends base_route_1.default {
32
32
  }
33
33
  }
34
34
  exports.default = Logger;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9zeXN0ZW0vbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUV0QyxNQUFxQixNQUFPLFNBQVEsb0JBQVM7SUFBN0M7O1FBQ0UsU0FBSSxHQUFHLGlCQUFTLENBQUMsTUFBTSxDQUFDO0lBdUIxQixDQUFDO0lBckJDLFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFnQixFQUFFLElBQVU7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUk7WUFDRixNQUFNLElBQUksRUFBRSxDQUFDO1NBQ2Q7Z0JBQVM7WUFDUixJQUFJLFFBQVEsR0FBZ0IsTUFBTSxDQUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksZ0JBQVEsQ0FBQyxVQUFVO2dCQUFFLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdEUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxnQkFBUSxDQUFDLG1CQUFtQjtnQkFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBRWhGLElBQUksT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM3QyxPQUFPLElBQUksSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLElBQUksQ0FBQztZQUV4QyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0NBQ0Y7QUF4QkQseUJBd0JDIn0=
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9zeXN0ZW0vbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUV0QyxNQUFxQixNQUFPLFNBQVEsb0JBQVM7SUFBN0M7O1FBQ0UsU0FBSSxHQUFHLGlCQUFTLENBQUMsYUFBYSxDQUFDO0lBdUJqQyxDQUFDO0lBckJDLFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFnQixFQUFFLElBQVU7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUk7WUFDRixNQUFNLElBQUksRUFBRSxDQUFDO1NBQ2Q7Z0JBQVM7WUFDUixJQUFJLFFBQVEsR0FBZ0IsTUFBTSxDQUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksZ0JBQVEsQ0FBQyxVQUFVO2dCQUFFLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdEUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxnQkFBUSxDQUFDLG1CQUFtQjtnQkFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBRWhGLElBQUksT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM3QyxPQUFPLElBQUksSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLElBQUksQ0FBQztZQUV4QyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0NBQ0Y7QUF4QkQseUJBd0JDIn0=
File without changes
@@ -7,6 +7,6 @@ const permissions_1 = __importDefault(require("./permissions"));
7
7
  const serializer_1 = __importDefault(require("./serializer"));
8
8
  exports.default = (options) => ({
9
9
  permissions: new permissions_1.default(options),
10
- serializer: new serializer_1.default(options),
10
+ serializer: new serializer_1.default(),
11
11
  });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWdlbnQvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxnRUFBOEM7QUFDOUMsOERBQXNDO0FBT3RDLGtCQUFlLENBQUMsT0FBaUMsRUFBaUMsRUFBRSxDQUFDLENBQUM7SUFDcEYsV0FBVyxFQUFFLElBQUkscUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQzNDLFVBQVUsRUFBRSxJQUFJLG9CQUFVLENBQUMsT0FBTyxDQUFDO0NBQ3BDLENBQUMsQ0FBQyJ9
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxnRUFBOEM7QUFDOUMsOERBQXNDO0FBT3RDLGtCQUFlLENBQUMsT0FBaUMsRUFBaUMsRUFBRSxDQUFDLENBQUM7SUFDcEYsV0FBVyxFQUFFLElBQUkscUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQzNDLFVBQVUsRUFBRSxJQUFJLG9CQUFVLEVBQUU7Q0FDN0IsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const lru_cache_1 = __importDefault(require("lru-cache"));
7
+ const object_hash_1 = __importDefault(require("object-hash"));
8
+ const types_1 = require("../types");
9
+ const condition_tree_parser_1 = __importDefault(require("../utils/condition-tree-parser"));
10
+ const forest_http_api_1 = __importDefault(require("../utils/forest-http-api"));
11
+ class PermissionService {
12
+ constructor(options) {
13
+ this.options = options;
14
+ this.cache = new lru_cache_1.default({
15
+ max: 256,
16
+ ttl: this.options.permissionsCacheDurationInSeconds * 1000,
17
+ });
18
+ }
19
+ invalidateCache(renderingId) {
20
+ this.cache.delete(renderingId);
21
+ }
22
+ /** Checks that a charting query is in the list of allowed queries */
23
+ async canChart(context) {
24
+ // If the permissions level already allow the chart, no need to check further
25
+ if (['admin', 'editor', 'developer'].includes(context.state.user.permissionLevel)) {
26
+ return;
27
+ }
28
+ const chart = { ...context.request.body };
29
+ // When the server sends the data of the allowed charts, the target column is not specified
30
+ // for relations => allow them all.
31
+ if (chart?.group_by_field?.includes(':'))
32
+ chart.group_by_field = chart.group_by_field.substring(0, chart.group_by_field.indexOf(':'));
33
+ const chartHash = (0, object_hash_1.default)(chart, {
34
+ respectType: false,
35
+ excludeKeys: key => chart[key] === null,
36
+ });
37
+ await this.can(context, `chart:${chartHash}`);
38
+ }
39
+ /** Check if a user is allowed to perform a specific action */
40
+ async can(context, action, allowRefetch = true) {
41
+ const { id: userId, renderingId } = context.state.user;
42
+ const perms = await this.getRenderingPermissions(renderingId);
43
+ const isAllowed = perms.actions.has(action) || perms.actionsByUser[action]?.has(userId);
44
+ if (!isAllowed && allowRefetch) {
45
+ this.invalidateCache(renderingId);
46
+ return this.can(context, action, false);
47
+ }
48
+ if (!isAllowed) {
49
+ context.throw(types_1.HttpCode.Forbidden, 'Forbidden');
50
+ }
51
+ }
52
+ async getScope(collection, context) {
53
+ const { user } = context.state;
54
+ const perms = await this.getRenderingPermissions(user.renderingId);
55
+ const scopes = perms.scopes[collection.name];
56
+ if (!scopes)
57
+ return null;
58
+ const conditionTree = condition_tree_parser_1.default.fromPlainObject(collection, scopes.conditionTree);
59
+ return conditionTree.replaceLeafs(leaf => {
60
+ const dynamicValues = scopes.dynamicScopeValues?.[user.id];
61
+ if (typeof leaf.value === 'string' && leaf.value.startsWith('$currentUser')) {
62
+ // Search replacement hash from forestadmin server
63
+ if (dynamicValues) {
64
+ return leaf.override({ value: dynamicValues[leaf.value] });
65
+ }
66
+ // Search JWT token (new user)
67
+ return leaf.override({
68
+ value: leaf.value.startsWith('$currentUser.tags.')
69
+ ? user.tags[leaf.value.substring(18)]
70
+ : user[leaf.value.substring(13)],
71
+ });
72
+ }
73
+ return leaf;
74
+ });
75
+ }
76
+ /** Get cached version of "rendering permissions" */
77
+ getRenderingPermissions(renderingId) {
78
+ if (!this.cache.has(renderingId))
79
+ this.cache.set(renderingId, forest_http_api_1.default.getPermissions(this.options, renderingId));
80
+ // We already checked the entry is up-to-date with the .has() call => allowStale
81
+ return this.cache.get(renderingId, { allowStale: true });
82
+ }
83
+ }
84
+ exports.default = PermissionService;
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwREFBaUM7QUFDakMsOERBQXFDO0FBRXJDLG9DQUE4RDtBQUM5RCwyRkFBaUU7QUFDakUsK0VBQStFO0FBTy9FLE1BQXFCLGlCQUFpQjtJQUlwQyxZQUFZLE9BQXFCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxtQkFBUSxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQWlDLEdBQUcsSUFBSTtTQUMzRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLFdBQW1CO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFnQjtRQUM3Qiw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ2pGLE9BQU87U0FDUjtRQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTFDLDJGQUEyRjtRQUMzRixtQ0FBbUM7UUFDbkMsSUFBSSxLQUFLLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDdEMsS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFP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
@@ -1,10 +1,6 @@
1
1
  import { Collection, RecordData } from '@forestadmin/datasource-toolkit';
2
- import { AgentOptionsWithDefaults } from '../types';
3
- declare type SerializerOptions = Pick<AgentOptionsWithDefaults, 'prefix'>;
4
2
  export default class Serializer {
5
3
  private readonly serializers;
6
- private readonly prefix;
7
- constructor(options: SerializerOptions);
8
4
  serialize(collection: Collection, data: RecordData | RecordData[]): unknown;
9
5
  deserialize(collection: Collection, body: unknown): RecordData;
10
6
  serializeWithSearchMetadata(collection: Collection, data: RecordData[], searchValue: string): unknown;
@@ -13,5 +9,4 @@ export default class Serializer {
13
9
  private buildRelationshipsConfiguration;
14
10
  private stripUndefinedsInPlace;
15
11
  }
16
- export {};
17
12
  //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
7
+ const json_api_serializer_1 = __importDefault(require("json-api-serializer"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const id_1 = __importDefault(require("../utils/id"));
10
+ class Serializer {
11
+ constructor() {
12
+ // No need to keep references to serializers for outdated schemas => weakmap.
13
+ this.serializers = new WeakMap();
14
+ }
15
+ serialize(collection, data) {
16
+ const result = this.getSerializer(collection).serialize(collection.name, data);
17
+ this.stripUndefinedsInPlace(result);
18
+ return result;
19
+ }
20
+ deserialize(collection, body) {
21
+ return this.getSerializer(collection).deserialize(collection.name, body);
22
+ }
23
+ serializeWithSearchMetadata(collection, data, searchValue) {
24
+ const results = this.serialize(collection, data);
25
+ if (searchValue && searchValue.trim().length > 0) {
26
+ const resultsData = results.data;
27
+ const decorators = resultsData.reduce((decorator, record) => {
28
+ const search = Object.keys(record.attributes).filter(attribute => {
29
+ const value = record.attributes[attribute];
30
+ return value && value.toString().toLowerCase().includes(searchValue.toLowerCase());
31
+ });
32
+ if (search.length === 0) {
33
+ return decorator;
34
+ }
35
+ return { ...decorator, [Object.keys(decorator).length]: { id: record.id, search } };
36
+ }, {});
37
+ if (Object.values(decorators).length === 0) {
38
+ return results;
39
+ }
40
+ results.meta = { decorators };
41
+ }
42
+ return results;
43
+ }
44
+ getSerializer(collection) {
45
+ if (this.serializers.has(collection.schema)) {
46
+ return this.serializers.get(collection.schema);
47
+ }
48
+ const serializer = new json_api_serializer_1.default();
49
+ for (const sibling of collection.dataSource.collections) {
50
+ this.registerCollection(sibling, serializer);
51
+ this.serializers.set(sibling.schema, serializer);
52
+ }
53
+ return serializer;
54
+ }
55
+ registerCollection(collection, serializer) {
56
+ serializer.register(collection.name, {
57
+ id: 'forestId',
58
+ relationships: this.buildRelationshipsConfiguration(collection),
59
+ beforeSerialize: (data) => {
60
+ const copy = { ...data };
61
+ copy.forestId = id_1.default.packId(collection.schema, data);
62
+ return copy;
63
+ },
64
+ afterDeserialize: (data) => {
65
+ const copy = { ...data };
66
+ if (data.forestId) {
67
+ const parts = id_1.default.unpackId(collection.schema, data.forestId);
68
+ const primaryKeys = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(collection.schema);
69
+ primaryKeys.forEach((field, index) => {
70
+ copy[field] = parts[index];
71
+ });
72
+ }
73
+ delete copy.forestId;
74
+ return copy;
75
+ },
76
+ });
77
+ }
78
+ buildRelationshipsConfiguration(collection) {
79
+ const relationships = {};
80
+ const urlPrefix = path_1.default.posix.join('/forest', collection.name);
81
+ for (const [name, field] of Object.entries(collection.schema.fields)) {
82
+ if (field.type === 'ManyToOne' || field.type === 'OneToOne') {
83
+ relationships[name] = {
84
+ type: field.foreignCollection,
85
+ deserialize: (data) => {
86
+ const foreignCollection = collection.dataSource.getCollection(field.foreignCollection);
87
+ return id_1.default.unpackId(foreignCollection.schema, data.id);
88
+ },
89
+ };
90
+ }
91
+ if (field.type === 'ManyToMany' || field.type === 'OneToMany') {
92
+ relationships[name] = {
93
+ type: field.foreignCollection,
94
+ links: (data) => ({
95
+ related: {
96
+ href: `${urlPrefix}/${data.forestId}/relationships/${name}`,
97
+ },
98
+ }),
99
+ };
100
+ }
101
+ }
102
+ return relationships;
103
+ }
104
+ stripUndefinedsInPlace(record) {
105
+ if (record === null || typeof record !== 'object') {
106
+ return;
107
+ }
108
+ const indexable = record;
109
+ for (const key of Object.keys(indexable)) {
110
+ if (indexable[key] === undefined) {
111
+ delete indexable[key];
112
+ }
113
+ else {
114
+ this.stripUndefinedsInPlace(indexable[key]);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ exports.default = Serializer;
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBS3lDO0FBQ3pDLDhFQUFvRDtBQUNwRCxnREFBd0I7QUFFeEIscURBQWtDO0FBSWxDLE1BQXFCLFVBQVU7SUFBL0I7UUFDRSw2RUFBNkU7UUFDNUQsZ0JBQVcsR0FBaUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQXlJN0YsQ0FBQztJQXZJQyxTQUFTLENBQUMsVUFBc0IsRUFBRSxJQUErQjtRQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFVBQXNCLEVBQUUsSUFBYTtRQUMvQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELDJCQUEyQixDQUN6QixVQUFzQixFQUN0QixJQUFrQixFQUNsQixXQUFtQjtRQUVuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQWUsQ0FBQztRQUUvRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBb0IsQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQWtCLEVBQUUsRUFBRTtn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
package/dist/types.d.ts CHANGED
@@ -1,16 +1,41 @@
1
- import { Logger, LoggerLevel } from '@forestadmin/datasource-toolkit';
1
+ /// <reference types="node" />
2
+ import { CompositeId, Logger, LoggerLevel } from '@forestadmin/datasource-toolkit';
3
+ import { IncomingMessage, ServerResponse } from 'http';
2
4
  /** Options to configure behavior of an agent's forestadmin driver */
3
5
  export declare type AgentOptions = {
4
- agentUrl: string;
5
6
  authSecret: string;
6
- clientId?: string;
7
7
  envSecret: string;
8
+ customizeErrorMessage?: ((error: Error) => string | null) | null;
8
9
  forestServerUrl?: string;
9
10
  logger?: Logger;
10
11
  loggerLevel?: LoggerLevel;
11
12
  prefix?: string;
12
13
  isProduction: boolean;
13
14
  schemaPath?: string;
15
+ typingsPath?: string | null;
16
+ typingsMaxDepth?: number;
14
17
  permissionsCacheDurationInSeconds?: number;
15
18
  };
19
+ export declare type AgentOptionsWithDefaults = Readonly<Required<AgentOptions>>;
20
+ export declare type HttpCallback = (req: IncomingMessage, res: ServerResponse) => void;
21
+ export declare enum HttpCode {
22
+ BadRequest = 400,
23
+ Forbidden = 403,
24
+ InternalServerError = 500,
25
+ NoContent = 204,
26
+ NotFound = 404,
27
+ Ok = 200,
28
+ Unprocessable = 422
29
+ }
30
+ export declare enum RouteType {
31
+ LoggerHandler = 0,
32
+ ErrorHandler = 1,
33
+ PublicRoute = 2,
34
+ Authentication = 3,
35
+ PrivateRoute = 4
36
+ }
37
+ export declare type SelectionIds = {
38
+ areExcluded: boolean;
39
+ ids: CompositeId[];
40
+ };
16
41
  //# sourceMappingURL=types.d.ts.map
package/dist/types.js CHANGED
@@ -1,3 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
3
+ exports.RouteType = exports.HttpCode = void 0;
4
+ var HttpCode;
5
+ (function (HttpCode) {
6
+ HttpCode[HttpCode["BadRequest"] = 400] = "BadRequest";
7
+ HttpCode[HttpCode["Forbidden"] = 403] = "Forbidden";
8
+ HttpCode[HttpCode["InternalServerError"] = 500] = "InternalServerError";
9
+ HttpCode[HttpCode["NoContent"] = 204] = "NoContent";
10
+ HttpCode[HttpCode["NotFound"] = 404] = "NotFound";
11
+ HttpCode[HttpCode["Ok"] = 200] = "Ok";
12
+ HttpCode[HttpCode["Unprocessable"] = 422] = "Unprocessable";
13
+ })(HttpCode = exports.HttpCode || (exports.HttpCode = {}));
14
+ var RouteType;
15
+ (function (RouteType) {
16
+ // Changing the values of this enum changes the order in which routes are loaded into koa-router.
17
+ RouteType[RouteType["LoggerHandler"] = 0] = "LoggerHandler";
18
+ RouteType[RouteType["ErrorHandler"] = 1] = "ErrorHandler";
19
+ RouteType[RouteType["PublicRoute"] = 2] = "PublicRoute";
20
+ RouteType[RouteType["Authentication"] = 3] = "Authentication";
21
+ RouteType[RouteType["PrivateRoute"] = 4] = "PrivateRoute";
22
+ })(RouteType = exports.RouteType || (exports.RouteType = {}));
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLElBQVksUUFRWDtBQVJELFdBQVksUUFBUTtJQUNsQixxREFBZ0IsQ0FBQTtJQUNoQixtREFBZSxDQUFBO0lBQ2YsdUVBQXlCLENBQUE7SUFDekIsbURBQWUsQ0FBQTtJQUNmLGlEQUFjLENBQUE7SUFDZCxxQ0FBUSxDQUFBO0lBQ1IsMkRBQW1CLENBQUE7QUFDckIsQ0FBQyxFQVJXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBUW5CO0FBRUQsSUFBWSxTQU9YO0FBUEQsV0FBWSxTQUFTO0lBQ25CLGlHQUFpRztJQUNqRywyREFBaUIsQ0FBQTtJQUNqQix5REFBZ0IsQ0FBQTtJQUNoQix1REFBZSxDQUFBO0lBQ2YsNkRBQWtCLENBQUE7SUFDbEIseURBQWdCLENBQUE7QUFDbEIsQ0FBQyxFQVBXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBT3BCIn0=
File without changes
@@ -15,4 +15,4 @@ class BodyParser {
15
15
  }
16
16
  }
17
17
  exports.default = BodyParser;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWdlbnQvdXRpbHMvYm9keS1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSw4Q0FBMkI7QUFFM0IsTUFBcUIsVUFBVTtJQUM3QixNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBd0IsRUFBRSxPQUFnQjtRQUNqRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDdkYsR0FBRyxHQUFHLFlBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxRixPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQVZELDZCQVVDIn0=
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYm9keS1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSw4Q0FBMkI7QUFFM0IsTUFBcUIsVUFBVTtJQUM3QixNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBd0IsRUFBRSxPQUFnQjtRQUNqRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDdkYsR0FBRyxHQUFHLFlBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxRixPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQVZELDZCQVVDIn0=
@@ -0,0 +1,11 @@
1
+ import { Collection, ConditionTree } from '@forestadmin/datasource-toolkit';
2
+ export default class ConditionTreeParser {
3
+ static fromPlainObject(collection: Collection, json: unknown): ConditionTree;
4
+ /** Handle 'In' where the frontend unexpectedly sends strings */
5
+ private static parseValue;
6
+ /** Convert snake_case to PascalCase */
7
+ private static toPascalCase;
8
+ private static isLeaf;
9
+ private static isBranch;
10
+ }
11
+ //# sourceMappingURL=condition-tree-parser.d.ts.map