@forestadmin/datasource-customizer 1.0.0-alpha.1

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 (119) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +0 -0
  3. package/dist/collection-customizer.d.ts +263 -0
  4. package/dist/collection-customizer.js +397 -0
  5. package/dist/context/agent-context.d.ts +11 -0
  6. package/dist/context/agent-context.js +20 -0
  7. package/dist/context/collection-context.d.ts +10 -0
  8. package/dist/context/collection-context.js +18 -0
  9. package/dist/context/relaxed-wrappers/collection.d.ts +112 -0
  10. package/dist/context/relaxed-wrappers/collection.js +161 -0
  11. package/dist/context/relaxed-wrappers/datasource.d.ts +15 -0
  12. package/dist/context/relaxed-wrappers/datasource.js +22 -0
  13. package/dist/datasource-customizer.d.ts +53 -0
  14. package/dist/datasource-customizer.js +89 -0
  15. package/dist/decorators/actions/collection.d.ts +18 -0
  16. package/dist/decorators/actions/collection.js +104 -0
  17. package/dist/decorators/actions/context/base.d.ts +28 -0
  18. package/dist/decorators/actions/context/base.js +105 -0
  19. package/dist/decorators/actions/context/single.d.ts +9 -0
  20. package/dist/decorators/actions/context/single.js +22 -0
  21. package/dist/decorators/actions/result-builder.d.ts +53 -0
  22. package/dist/decorators/actions/result-builder.js +81 -0
  23. package/dist/decorators/actions/types/actions.d.ts +18 -0
  24. package/dist/decorators/actions/types/actions.js +3 -0
  25. package/dist/decorators/actions/types/fields.d.ts +32 -0
  26. package/dist/decorators/actions/types/fields.js +3 -0
  27. package/dist/decorators/chart/datasource.d.ts +11 -0
  28. package/dist/decorators/chart/datasource.js +38 -0
  29. package/dist/decorators/chart/result-builder.d.ts +12 -0
  30. package/dist/decorators/chart/result-builder.js +48 -0
  31. package/dist/decorators/chart/types.d.ts +6 -0
  32. package/dist/decorators/chart/types.js +3 -0
  33. package/dist/decorators/collection-decorator.d.ts +21 -0
  34. package/dist/decorators/collection-decorator.js +57 -0
  35. package/dist/decorators/composite-datasource.d.ts +11 -0
  36. package/dist/decorators/composite-datasource.js +38 -0
  37. package/dist/decorators/computed/collection.d.ts +14 -0
  38. package/dist/decorators/computed/collection.js +69 -0
  39. package/dist/decorators/computed/helpers/compute-fields.d.ts +5 -0
  40. package/dist/decorators/computed/helpers/compute-fields.js +36 -0
  41. package/dist/decorators/computed/helpers/rewrite-projection.d.ts +4 -0
  42. package/dist/decorators/computed/helpers/rewrite-projection.js +22 -0
  43. package/dist/decorators/computed/types.d.ts +11 -0
  44. package/dist/decorators/computed/types.js +3 -0
  45. package/dist/decorators/computed/utils/deduplication.d.ts +2 -0
  46. package/dist/decorators/computed/utils/deduplication.js +28 -0
  47. package/dist/decorators/computed/utils/flattener.d.ts +6 -0
  48. package/dist/decorators/computed/utils/flattener.js +35 -0
  49. package/dist/decorators/datasource-decorator.d.ts +15 -0
  50. package/dist/decorators/datasource-decorator.js +27 -0
  51. package/dist/decorators/decorators-stack.d.ts +42 -0
  52. package/dist/decorators/decorators-stack.js +59 -0
  53. package/dist/decorators/empty/collection.d.ts +18 -0
  54. package/dist/decorators/empty/collection.js +85 -0
  55. package/dist/decorators/hook/collection.d.ts +13 -0
  56. package/dist/decorators/hook/collection.js +67 -0
  57. package/dist/decorators/hook/context/aggregate.d.ts +22 -0
  58. package/dist/decorators/hook/context/aggregate.js +46 -0
  59. package/dist/decorators/hook/context/create.d.ts +17 -0
  60. package/dist/decorators/hook/context/create.js +35 -0
  61. package/dist/decorators/hook/context/delete.d.ts +14 -0
  62. package/dist/decorators/hook/context/delete.js +28 -0
  63. package/dist/decorators/hook/context/hook.d.ts +26 -0
  64. package/dist/decorators/hook/context/hook.js +38 -0
  65. package/dist/decorators/hook/context/list.d.ts +20 -0
  66. package/dist/decorators/hook/context/list.js +42 -0
  67. package/dist/decorators/hook/context/update.d.ts +16 -0
  68. package/dist/decorators/hook/context/update.js +31 -0
  69. package/dist/decorators/hook/hook.d.ts +10 -0
  70. package/dist/decorators/hook/hook.js +30 -0
  71. package/dist/decorators/hook/types.d.ts +27 -0
  72. package/dist/decorators/hook/types.js +3 -0
  73. package/dist/decorators/operators-emulate/collection.d.ts +15 -0
  74. package/dist/decorators/operators-emulate/collection.js +99 -0
  75. package/dist/decorators/operators-emulate/types.d.ts +4 -0
  76. package/dist/decorators/operators-emulate/types.js +3 -0
  77. package/dist/decorators/operators-replace/collection.d.ts +10 -0
  78. package/dist/decorators/operators-replace/collection.js +35 -0
  79. package/dist/decorators/publication/collection.d.ts +14 -0
  80. package/dist/decorators/publication/collection.js +63 -0
  81. package/dist/decorators/relation/collection.d.ts +23 -0
  82. package/dist/decorators/relation/collection.js +190 -0
  83. package/dist/decorators/relation/types.d.ts +5 -0
  84. package/dist/decorators/relation/types.js +3 -0
  85. package/dist/decorators/rename-collection/collection.d.ts +15 -0
  86. package/dist/decorators/rename-collection/collection.js +50 -0
  87. package/dist/decorators/rename-collection/datasource.d.ts +11 -0
  88. package/dist/decorators/rename-collection/datasource.js +33 -0
  89. package/dist/decorators/rename-field/collection.d.ts +33 -0
  90. package/dist/decorators/rename-field/collection.js +149 -0
  91. package/dist/decorators/schema/collection.d.ts +13 -0
  92. package/dist/decorators/schema/collection.js +26 -0
  93. package/dist/decorators/search/collection.d.ts +14 -0
  94. package/dist/decorators/search/collection.js +105 -0
  95. package/dist/decorators/search/types.d.ts +4 -0
  96. package/dist/decorators/search/types.js +3 -0
  97. package/dist/decorators/segment/collection.d.ts +10 -0
  98. package/dist/decorators/segment/collection.js +43 -0
  99. package/dist/decorators/segment/types.d.ts +4 -0
  100. package/dist/decorators/segment/types.js +3 -0
  101. package/dist/decorators/sort-emulate/collection.d.ts +15 -0
  102. package/dist/decorators/sort-emulate/collection.js +97 -0
  103. package/dist/decorators/validation/collection.d.ts +20 -0
  104. package/dist/decorators/validation/collection.js +109 -0
  105. package/dist/decorators/write/collection.d.ts +26 -0
  106. package/dist/decorators/write/collection.js +214 -0
  107. package/dist/decorators/write/context.d.ts +9 -0
  108. package/dist/decorators/write/context.js +15 -0
  109. package/dist/decorators/write/types.d.ts +4 -0
  110. package/dist/decorators/write/types.js +3 -0
  111. package/dist/index.d.ts +14 -0
  112. package/dist/index.js +27 -0
  113. package/dist/templates.d.ts +65 -0
  114. package/dist/templates.js +3 -0
  115. package/dist/types.d.ts +18 -0
  116. package/dist/types.js +3 -0
  117. package/dist/typing-generator.d.ts +19 -0
  118. package/dist/typing-generator.js +123 -0
  119. package/package.json +37 -0
