@forestadmin/agent 1.0.0-beta.60 → 1.0.0-beta.62

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 (134) hide show
  1. package/dist/{builder/agent.d.ts → agent.d.ts} +16 -11
  2. package/dist/agent.js +133 -0
  3. package/dist/{builder/framework-mounter.d.ts → framework-mounter.d.ts} +0 -0
  4. package/dist/{builder/framework-mounter.js → framework-mounter.js} +1 -1
  5. package/dist/index.d.ts +5 -5
  6. package/dist/index.js +5 -20
  7. package/dist/{agent/routes → routes}/access/api-chart.d.ts +0 -0
  8. package/dist/{agent/routes → routes}/access/api-chart.js +1 -1
  9. package/dist/{agent/routes → routes}/access/chart.d.ts +0 -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/{agent/routes → routes}/access/count-related.js +1 -1
  13. package/dist/{agent/routes → routes}/access/count.d.ts +0 -0
  14. package/dist/{agent/routes → routes}/access/count.js +1 -1
  15. package/dist/{agent/routes → routes}/access/csv-related.d.ts +0 -0
  16. package/dist/{agent/routes → routes}/access/csv-related.js +1 -1
  17. package/dist/{agent/routes → routes}/access/csv.d.ts +0 -0
  18. package/dist/{agent/routes → routes}/access/csv.js +1 -1
  19. package/dist/{agent/routes → routes}/access/get.d.ts +0 -0
  20. package/dist/{agent/routes → routes}/access/get.js +1 -1
  21. package/dist/{agent/routes → routes}/access/list-related.d.ts +0 -0
  22. package/dist/{agent/routes → routes}/access/list-related.js +1 -1
  23. package/dist/{agent/routes → routes}/access/list.d.ts +0 -0
  24. package/dist/{agent/routes → routes}/access/list.js +1 -1
  25. package/dist/{agent/routes → routes}/base-route.d.ts +0 -0
  26. package/dist/{agent/routes → routes}/base-route.js +1 -1
  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/{agent/routes → routes}/index.js +1 -1
  31. package/dist/{agent/routes → routes}/modification/action.d.ts +0 -0
  32. package/dist/routes/modification/action.js +104 -0
  33. package/dist/{agent/routes → routes}/modification/associate-related.d.ts +0 -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/{agent/routes → routes}/modification/delete.js +1 -1
  39. package/dist/{agent/routes → routes}/modification/dissociate-delete-related.d.ts +0 -0
  40. package/dist/{agent/routes → routes}/modification/dissociate-delete-related.js +1 -1
  41. package/dist/{agent/routes → routes}/modification/update-field.d.ts +0 -0
  42. package/dist/{agent/routes → routes}/modification/update-field.js +1 -1
  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 +0 -0
  50. package/dist/{agent/routes → routes}/security/authentication.js +1 -1
  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 +0 -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 +1 -1
  63. package/dist/{agent/services → services}/permissions.d.ts +0 -0
  64. package/dist/{agent/services → services}/permissions.js +1 -1
  65. package/dist/{agent/services → services}/serializer.d.ts +0 -0
  66. package/dist/services/serializer.js +120 -0
  67. package/dist/types.d.ts +25 -1
  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/{agent/utils → utils}/condition-tree-parser.d.ts +0 -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 -1
  75. package/dist/{agent/utils → utils}/csv-generator.d.ts +0 -0
  76. package/dist/{agent/utils → utils}/csv-generator.js +1 -1
  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 +1 -1
  80. package/dist/utils/forest-http-api.js +180 -0
  81. package/dist/{agent/utils → utils}/forest-schema/action-values.d.ts +0 -0
  82. package/dist/utils/forest-schema/action-values.js +144 -0
  83. package/dist/{agent/utils → utils}/forest-schema/emitter.d.ts +1 -1
  84. package/dist/{agent/utils → utils}/forest-schema/emitter.js +2 -2
  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 +0 -0
  88. package/dist/{agent/utils → utils}/forest-schema/generator-actions.js +1 -1
  89. package/dist/{agent/utils → utils}/forest-schema/generator-collection.d.ts +0 -0
  90. package/dist/{agent/utils → utils}/forest-schema/generator-collection.js +1 -1
  91. package/dist/{agent/utils → utils}/forest-schema/generator-fields.d.ts +0 -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 +0 -0
  96. package/dist/{agent/utils → utils}/forest-schema/types.js +1 -1
  97. package/dist/{agent/utils → utils}/forest-schema/validation.d.ts +0 -0
  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/{builder/utils → utils}/options-validator.d.ts +1 -2
  102. package/dist/{builder/utils → utils}/options-validator.js +1 -1
  103. package/dist/{agent/utils → utils}/query-string.d.ts +0 -0
  104. package/dist/utils/query-string.js +134 -0
  105. package/package.json +8 -7
  106. package/dist/agent/forestadmin-http-driver.d.ts +0 -12
  107. package/dist/agent/forestadmin-http-driver.js +0 -43
  108. package/dist/agent/routes/access/chart.js +0 -162
  109. package/dist/agent/routes/modification/action.js +0 -104
  110. package/dist/agent/routes/modification/associate-related.js +0 -51
  111. package/dist/agent/routes/modification/create.js +0 -83
  112. package/dist/agent/routes/modification/update-relation.js +0 -59
  113. package/dist/agent/routes/modification/update.js +0 -31
  114. package/dist/agent/routes/system/error-handling.js +0 -75
  115. package/dist/agent/services/serializer.js +0 -120
  116. package/dist/agent/types.d.ts +0 -24
  117. package/dist/agent/types.js +0 -23
  118. package/dist/agent/utils/condition-tree-parser.js +0 -53
  119. package/dist/agent/utils/csv-route-context.js +0 -14
  120. package/dist/agent/utils/forest-http-api.js +0 -180
  121. package/dist/agent/utils/forest-schema/action-values.js +0 -144
  122. package/dist/agent/utils/forest-schema/generator-fields.js +0 -160
  123. package/dist/agent/utils/forest-schema/validation.js +0 -28
  124. package/dist/agent/utils/id.js +0 -43
  125. package/dist/agent/utils/query-string.js +0 -134
  126. package/dist/builder/agent.js +0 -114
  127. package/dist/builder/collection.d.ts +0 -256
  128. package/dist/builder/collection.js +0 -398
  129. package/dist/builder/decorators-stack.d.ts +0 -25
  130. package/dist/builder/decorators-stack.js +0 -40
  131. package/dist/builder/types.d.ts +0 -18
  132. package/dist/builder/types.js +0 -3
  133. package/dist/builder/utils/typing-generator.d.ts +0 -15
  134. package/dist/builder/utils/typing-generator.js +0 -125
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
4
- class ConditionTreeParser {
5
- static fromPlainObject(collection, json) {
6
- if (ConditionTreeParser.isLeaf(json)) {
7
- const operator = ConditionTreeParser.toPascalCase(json.operator);
8
- const value = ConditionTreeParser.parseValue(collection, { ...json, operator });
9
- return new datasource_toolkit_1.ConditionTreeLeaf(json.field, operator, value);
10
- }
11
- if (ConditionTreeParser.isBranch(json)) {
12
- const aggregator = ConditionTreeParser.toPascalCase(json.aggregator);
13
- const conditions = json.conditions.map(subTree => ConditionTreeParser.fromPlainObject(collection, subTree));
14
- return conditions.length !== 1
15
- ? new datasource_toolkit_1.ConditionTreeBranch(aggregator, conditions)
16
- : conditions[0];
17
- }
18
- throw new Error('Failed to instantiate condition tree from json');
19
- }
20
- /** Handle 'In' where the frontend unexpectedly sends strings */
21
- static parseValue(collection, leaf) {
22
- const schema = datasource_toolkit_1.CollectionUtils.getFieldSchema(collection, leaf.field);
23
- if (leaf.operator === 'In' && typeof leaf.value === 'string') {
24
- if (schema.columnType === 'Boolean') {
25
- return leaf.value
26
- .split(',')
27
- .map(bool => !['false', '0', 'no'].includes(bool.toLowerCase().trim()));
28
- }
29
- if (schema.columnType === 'Number') {
30
- return leaf.value
31
- .split(',')
32
- .map(string => Number(string.trim()))
33
- .filter(number => !Number.isNaN(number) && Number.isFinite(number));
34
- }
35
- return leaf.value.split(',').map(v => v.trim());
36
- }
37
- return leaf.value;
38
- }
39
- /** Convert snake_case to PascalCase */
40
- static toPascalCase(value) {
41
- const pascalCased = value.slice(0, 1).toUpperCase() +
42
- value.slice(1).replace(/_[a-z]/g, match => match.slice(1).toUpperCase());
43
- return pascalCased;
44
- }
45
- static isLeaf(raw) {
46
- return typeof raw === 'object' && 'field' in raw && 'operator' in raw;
47
- }
48
- static isBranch(raw) {
49
- return typeof raw === 'object' && 'aggregator' in raw && 'conditions' in raw;
50
- }
51
- }
52
- exports.default = ConditionTreeParser;
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXRyZWUtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FnZW50L3V0aWxzL2NvbmRpdGlvbi10cmVlLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdFQVN5QztBQUV6QyxNQUFxQixtQkFBbUI7SUFDdEMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFzQixFQUFFLElBQWE7UUFDMUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRSxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUVoRixPQUFPLElBQUksc0NBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0Q7UUFFRCxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QyxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBZSxDQUFDO1lBQ25GLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQy9DLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ3pELENBQUM7WUFFRixPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLElBQUksd0NBQW1CLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDakQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsZ0VBQWdFO0lBQ3hELE1BQU0sQ0FBQyxVQUFVLENBQ3ZCLFVBQXNCLEVBQ3RCLElBQXlEO1FBRXpELE1BQU0sTUFBTSxHQUFHLG9DQUFlLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFpQixDQUFDO1FBRXRGLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM1RCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO2dCQUNuQyxPQUFPLElBQUksQ0FBQyxLQUFLO3FCQUNkLEtBQUssQ0FBQyxHQUFHLENBQUM7cUJBQ1YsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDM0U7WUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFO2dCQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLO3FCQUNkLEtBQUssQ0FBQyxHQUFHLENBQUM7cUJBQ1YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ3ZFO1lBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNqRDtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsdUNBQXVDO0lBQy9CLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBYTtRQUN2QyxNQUFNLFdBQVcsR0FDZixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDL0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sV0FBdUIsQ0FBQztJQUNqQyxDQUFDO0lBRU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFZO1FBQ2hDLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxHQUFHLElBQUksVUFBVSxJQUFJLEdBQUcsQ0FBQztJQUN4RSxDQUFDO0lBRU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFZO1FBQ2xDLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLFlBQVksSUFBSSxHQUFHLElBQUksWUFBWSxJQUFJLEdBQUcsQ0FBQztJQUMvRSxDQUFDO0NBQ0Y7QUFsRUQsc0NBa0VDIn0=
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class CsvRouteContext {
4
- static buildResponse(context) {
5
- const { filename } = context.request.query;
6
- context.response.type = 'text/csv; charset=utf-8';
7
- context.response.attachment(`attachment; filename=${filename}`);
8
- context.response.lastModified = new Date();
9
- context.response.set({ 'X-Accel-Buffering': 'no' });
10
- context.response.set({ 'Cache-Control': 'no-cache' });
11
- }
12
- }
13
- exports.default = CsvRouteContext;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LXJvdXRlLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWdlbnQvdXRpbHMvY3N2LXJvdXRlLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxNQUFxQixlQUFlO0lBQ2xDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBZ0I7UUFDbkMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRTNDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLHlCQUF5QixDQUFDO1FBQ2xELE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLHdCQUF3QixRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGO0FBVkQsa0NBVUMifQ==
@@ -1,180 +0,0 @@
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 object_hash_1 = __importDefault(require("object-hash"));
7
- const superagent_1 = __importDefault(require("superagent"));
8
- class ForestHttpApi {
9
- static async getIpWhitelistConfiguration(options) {
10
- try {
11
- const response = await superagent_1.default
12
- .get(new URL('/liana/v1/ip-whitelist-rules', options.forestServerUrl).toString())
13
- .set('forest-secret-key', options.envSecret);
14
- const { attributes } = response.body.data;
15
- return { isFeatureEnabled: attributes.use_ip_whitelist, ipRules: attributes.rules };
16
- }
17
- catch (e) {
18
- this.handleResponseError(e);
19
- }
20
- }
21
- static async getOpenIdIssuerMetadata(options) {
22
- try {
23
- const response = await superagent_1.default
24
- .get(new URL('/oidc/.well-known/openid-configuration', options.forestServerUrl).toString())
25
- .set('forest-secret-key', options.envSecret);
26
- return response.body;
27
- }
28
- catch (e) {
29
- this.handleResponseError(e);
30
- }
31
- }
32
- static async getUserInformation(options, renderingId, accessToken) {
33
- try {
34
- const url = new URL(`/liana/v2/renderings/${renderingId}/authorization`, options.forestServerUrl);
35
- const response = await superagent_1.default
36
- .get(url.toString())
37
- .set('forest-token', accessToken)
38
- .set('forest-secret-key', options.envSecret);
39
- const { attributes, id } = response.body.data;
40
- return {
41
- id: Number(id),
42
- email: attributes.email,
43
- firstName: attributes.first_name,
44
- lastName: attributes.last_name,
45
- team: attributes.teams[0],
46
- role: attributes.role,
47
- tags: attributes.tags?.reduce((memo, { key, value }) => ({ ...memo, [key]: value }), {}),
48
- renderingId,
49
- permissionLevel: attributes.permission_level,
50
- };
51
- }
52
- catch (e) {
53
- this.handleResponseError(e);
54
- }
55
- }
56
- static async hasSchema(options, hash) {
57
- try {
58
- const response = await superagent_1.default
59
- .post(new URL('/forest/apimaps/hashcheck', options.forestServerUrl).toString())
60
- .send({ schemaFileHash: hash })
61
- .set('forest-secret-key', options.envSecret);
62
- return !response?.body?.sendSchema;
63
- }
64
- catch (e) {
65
- this.handleResponseError(e);
66
- }
67
- }
68
- static async uploadSchema(options, apimap) {
69
- try {
70
- await superagent_1.default
71
- .post(new URL('/forest/apimaps', options.forestServerUrl).toString())
72
- .send(apimap)
73
- .set('forest-secret-key', options.envSecret);
74
- }
75
- catch (e) {
76
- this.handleResponseError(e);
77
- }
78
- }
79
- static async getPermissions(options, renderingId) {
80
- try {
81
- const { body } = await superagent_1.default
82
- .get(`${options.forestServerUrl}/liana/v3/permissions`)
83
- .set('forest-secret-key', options.envSecret)
84
- .query(`renderingId=${renderingId}`);
85
- if (!body.meta?.rolesACLActivated) {
86
- throw new Error('Roles V2 are unsupported');
87
- }
88
- const actions = new Set();
89
- const actionsByUser = {};
90
- ForestHttpApi.decodeChartPermissions(body?.stats ?? {}, actions);
91
- ForestHttpApi.decodeActionPermissions(body?.data?.collections ?? {}, actions, actionsByUser);
92
- return {
93
- actions,
94
- actionsByUser,
95
- scopes: ForestHttpApi.decodeScopePermissions(body?.data?.renderings?.[renderingId] ?? {}),
96
- };
97
- }
98
- catch (e) {
99
- this.handleResponseError(e);
100
- }
101
- }
102
- /** Helper to format permissions into something easy to validate against */
103
- static decodeChartPermissions(chartsByType, actions) {
104
- const serverCharts = Object.values(chartsByType).flat();
105
- const frontendCharts = serverCharts.map(chart => ({
106
- type: chart.type,
107
- filters: chart.filter,
108
- aggregate: chart.aggregator,
109
- aggregate_field: chart.aggregateFieldName,
110
- collection: chart.sourceCollectionId,
111
- time_range: chart.timeRange,
112
- group_by_date_field: (chart.type === 'Line' && chart.groupByFieldName) || null,
113
- group_by_field: (chart.type !== 'Line' && chart.groupByFieldName) || null,
114
- limit: chart.limit,
115
- label_field: chart.labelFieldName,
116
- relationship_field: chart.relationshipFieldName,
117
- }));
118
- const hashes = frontendCharts.map(chart => (0, object_hash_1.default)(chart, {
119
- respectType: false,
120
- excludeKeys: key => chart[key] === null || chart[key] === undefined,
121
- }));
122
- hashes.forEach(hash => actions.add(`chart:${hash}`));
123
- }
124
- /**
125
- * Helper to format permissions into something easy to validate against
126
- * Note that the format the server is sending varies depending on if we're using a remote or
127
- * local environment.
128
- */
129
- static decodeActionPermissions(collections, actions, actionsByUser) {
130
- for (const [name, settings] of Object.entries(collections)) {
131
- for (const [actionName, userIds] of Object.entries(settings.collection ?? {})) {
132
- const shortName = actionName.substring(0, actionName.length - 'Enabled'.length);
133
- if (typeof userIds === 'boolean')
134
- actions.add(`${shortName}:${name}`);
135
- else
136
- actionsByUser[`${shortName}:${name}`] = new Set(userIds);
137
- }
138
- for (const [actionName, actionPerms] of Object.entries(settings.actions ?? {})) {
139
- const userIds = actionPerms.triggerEnabled;
140
- if (typeof userIds === 'boolean')
141
- actions.add(`custom:${actionName}:${name}`);
142
- else
143
- actionsByUser[`custom:${actionName}:${name}`] = new Set(userIds);
144
- }
145
- }
146
- }
147
- /** Helper to format permissions into something easy to validate against */
148
- static decodeScopePermissions(rendering) {
149
- const scopes = {};
150
- for (const [name, { scope }] of Object.entries(rendering)) {
151
- scopes[name] = scope && {
152
- conditionTree: scope.filter,
153
- dynamicScopeValues: scope.dynamicScopesValues?.users ?? {},
154
- };
155
- }
156
- return scopes;
157
- }
158
- static handleResponseError(e) {
159
- if (/certificate/i.test(e.message))
160
- throw new Error('ForestAdmin server TLS certificate cannot be verified. ' +
161
- 'Please check that your system time is set properly.');
162
- if (e.response) {
163
- const status = e?.response?.status;
164
- // 0 == offline, 502 == bad gateway from proxy
165
- if (status === 0 || status === 502)
166
- throw new Error('Failed to reach ForestAdmin server. Are you online?');
167
- if (status === 404)
168
- throw new Error('ForestAdmin server failed to find the project related to the envSecret you configured.' +
169
- ' Can you check that you copied it properly in the Forest initialization?');
170
- if (status === 503)
171
- throw new Error('Forest is in maintenance for a few minutes. We are upgrading your experience in ' +
172
- 'the forest. We just need a few more minutes to get it right.');
173
- throw new Error('An unexpected error occured while contacting the ForestAdmin server. ' +
174
- 'Please contact support@forestadmin.com for further investigations.');
175
- }
176
- throw e;
177
- }
178
- }
179
- exports.default = ForestHttpApi;
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZXN0LWh0dHAtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FnZW50L3V0aWxzL2ZvcmVzdC1odHRwLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUlBLDhEQUFxQztBQUNyQyw0REFBaUU7QUF3Q2pFLE1BQXFCLGFBQWE7SUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsT0FBb0I7UUFFcEIsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFhLE1BQU0sb0JBQVU7aUJBQ3hDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ2hGLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNyRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsT0FBb0I7UUFDdkQsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFhLE1BQU0sb0JBQVU7aUJBQ3hDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyx3Q0FBd0MsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzFGLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0MsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3RC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
@@ -1,144 +0,0 @@
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 id_1 = __importDefault(require("../id"));
7
- const generator_actions_1 = __importDefault(require("./generator-actions"));
8
- /**
9
- * This utility class converts form values from our internal format to the format that is
10
- * used in the frontend for action forms.
11
- */
12
- class ForestValueConverter {
13
- /**
14
- * Proper form data parser which converts data from an action form result to the format
15
- * that is internally used in datasources.
16
- */
17
- static makeFormData(dataSource, rawData, fields) {
18
- const data = {};
19
- for (const [key, value] of Object.entries(rawData)) {
20
- const field = fields.find(f => f.label === key);
21
- // Skip fields from the default form
22
- if (!generator_actions_1.default.defaultFields.map(f => f.field).includes(key)) {
23
- if (field?.type === 'Collection' && value) {
24
- const collection = dataSource.getCollection(field.collectionName);
25
- data[key] = id_1.default.unpackId(collection.schema, value);
26
- }
27
- else if (field?.type === 'File') {
28
- data[key] = this.parseDataUri(value);
29
- }
30
- else if (field?.type === 'FileList') {
31
- data[key] = value?.map(v => this.parseDataUri(v));
32
- }
33
- else {
34
- data[key] = value;
35
- }
36
- }
37
- }
38
- return data;
39
- }
40
- /**
41
- * Form data parser which extracts the data from what is provided by the frontend when
42
- * change hooks are called.
43
- */
44
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
- static makeFormDataFromFields(dataSource, fields) {
46
- const data = {};
47
- for (const field of fields) {
48
- // Skip fields from the default form
49
- if (!generator_actions_1.default.defaultFields.map(f => f.field).includes(field.field)) {
50
- if (field.reference && field.value) {
51
- const [collectionName] = field.reference.split('.');
52
- const collection = dataSource.getCollection(collectionName);
53
- data[field.field] = id_1.default.unpackId(collection.schema, field.value);
54
- }
55
- else if (field.type === 'File') {
56
- data[field.field] = this.parseDataUri(field.value);
57
- }
58
- else if (Array.isArray(field.type) && field.type[0] === 'File') {
59
- data[field.field] = field.value?.map(v => this.parseDataUri(v));
60
- }
61
- else {
62
- data[field.field] = field.value;
63
- }
64
- }
65
- }
66
- return data;
67
- }
68
- /**
69
- * This last form data parser tries to guess the types from the data itself.
70
- *
71
- * - Fields with type "Collection" which target collections where the pk is not a string or
72
- * derivative (mongoid, uuid, ...) won't be parser correctly, as we don't have enough information
73
- * to properly guess the type
74
- * - Fields of type "String" but where the final user entered a data-uri manually in the frontend
75
- * will be wrongfully parsed.
76
- */
77
- static makeFormDataUnsafe(rawData) {
78
- const data = {};
79
- for (const [key, value] of Object.entries(rawData)) {
80
- // Skip fields from the default form
81
- if (!generator_actions_1.default.defaultFields.map(f => f.field).includes(key)) {
82
- if (Array.isArray(value) && value.every(v => this.isDataUri(v))) {
83
- data[key] = value.map(uri => this.parseDataUri(uri));
84
- }
85
- else if (this.isDataUri(value)) {
86
- data[key] = this.parseDataUri(value);
87
- }
88
- else {
89
- data[key] = value;
90
- }
91
- }
92
- }
93
- return data;
94
- }
95
- static valueToForest(field, value) {
96
- if (field.type === 'Enum') {
97
- return field.enumValues.includes(value) ? value : null;
98
- }
99
- if (field.type === 'EnumList') {
100
- return value?.filter(v => field.enumValues.includes(v));
101
- }
102
- if (field.type === 'Collection') {
103
- return value?.join('|');
104
- }
105
- if (field.type === 'File') {
106
- return this.makeDataUri(value);
107
- }
108
- if (field.type === 'FileList') {
109
- return value?.map(f => this.makeDataUri(f));
110
- }
111
- return value;
112
- }
113
- static parseDataUri(dataUri) {
114
- if (!dataUri)
115
- return null;
116
- // Poor man's data uri parser (spec compliants one don't get the filename).
117
- // Hopefully this does not break.
118
- const [header, data] = dataUri.substring(5).split(',');
119
- const [mimeType, ...mediaTypes] = header.split(';');
120
- const result = { mimeType, buffer: Buffer.from(data, 'base64') };
121
- for (const mediaType of mediaTypes) {
122
- const index = mediaType.indexOf('=');
123
- if (index !== -1)
124
- result[mediaType.substring(0, index)] = decodeURIComponent(mediaType.substring(index + 1));
125
- }
126
- return result;
127
- }
128
- static makeDataUri(file) {
129
- if (!file)
130
- return null;
131
- const { mimeType, buffer, ...rest } = file;
132
- const mediaTypes = Object.entries(rest)
133
- .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
134
- .join(';');
135
- return mediaTypes.length
136
- ? `data:${file.mimeType};${mediaTypes};base64,${buffer.toString('base64')}`
137
- : `data:${file.mimeType};base64,${buffer.toString('base64')}`;
138
- }
139
- static isDataUri(value) {
140
- return typeof value === 'string' && value.startsWith('data:');
141
- }
142
- }
143
- exports.default = ForestValueConverter;
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXZhbHVlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC91dGlscy9mb3Jlc3Qtc2NoZW1hL2FjdGlvbi12YWx1ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwrQ0FBNEI7QUFDNUIsNEVBQXlEO0FBSXpEOzs7R0FHRztBQUNILE1BQXFCLG9CQUFvQjtJQUN2Qzs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQXNCLEVBQUUsT0FBaUIsRUFBRSxNQUFxQjtRQUNsRixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFFaEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUM7WUFFaEQsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQywyQkFBc0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDekUsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLFlBQVksSUFBSSxLQUFLLEVBQUU7b0JBQ3pDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUVsRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQWUsQ0FBQyxDQUFDO2lCQUNsRTtxQkFBTSxJQUFJLEtBQUssRUFBRSxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdB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
@@ -1,160 +0,0 @@
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 filterable_1 = __importDefault(require("./filterable"));
8
- const validation_1 = __importDefault(require("./validation"));
9
- class SchemaGeneratorFields {
10
- static buildSchema(collection, name) {
11
- const { type } = collection.schema.fields[name];
12
- let schema;
13
- switch (type) {
14
- case 'Column':
15
- schema = SchemaGeneratorFields.buildColumnSchema(collection, name);
16
- break;
17
- case 'ManyToOne':
18
- case 'OneToMany':
19
- case 'ManyToMany':
20
- case 'OneToOne':
21
- schema = SchemaGeneratorFields.buildRelationSchema(collection, name);
22
- break;
23
- default:
24
- throw new Error('Invalid field type');
25
- }
26
- return Object.entries(schema)
27
- .sort()
28
- .reduce((sortedSchema, [key, value]) => {
29
- sortedSchema[key] = value;
30
- return sortedSchema;
31
- }, {});
32
- }
33
- static buildColumnSchema(collection, name) {
34
- const column = collection.schema.fields[name];
35
- return {
36
- defaultValue: column.defaultValue ?? null,
37
- enums: column.enumValues ?? null,
38
- field: name,
39
- integration: null,
40
- inverseOf: null,
41
- isFilterable: filterable_1.default.isFilterable(column.columnType, column.filterOperators),
42
- isPrimaryKey: Boolean(column.isPrimaryKey),
43
- isReadOnly: Boolean(column.isReadOnly),
44
- isRequired: column.validation?.some(v => v.operator === 'Present') ?? false,
45
- isSortable: Boolean(column.isSortable),
46
- isVirtual: false,
47
- reference: null,
48
- type: this.convertColumnType(column.columnType),
49
- validations: validation_1.default.convertValidationList(column.validation),
50
- };
51
- }
52
- static convertColumnType(type) {
53
- if (typeof type === 'string')
54
- return type;
55
- if (Array.isArray(type)) {
56
- return [this.convertColumnType(type[0])];
57
- }
58
- return {
59
- fields: Object.entries(type).map(([key, subType]) => ({
60
- field: key,
61
- type: this.convertColumnType(subType),
62
- })),
63
- };
64
- }
65
- static buildToManyRelationSchema(relation, collection, foreignCollection, baseSchema) {
66
- let targetName;
67
- let targetField;
68
- let isReadOnly;
69
- if (relation.type === 'OneToMany') {
70
- targetName = relation.originKeyTarget;
71
- targetField = collection.schema.fields[targetName];
72
- const originKey = foreignCollection.schema.fields[relation.originKey];
73
- isReadOnly = originKey.isReadOnly;
74
- }
75
- else {
76
- targetName = relation.foreignKeyTarget;
77
- targetField = foreignCollection.schema.fields[targetName];
78
- const throughSchema = collection.dataSource.getCollection(relation.throughCollection).schema;
79
- const foreignKey = throughSchema.fields[relation.foreignKey];
80
- const originKey = throughSchema.fields[relation.originKey];
81
- isReadOnly = originKey.isReadOnly || foreignKey.isReadOnly;
82
- }
83
- return {
84
- ...baseSchema,
85
- type: [targetField.columnType],
86
- defaultValue: null,
87
- isFilterable: false,
88
- isPrimaryKey: false,
89
- isRequired: false,
90
- isReadOnly: Boolean(isReadOnly),
91
- isSortable: false,
92
- validations: [],
93
- reference: `${foreignCollection.name}.${targetName}`,
94
- };
95
- }
96
- static isForeignCollectionFilterable(foreignCollection) {
97
- return Object.values(foreignCollection.schema.fields).some(field => field.type === 'Column' &&
98
- filterable_1.default.isFilterable(field.columnType, field.filterOperators));
99
- }
100
- static buildOneToOneSchema(relation, collection, foreignCollection, baseSchema) {
101
- const targetField = collection.schema.fields[relation.originKeyTarget];
102
- const keyField = foreignCollection.schema.fields[relation.originKey];
103
- return {
104
- ...baseSchema,
105
- type: keyField.columnType,
106
- defaultValue: null,
107
- isFilterable: SchemaGeneratorFields.isForeignCollectionFilterable(foreignCollection),
108
- isPrimaryKey: false,
109
- isRequired: false,
110
- isReadOnly: Boolean(keyField.isReadOnly),
111
- isSortable: Boolean(targetField.isSortable),
112
- validations: [],
113
- reference: `${foreignCollection.name}.${relation.originKeyTarget}`,
114
- };
115
- }
116
- static buildManyToOneSchema(relation, collection, foreignCollection, baseSchema) {
117
- const keyField = collection.schema.fields[relation.foreignKey];
118
- return {
119
- ...baseSchema,
120
- type: keyField.columnType,
121
- defaultValue: keyField.defaultValue ?? null,
122
- isFilterable: SchemaGeneratorFields.isForeignCollectionFilterable(foreignCollection),
123
- isPrimaryKey: Boolean(keyField.isPrimaryKey),
124
- isRequired: keyField.validation?.some(v => v.operator === 'Present') ?? false,
125
- isReadOnly: Boolean(keyField.isReadOnly),
126
- isSortable: Boolean(keyField.isSortable),
127
- validations: validation_1.default.convertValidationList(keyField.validation),
128
- reference: `${foreignCollection.name}.${relation.foreignKeyTarget}`,
129
- };
130
- }
131
- static buildRelationSchema(collection, name) {
132
- const relation = collection.schema.fields[name];
133
- const foreignCollection = collection.dataSource.getCollection(relation.foreignCollection);
134
- const relationSchema = {
135
- field: name,
136
- enums: null,
137
- integration: null,
138
- isVirtual: false,
139
- inverseOf: datasource_toolkit_1.CollectionUtils.getInverseRelation(collection, name),
140
- relationship: SchemaGeneratorFields.relationMap[relation.type],
141
- };
142
- switch (relation.type) {
143
- case 'ManyToMany':
144
- case 'OneToMany':
145
- return SchemaGeneratorFields.buildToManyRelationSchema(relation, collection, foreignCollection, relationSchema);
146
- case 'OneToOne':
147
- return SchemaGeneratorFields.buildOneToOneSchema(relation, collection, foreignCollection, relationSchema);
148
- default:
149
- return SchemaGeneratorFields.buildManyToOneSchema(relation, collection, foreignCollection, relationSchema);
150
- }
151
- }
152
- }
153
- exports.default = SchemaGeneratorFields;
154
- SchemaGeneratorFields.relationMap = {
155
- ManyToMany: 'BelongsToMany',
156
- ManyToOne: 'BelongsTo',
157
- OneToMany: 'HasMany',
158
- OneToOne: 'HasOne',
159
- };
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLWZpZWxkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC91dGlscy9mb3Jlc3Qtc2NoZW1hL2dlbmVyYXRvci1maWVsZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFZeUM7QUFFekMsOERBQW1EO0FBQ25ELDhEQUFtRDtBQUVuRCxNQUFxQixxQkFBcUI7SUFReEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFzQixFQUFFLElBQVk7UUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELElBQUksTUFBeUIsQ0FBQztRQUU5QixRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssUUFBUTtnQkFDWCxNQUFNLEdBQUcscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBRVIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxVQUFVO2dCQUNiLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU07WUFFUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQzFCLElBQUksRUFBRTthQUNOLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3JDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFFMUIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gs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
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const types_1 = require("./types");
4
- class FrontendValidationUtils {
5
- static convertValidationList(rules) {
6
- if (!rules)
7
- return [];
8
- return rules
9
- .map(rule => {
10
- const type = FrontendValidationUtils.operatorValidationTypeMap[rule.operator];
11
- const error = `${rule.operator}${rule.value !== undefined ? `(${rule.value})` : ``}`;
12
- const message = `Failed validation rule: '${error}'`;
13
- return type ? { type, value: rule.value, message } : null;
14
- })
15
- .filter(Boolean);
16
- }
17
- }
18
- exports.default = FrontendValidationUtils;
19
- FrontendValidationUtils.operatorValidationTypeMap = {
20
- Present: types_1.ValidationType.Present,
21
- GreaterThan: types_1.ValidationType.GreaterThan,
22
- LessThan: types_1.ValidationType.LessThan,
23
- LongerThan: types_1.ValidationType.LongerThan,
24
- ShorterThan: types_1.ValidationType.ShorterThan,
25
- Contains: types_1.ValidationType.Contains,
26
- Like: types_1.ValidationType.Like,
27
- };
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC91dGlscy9mb3Jlc3Qtc2NoZW1hL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxtQ0FBNEQ7QUFLNUQsTUFBcUIsdUJBQXVCO0lBVzFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFvQjtRQUMvQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXRCLE9BQU8sS0FBSzthQUNULEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RSxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyRixNQUFNLE9BQU8sR0FBRyw0QkFBNEIsS0FBSyxHQUFHLENBQUM7WUFFckQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7O0FBdkJILDBDQXdCQztBQXZCZ0IsaURBQXlCLEdBQThDO0lBQ3BGLE9BQU8sRUFBRSxzQkFBYyxDQUFDLE9BQU87SUFDL0IsV0FBVyxFQUFFLHNCQUFjLENBQUMsV0FBVztJQUN2QyxRQUFRLEVBQUUsc0JBQWMsQ0FBQyxRQUFRO0lBQ2pDLFVBQVUsRUFBRSxzQkFBYyxDQUFDLFVBQVU7SUFDckMsV0FBVyxFQUFFLHNCQUFjLENBQUMsV0FBVztJQUN2QyxRQUFRLEVBQUUsc0JBQWMsQ0FBQyxRQUFRO0lBQ2pDLElBQUksRUFBRSxzQkFBYyxDQUFDLElBQUk7Q0FDMUIsQ0FBQyJ9