@@ -0,0 +1,109 @@
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 collection_decorator_1 = __importDefault(require("../collection-decorator"));
8
+ class ValidationDecorator extends collection_decorator_1.default {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.validation = {};
12
+ }
13
+ addValidation(name, validation) {
14
+ var _a;
15
+ datasource_toolkit_1.FieldValidator.validate(this, name);
16
+ const field = this.childCollection.schema.fields[name];
17
+ if (!field)
18
+ throw new Error('Cannot add validators on a relation, use the foreign key instead');
19
+ if (field.isReadOnly)
20
+ throw new Error('Cannot add validators on a readonly field');
21
+ (_a = this.validation)[name] ?? (_a[name] = []);
22
+ this.validation[name].push(validation);
23
+ this.markSchemaAsDirty();
24
+ }
25
+ async create(caller, data) {
26
+ for (const record of data)
27
+ this.validate(record, caller.timezone, true);
28
+ return super.create(caller, data);
29
+ }
30
+ async update(caller, filter, patch) {
31
+ this.validate(patch, caller.timezone, false);
32
+ return super.update(caller, filter, patch);
33
+ }
34
+ refineSchema(subSchema) {
35
+ const schema = { ...subSchema, fields: { ...subSchema.fields } };
36
+ for (const [name, rules] of Object.entries(this.validation)) {
37
+ const field = { ...schema.fields[name] };
38
+ field.validation = ValidationDecorator.deduplicate([...(field.validation ?? []), ...rules]);
39
+ schema.fields[name] = field;
40
+ }
41
+ return schema;
42
+ }
43
+ validate(record, timezone, allFields) {
44
+ for (const [name, field] of Object.entries(this.schema.fields)) {
45
+ if (field.type === 'Column' && (allFields || record[name] !== undefined)) {
46
+ // When setting a field to null, we skip all validators but "Present"
47
+ let rules = field.validation ?? [];
48
+ if (record[name] === null)
49
+ rules = rules.filter(r => r.operator === 'Present');
50
+ for (const validator of rules) {
51
+ const rawLeaf = { field: name, ...validator };
52
+ const tree = datasource_toolkit_1.ConditionTreeFactory.fromPlainObject(rawLeaf);
53
+ datasource_toolkit_1.ConditionTreeValidator.validate(tree, this);
54
+ if (!tree.match(record, this, timezone)) {
55
+ const message = `'${name}' failed validation rule:`;
56
+ const rule = validator.value !== undefined
57
+ ? `${validator.operator}(${validator.value})`
58
+ : `${validator.operator}`;
59
+ throw new datasource_toolkit_1.ValidationError(`${message} '${rule}'`);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ /**
66
+ * Deduplicate rules which the frontend understand
67
+ * We ignore other rules as duplications are not an issue within the agent
68
+ */
69
+ static deduplicate(rules) {
70
+ var _a;
71
+ const values = {};
72
+ for (const rule of rules) {
73
+ values[_a = rule.operator] ?? (values[_a] = []);
74
+ values[rule.operator].push(rule);
75
+ }
76
+ // Remove duplicate "Present"
77
+ while (values.Present?.length > 1)
78
+ values.Present.pop();
79
+ // Merge duplicate 'GreaterThan', 'After' and 'LongerThan' (keep the max value)
80
+ for (const operator of ['GreaterThan', 'After', 'LongerThan']) {
81
+ while (values[operator]?.length > 1) {
82
+ const last = values[operator].pop();
83
+ values[operator][0] = {
84
+ operator,
85
+ value: ValidationDecorator.max(last.value, values[operator][0].value),
86
+ };
87
+ }
88
+ }
89
+ // Merge duplicate 'LessThan', 'Before' and 'ShorterThan' (keep the min value)
90
+ for (const operator of ['LessThan', 'Before', 'ShorterThan']) {
91
+ while (values[operator]?.length > 1) {
92
+ const last = values[operator].pop();
93
+ values[operator][0] = {
94
+ operator,
95
+ value: ValidationDecorator.min(last.value, values[operator][0].value),
96
+ };
97
+ }
98
+ }
99
+ return Object.values(values).reduce((memo, r) => [...memo, ...r], []);
100
+ }
101
+ static min(valueA, valueB) {
102
+ return valueA < valueB ? valueA : valueB;
103
+ }
104
+ static max(valueA, valueB) {
105
+ return valueA < valueB ? valueB : valueA;
106
+ }
107
+ }
108
+ exports.default = ValidationDecorator;
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3ZhbGlkYXRpb24vY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQVl5QztBQUN6QyxtRkFBMEQ7QUFJMUQsTUFBcUIsbUJBQW9CLFNBQVEsOEJBQW1CO0lBQXBFOztRQUNVLGVBQVUsR0FBK0MsRUFBRSxDQUFDO0lBaUh0RSxDQUFDO0lBL0dDLGFBQWEsQ0FBQyxJQUFZLEVBQUUsVUFBMEI7O1FBQ3BELG1DQUFjLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFpQixDQUFDO1FBQ3ZFLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1FBQ2hHLElBQUksS0FBSyxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFbkYsTUFBQSxJQUFJLENBQUMsVUFBVSxFQUFDLElBQUksU0FBSixJQUFJLElBQU0sRUFBRSxFQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFUSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWMsRUFBRSxJQUFrQjtRQUN0RCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXhFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFD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
@@ -0,0 +1,26 @@
1
+ import { Caller, CollectionSchema, Filter, RecordData } from '@forestadmin/datasource-toolkit';
2
+ import { WriteDefinition } from './types';
3
+ import CollectionDecorator from '../collection-decorator';
4
+ import DataSourceDecorator from '../datasource-decorator';
5
+ export default class WriteDecorator extends CollectionDecorator {
6
+ private replacedDefinitions;
7
+ readonly dataSource: DataSourceDecorator<WriteDecorator>;
8
+ replaceFieldWriting(fieldName: string, definition: WriteDefinition): void;
9
+ protected refineSchema(childSchema: CollectionSchema): CollectionSchema;
10
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
11
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
12
+ private applyDefinitionsAndCreate;
13
+ private applyDefinitionsAndUpdate;
14
+ private createRecord;
15
+ private createOneToOneRelations;
16
+ private createManyToOneRelations;
17
+ private updateAllRelations;
18
+ private getImpactedRecordByUpdate;
19
+ private applyDefinitions;
20
+ private getReplacedDefinitionsColumns;
21
+ private getDefinitionResults;
22
+ private static checkCyclicDependency;
23
+ private getRelationFields;
24
+ private getPatchWithoutRelations;
25
+ }
26
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,214 @@
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 collection_decorator_1 = __importDefault(require("../collection-decorator"));
8
+ const context_1 = __importDefault(require("./context"));
9
+ class WriteDecorator extends collection_decorator_1.default {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.replacedDefinitions = {};
13
+ }
14
+ replaceFieldWriting(fieldName, definition) {
15
+ if (!Object.keys(this.schema.fields).includes(fieldName)) {
16
+ throw new Error(`The given field "${fieldName}" does not exist on the ${this.name} collection.`);
17
+ }
18
+ this.replacedDefinitions[fieldName] = definition;
19
+ this.markSchemaAsDirty();
20
+ }
21
+ refineSchema(childSchema) {
22
+ const schema = { ...childSchema, fields: { ...childSchema.fields } };
23
+ for (const name of Object.keys(this.replacedDefinitions)) {
24
+ schema.fields[name].isReadOnly = false;
25
+ }
26
+ return schema;
27
+ }
28
+ async create(caller, data) {
29
+ return Promise.all(data.map(record => this.applyDefinitionsAndCreate(caller, record)));
30
+ }
31
+ async update(caller, filter, patch) {
32
+ await this.applyDefinitionsAndUpdate(caller, filter, patch);
33
+ }
34
+ async applyDefinitionsAndCreate(caller, record) {
35
+ const patch = await this.applyDefinitions(caller, record, 'create');
36
+ if (this.getRelationFields(patch, ['ManyToOne', 'OneToOne']).length === 0) {
37
+ const result = await this.childCollection.create(caller, [patch]);
38
+ return result[0];
39
+ }
40
+ const manyToOneRecords = await this.createManyToOneRelations(caller, patch);
41
+ const createdRecord = await this.createRecord(caller, patch, manyToOneRecords);
42
+ await this.createOneToOneRelations(caller, patch, createdRecord);
43
+ return createdRecord;
44
+ }
45
+ async applyDefinitionsAndUpdate(caller, filter, patch) {
46
+ const updatedPatch = await this.applyDefinitions(caller, patch, 'update');
47
+ const relations = this.getRelationFields(updatedPatch, ['OneToOne', 'ManyToOne']);
48
+ const idsList = await this.getImpactedRecordByUpdate(caller, relations, filter);
49
+ await Promise.all([
50
+ ...this.updateAllRelations(caller, idsList, updatedPatch),
51
+ this.childCollection.update(caller, filter, this.getPatchWithoutRelations(updatedPatch, relations)),
52
+ ]);
53
+ }
54
+ async createRecord(caller, patch, manyToOneRecords) {
55
+ const refinedPatch = { ...patch };
56
+ const manyToOneRelations = this.getRelationFields(patch, ['ManyToOne']);
57
+ for (const [record] of manyToOneRecords) {
58
+ const relationName = manyToOneRelations.shift();
59
+ const relationSchema = this.schema.fields[relationName];
60
+ delete refinedPatch[relationName];
61
+ const relation = this.dataSource.getCollection(relationSchema.foreignCollection);
62
+ const [pk] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(relation.schema);
63
+ refinedPatch[relationSchema.foreignKey] = record[pk];
64
+ }
65
+ for (const relationName of this.getRelationFields(patch, ['OneToOne'])) {
66
+ const relationSchema = this.schema.fields[relationName];
67
+ delete refinedPatch[relationName];
68
+ if (patch[relationSchema.originKey])
69
+ delete refinedPatch[relationSchema.originKey];
70
+ }
71
+ const result = await this.childCollection.create(caller, [refinedPatch]);
72
+ return result[0];
73
+ }
74
+ async createOneToOneRelations(caller, patch, createdRecord) {
75
+ const requests = [];
76
+ for (const oneToOneRelation of this.getRelationFields(patch, ['OneToOne'])) {
77
+ const relationSchema = this.schema.fields[oneToOneRelation];
78
+ const relationRecord = patch[oneToOneRelation];
79
+ const relation = this.dataSource.getCollection(relationSchema.foreignCollection);
80
+ const fk = relationSchema.originKey;
81
+ if (patch[fk]) {
82
+ const conditionTree = new datasource_toolkit_1.ConditionTreeLeaf(fk, 'Equal', patch[fk]);
83
+ const filter = new datasource_toolkit_1.Filter({ conditionTree });
84
+ const update = relation.update(caller, filter, relationRecord);
85
+ requests.push(update);
86
+ }
87
+ else {
88
+ const [pk] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.schema);
89
+ requests.push(relation.create(caller, [{ ...relationRecord, [fk]: createdRecord[pk] }]));
90
+ }
91
+ }
92
+ await Promise.all(requests);
93
+ }
94
+ createManyToOneRelations(caller, patch) {
95
+ const resultsManyToOne = [];
96
+ for (const relationName of this.getRelationFields(patch, ['ManyToOne'])) {
97
+ const relationSchema = this.schema.fields[relationName];
98
+ const relationRecord = patch[relationName];
99
+ const fk = relationSchema.foreignKey;
100
+ const relation = this.dataSource.getCollection(relationSchema.foreignCollection);
101
+ if (patch[fk]) {
102
+ const [pk] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(relation.schema);
103
+ const updateWrapper = async () => {
104
+ const conditionTree = new datasource_toolkit_1.ConditionTreeLeaf(pk, 'Equal', patch[fk]);
105
+ await relation.update(caller, new datasource_toolkit_1.Filter({ conditionTree }), relationRecord);
106
+ return [{ [pk]: patch[fk] }];
107
+ };
108
+ resultsManyToOne.push(updateWrapper());
109
+ }
110
+ else {
111
+ resultsManyToOne.push(relation.create(caller, [relationRecord]));
112
+ }
113
+ }
114
+ return Promise.all(resultsManyToOne);
115
+ }
116
+ updateAllRelations(caller, listIds, patch) {
117
+ const updates = [];
118
+ const relations = this.getRelationFields(patch, ['OneToOne', 'ManyToOne']);
119
+ for (const recordIds of listIds) {
120
+ const relationName = relations.shift();
121
+ const relationSchema = this.schema.fields[relationName];
122
+ const relation = this.dataSource.getCollection(relationSchema.foreignCollection);
123
+ const ids = recordIds.map(field => Object.values(field)[0]);
124
+ let key;
125
+ if (relationSchema.type === 'OneToOne') {
126
+ key = relationSchema.originKey;
127
+ }
128
+ else {
129
+ [key] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(relation.schema);
130
+ }
131
+ const idsFilter = new datasource_toolkit_1.Filter({ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf(key, 'In', ids) });
132
+ updates.push(relation.update(caller, idsFilter, patch[relationName]));
133
+ }
134
+ return updates;
135
+ }
136
+ async getImpactedRecordByUpdate(caller, relations, filter) {
137
+ const records = [];
138
+ for (const relationName of relations) {
139
+ const relationSchema = this.schema.fields[relationName];
140
+ let projection;
141
+ if (relationSchema.type === 'OneToOne') {
142
+ projection = new datasource_toolkit_1.Projection(...datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.schema));
143
+ }
144
+ else if (relationSchema.type === 'ManyToOne') {
145
+ projection = new datasource_toolkit_1.Projection(relationSchema.foreignKey);
146
+ }
147
+ records.push(this.list(caller, filter, projection));
148
+ }
149
+ return Promise.all(records);
150
+ }
151
+ async applyDefinitions(caller, patch, action, stackCalls = []) {
152
+ if (Object.keys(patch).length === 0)
153
+ return {};
154
+ const replacedDefinitionsColumns = this.getReplacedDefinitionsColumns(patch);
155
+ WriteDecorator.checkCyclicDependency(replacedDefinitionsColumns, stackCalls);
156
+ const patches = await this.getDefinitionResults(caller, patch, replacedDefinitionsColumns, action);
157
+ const patchToExplore = {};
158
+ const copyPatch = { ...patch };
159
+ patches.forEach(recordData => {
160
+ const setValueColumn = replacedDefinitionsColumns.shift();
161
+ delete copyPatch[setValueColumn];
162
+ if (!recordData)
163
+ return;
164
+ if (recordData.constructor === Object) {
165
+ datasource_toolkit_1.RecordValidator.validate(this, recordData);
166
+ }
167
+ else {
168
+ throw new Error(`The write handler of ${setValueColumn} should return an object or nothing.`);
169
+ }
170
+ for (const [columnName, value] of Object.entries(recordData)) {
171
+ if (copyPatch[columnName]) {
172
+ throw new datasource_toolkit_1.ValidationError(`Conflict value on the field "${columnName}". It receives several values.`);
173
+ }
174
+ if (columnName === setValueColumn) {
175
+ copyPatch[columnName] = value;
176
+ }
177
+ else {
178
+ patchToExplore[columnName] = value;
179
+ }
180
+ }
181
+ });
182
+ return {
183
+ ...copyPatch,
184
+ ...(await this.applyDefinitions(caller, patchToExplore, action, stackCalls)),
185
+ };
186
+ }
187
+ getReplacedDefinitionsColumns(patch) {
188
+ const patchKeys = Object.keys(patch);
189
+ return Object.keys(this.replacedDefinitions).filter(name => patchKeys.includes(name));
190
+ }
191
+ async getDefinitionResults(caller, patch, columns, action) {
192
+ return Promise.all(columns.map(column => {
193
+ const definition = this.replacedDefinitions[column];
194
+ const context = new context_1.default(this, caller, action, { ...patch });
195
+ return definition(patch[column], context);
196
+ }));
197
+ }
198
+ static checkCyclicDependency(columns, stackCalls) {
199
+ stackCalls.push(...columns);
200
+ if (stackCalls.length !== [...new Set(stackCalls)].length) {
201
+ throw new datasource_toolkit_1.ValidationError(`There is a cyclic dependency on the "${stackCalls.pop()}" column.`);
202
+ }
203
+ }
204
+ getRelationFields(patch, types) {
205
+ return Object.keys(patch).filter(field => types.includes(this.schema.fields[field]?.type));
206
+ }
207
+ getPatchWithoutRelations(patch, relations) {
208
+ const copy = { ...patch };
209
+ relations.forEach(relation => delete copy[relation]);
210
+ return copy;
211
+ }
212
+ }
213
+ exports.default = WriteDecorator;
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3dyaXRlL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFleUM7QUFFekMsbUZBQTBEO0FBRTFELHdEQUFrRDtBQUVsRCxNQUFxQixjQUFlLFNBQVEsOEJBQW1CO0lBQS9EOztRQUNVLHdCQUFtQixHQUFvQyxFQUFFLENBQUM7SUFtVHBFLENBQUM7SUFoVEMsbUJBQW1CLENBQUMsU0FBaUIsRUFBRSxVQUEyQjtRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN4RCxNQUFNLElBQUksS0FBSyxDQUNiLG9CQUFvQixTQUFTLDJCQUEyQixJQUFJLENBQUMsSUFBSSxjQUFjLENBQ2hGLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDakQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVrQixZQUFZLENBQUMsV0FBNkI7UUFDM0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBRXJFLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBa0IsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQzFEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVRLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLElBQWtCO1FBQ3RELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVRLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxLQUFpQjtRQUNyRSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUMsTUFBYyxFQUFFLE1BQWtCO1FBQ3hFLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFcEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6RSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFbEUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU1RSxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFakUsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FDckMsTUFBYyxFQUNkLE1BQWMsRUFDZCxLQUFpQjtRQUVqQixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUVsRixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztZQUN6RCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDekIsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUN2RDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUN4QixNQUFjLEVBQ2QsS0FBaUIsRUFDakIsZ0JBQWdDO1FBRWhDLE1BQU0sWUFBWSxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXhFLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixFQUFFO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBb0IsQ0FBQztZQUUzRSxPQUFPLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRixNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0NBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pELFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsS0FBSyxNQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtZQUN0RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQW1CLENBQUM7WUFFMUUsT0FBTyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFbEMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFBRSxPQUFPLFlBQVksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDcEY7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFekUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbkMsTUFBYyxFQUNkLEtBQWlCLEVBQ2pCLGFBQXlCO1FBRXpCLE1BQU0sUUFBUSxHQUFtQyxFQUFFLENBQUM7UUFFcEQsS0FBSyxNQUFNLGdCQUFnQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQzFFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFtQixDQUFDO1lBQzlFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBZSxDQUFDO1lBQzdELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFFcEMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2IsTUFBTSxhQUFhLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLDJCQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQy9ELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdDQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckQsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRjtTQUNGO1FBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsS0FBaUI7UUFDaEUsTUFBTSxnQkFBZ0IsR0FBNEIsRUFBRSxDQUFDO1FBRXJELEtBQUssTUFBTSxZQUFZLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7WUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFvQixDQUFDO1lBQzNFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQWUsQ0FBQztZQUN6RCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDO1lBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRWpGLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNiLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxnQ0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXpELE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBMkIsRUFBRTtvQkFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksMkJBQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBRTdFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDO2dCQUVGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNMLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsRTtTQUNGO1FBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixNQUFjLEVBQ2QsT0FBdUIsRUFDdkIsS0FBaUI7UUFFakIsTUFBTSxPQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFM0UsS0FBSyxNQUFNLFNBQVMsSUFBSSxPQUFPLEVBQUU7WUFDL0IsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBbUIsQ0FBQztZQUMxRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUVqRixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksR0FBb0IsQ0FBQztZQUV6QixJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO2dCQUN0QyxHQUFHLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdDQUFXLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNyRDtZQUVELE1BQU0sU0FBUyxHQUFHLElBQUksMkJBQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLHNDQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQWUsQ0FBQyxDQUFDLENBQUM7U0FDckY7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QixDQUNyQyxNQUFjLEVBQ2QsU0FBbUIsRUFDbkIsTUFBYztRQUVkLE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUM7UUFFNUMsS0FBSyxNQUFNLFlBQVksSUFBSSxTQUFTLEVBQUU7WUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFtQixDQUFDO1lBQzFFLElBQUksVUFBc0IsQ0FBQztZQUUzQixJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO2dCQUN0QyxVQUFVLEdBQUcsSUFBSSwrQkFBVSxDQUFDLEdBQUcsZ0NBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDekU7aUJBQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtnQkFDOUMsVUFBVSxHQUFHLElBQUksK0JBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDeEQ7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLE1BQWMsRUFDZCxLQUFpQixFQUNqQixNQUEyQixFQUMzQixhQUF1QixFQUFFO1FBRXpCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRS9DLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdFLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FDN0MsTUFBTSxFQUNOLEtBQUssRUFDTCwwQkFBMEIsRUFDMUIsTUFBTSxDQUNQLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBRS9CLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0IsTUFBTSxjQUFjLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUQsT0FBTyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFakMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTztZQUV4QixJQUFJLFVBQVUsQ0FBQyxXQUFXLEtBQUssTUFBTSxFQUFFO2dCQUNyQyxvQ0FBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsY0FBYyxzQ0FBc0MsQ0FDN0UsQ0FBQzthQUNIO1lBRUQsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQzVELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO29CQUN6QixNQUFNLElBQUksb0NBQWUsQ0FDdkIsZ0NBQWdDLFVBQVUsZ0NBQWdDLENBQzNFLENBQUM7aUJBQ0g7Z0JBRUQsSUFBSSxVQUFVLEtBQUssY0FBYyxFQUFFO29CQUNqQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUMvQjtxQkFBTTtvQkFDTCxjQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUNwQzthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsR0FBRyxTQUFTO1lBQ1osR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzdFLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQTZCLENBQUMsS0FBaUI7UUFDckQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQ2hDLE1BQWMsRUFDZCxLQUFpQixFQUNqQixPQUFpQixFQUNqQixNQUEyQjtRQUUzQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQXlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFbEYsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLE9BQWlCLEVBQUUsVUFBb0I7UUFDMUUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDekQsTUFBTSxJQUFJLG9DQUFlLENBQ3ZCLHdDQUF3QyxVQUFVLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FDcEUsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQWlCLEVBQUUsS0FBbUI7UUFDOUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU8sd0JBQXdCLENBQUMsS0FBaUIsRUFBRSxTQUFtQjtRQUNyRSxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFwVEQsaUNBb1RDIn0=
@@ -0,0 +1,9 @@
1
+ import { Caller, Collection } from '@forestadmin/datasource-toolkit';
2
+ import { TCollectionName, TPartialSimpleRow, TSchema } from '../../templates';
3
+ import CollectionCustomizationContext from '../../context/collection-context';
4
+ export default class WriteCustomizationContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends CollectionCustomizationContext<S, N> {
5
+ readonly action: 'update' | 'create';
6
+ readonly record: TPartialSimpleRow<S, N>;
7
+ constructor(collection: Collection, caller: Caller, action: 'update' | 'create', record: TPartialSimpleRow<S, N>);
8
+ }
9
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1,15 @@
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 collection_context_1 = __importDefault(require("../../context/collection-context"));
7
+ class WriteCustomizationContext extends collection_context_1.default {
8
+ constructor(collection, caller, action, record) {
9
+ super(collection, caller);
10
+ this.action = action;
11
+ this.record = record;
12
+ }
13
+ }
14
+ exports.default = WriteCustomizationContext;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3dyaXRlL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwRkFBOEU7QUFFOUUsTUFBcUIseUJBR25CLFNBQVEsNEJBQW9DO0lBSTVDLFlBQ0UsVUFBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQTJCLEVBQzNCLE1BQStCO1FBRS9CLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBbEJELDRDQWtCQyJ9
@@ -0,0 +1,4 @@
1
+ import { TCollectionName, TFieldName, TFieldType, TPartialRow, TSchema } from '../../templates';
2
+ import WriteCustomizationContext from './context';
3
+ export declare type WriteDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>, C extends TFieldName<S, N> = TFieldName<S, N>> = (value: TFieldType<S, N, C>, context: WriteCustomizationContext<S, N>) => Promise<TPartialRow<S, N> | void> | TPartialRow<S, N> | void;
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy93cml0ZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,14 @@
1
+ export { default as CollectionCustomizer } from './collection-customizer';
2
+ export { default as DataSourceCustomizer } from './datasource-customizer';
3
+ export * from './templates';
4
+ export * from './types';
5
+ export { ActionDefinition } from './decorators/actions/types/actions';
6
+ export { ChartDefinition } from './decorators/chart/types';
7
+ export { ComputedDefinition } from './decorators/computed/types';
8
+ export { OperatorDefinition } from './decorators/operators-emulate/types';
9
+ export { RelationDefinition } from './decorators/relation/types';
10
+ export { SearchDefinition } from './decorators/search/types';
11
+ export { SegmentDefinition } from './decorators/segment/types';
12
+ export { WriteDefinition } from './decorators/write/types';
13
+ export { HookHandler, HookType, HookPosition, HooksContext } from './decorators/hook/types';
14
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.DataSourceCustomizer = exports.CollectionCustomizer = void 0;
21
+ var collection_customizer_1 = require("./collection-customizer");
22
+ Object.defineProperty(exports, "CollectionCustomizer", { enumerable: true, get: function () { return __importDefault(collection_customizer_1).default; } });
23
+ var datasource_customizer_1 = require("./datasource-customizer");
24
+ Object.defineProperty(exports, "DataSourceCustomizer", { enumerable: true, get: function () { return __importDefault(datasource_customizer_1).default; } });
25
+ __exportStar(require("./templates"), exports);
26
+ __exportStar(require("./types"), exports);
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpRUFBMEU7QUFBakUsOElBQUEsT0FBTyxPQUF3QjtBQUN4QyxpRUFBMEU7QUFBakUsOElBQUEsT0FBTyxPQUF3QjtBQUV4Qyw4Q0FBNEI7QUFDNUIsMENBQXdCIn0=
@@ -0,0 +1,65 @@
1
+ import { AggregationOperation, Aggregator, DateOperation, Operator, PlainPage, RecordData } from '@forestadmin/datasource-toolkit';
2
+ declare type RecursivePartial<T> = {
3
+ [P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial<U>[] : T[P] extends object ? RecursivePartial<T[P]> : T[P];
4
+ };
5
+ /** Global schema which is generated by agent */
6
+ export declare type TSchema = Record<string, {
7
+ plain: RecordData;
8
+ nested: RecordData;
9
+ flat: RecordData;
10
+ }>;
11
+ /** Collection name */
12
+ export declare type TCollectionName<S extends TSchema> = Extract<keyof S, string>;
13
+ /** Column name (no relations) */
14
+ export declare type TColumnName<S extends TSchema, N extends TCollectionName<S>> = Extract<keyof S[N]['plain'], string>;
15
+ /** Field name (with relations) */
16
+ export declare type TFieldName<S extends TSchema, N extends TCollectionName<S>> = Extract<keyof S[N]['plain'] | keyof S[N]['flat'], string>;
17
+ /** Type of a given field */
18
+ export declare type TFieldType<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>, C extends TFieldName<S, N> = TFieldName<S, N>> = (S[N]['plain'] & S[N]['flat'])[C];
19
+ /** Row type only with columns (all required) */
20
+ export declare type TSimpleRow<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = S[N]['plain'];
21
+ /** Row type only with columns (all optional) */
22
+ export declare type TPartialSimpleRow<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = RecursivePartial<TSimpleRow<S, N>>;
23
+ /** Row type with columns and relationships (all required) */
24
+ export declare type TRow<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = S[N]['plain'] & S[N]['nested'];
25
+ /** Row type with columns and relationships (all optional) */
26
+ export declare type TPartialRow<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = RecursivePartial<TRow<S, N>>;
27
+ export declare type TPartialFlatRow<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = RecursivePartial<S[N]['plain'] & S[N]['flat']>;
28
+ export declare type TConditionTreeLeaf<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
29
+ field: TFieldName<S, N>;
30
+ operator: Operator;
31
+ value?: unknown;
32
+ };
33
+ export declare type TConditionTreeBranch<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
34
+ aggregator: Aggregator;
35
+ conditions: Array<TConditionTreeBranch<S, N> | TConditionTreeLeaf<S, N>>;
36
+ };
37
+ export declare type TConditionTree<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = TConditionTreeBranch<S, N> | TConditionTreeLeaf<S, N>;
38
+ export declare type TPaginatedFilter<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = TFilter<S, N> & {
39
+ sort?: Array<TSortClause<S, N>>;
40
+ page?: PlainPage;
41
+ };
42
+ export declare type TSortClause<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
43
+ field: TFieldName<S, N>;
44
+ ascending: boolean;
45
+ };
46
+ export declare type TAggregateResult<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
47
+ value: unknown;
48
+ group: TPartialFlatRow<S, N>;
49
+ };
50
+ export interface TAggregation<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> {
51
+ field?: TFieldName<S, N>;
52
+ operation: AggregationOperation;
53
+ groups?: Array<{
54
+ field: TFieldName<S, N>;
55
+ operation?: DateOperation;
56
+ }>;
57
+ }
58
+ export declare type TFilter<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
59
+ conditionTree?: TConditionTree<S, N>;
60
+ search?: string;
61
+ searchExtended?: boolean;
62
+ segment?: string;
63
+ };
64
+ export {};
65
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbXBsYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,18 @@
1
+ import { PrimitiveTypes } from '@forestadmin/datasource-toolkit';
2
+ import { ComputedDefinition } from './decorators/computed/types';
3
+ import { TCollectionName, TFieldName, TRow, TSchema } from './templates';
4
+ import CollectionCustomizationContext from './context/collection-context';
5
+ export declare type FieldDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = ComputedDefinition<S, N> & {
6
+ beforeRelations?: boolean;
7
+ };
8
+ export declare type OneToManyEmbeddedDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
9
+ schema: Record<string, PrimitiveTypes>;
10
+ dependencies?: TFieldName<S, N>[];
11
+ listRecords(records: TRow<S, N>, context: CollectionCustomizationContext<S, N>): Promise<unknown[]> | unknown[];
12
+ };
13
+ export declare type DataSourceOptions = {
14
+ rename?: {
15
+ [oldName: string]: string;
16
+ };
17
+ };
18
+ //# sourceMappingURL=types.d.ts.map
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,19 @@
1
+ import { DataSource } from '@forestadmin/datasource-toolkit';
2
+ export default class TypingGenerator {
3
+ /**
4
+ * Write types to disk at a given path.
5
+ * This method read the file which is already there before overwriting so that customers
6
+ * using equivalents to nodemon to not enter restart loops.
7
+ */
8
+ static updateTypesOnFileSystem(dataSource: DataSource, typingsPath: string, typingsMaxDepth: number): Promise<void>;
9
+ /**
10
+ * Generates types on a string.
11
+ */
12
+ static generateTypes(dataSource: DataSource, maxDepth: number): string;
13
+ private static getRow;
14
+ private static getRelations;
15
+ private static getFlatRelations;
16
+ private static getFieldsRec;
17
+ private static getType;
18
+ }
19
+ //# sourceMappingURL=typing-generator.d.ts.map