@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,4 @@
1
+ import { TCollectionName, TColumnName, TConditionTree, TFieldType, TSchema } from '../../templates';
2
+ import CollectionCustomizationContext from '../../context/collection-context';
3
+ export declare type OperatorDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>, C extends TColumnName<S, N> = TColumnName<S, N>> = (value: TFieldType<S, N, C>, context: CollectionCustomizationContext<S, N>) => Promise<TConditionTree<S, N>> | TConditionTree<S, N>;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9vcGVyYXRvcnMtZW11bGF0ZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,10 @@
1
+ import { Caller, CollectionSchema, PaginatedFilter } from '@forestadmin/datasource-toolkit';
2
+ import CollectionDecorator from '../collection-decorator';
3
+ /**
4
+ * Decorator which emulates filter operators from others.
5
+ */
6
+ export default class OperatorsDecorator extends CollectionDecorator {
7
+ protected refineSchema(childSchema: CollectionSchema): CollectionSchema;
8
+ protected refineFilter(caller: Caller, filter?: PaginatedFilter): Promise<PaginatedFilter>;
9
+ }
10
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,35 @@
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
+ /**
9
+ * Decorator which emulates filter operators from others.
10
+ */
11
+ class OperatorsDecorator extends collection_decorator_1.default {
12
+ refineSchema(childSchema) {
13
+ const fields = {};
14
+ for (const [name, schema] of Object.entries(childSchema.fields)) {
15
+ if (schema.type === 'Column') {
16
+ const newOperators = datasource_toolkit_1.allOperators.filter(operator => datasource_toolkit_1.ConditionTreeEquivalent.hasEquivalentTree(operator, schema.filterOperators, schema.columnType));
17
+ fields[name] = { ...schema, filterOperators: new Set(newOperators) };
18
+ }
19
+ else {
20
+ fields[name] = schema;
21
+ }
22
+ }
23
+ return { ...childSchema, fields };
24
+ }
25
+ async refineFilter(caller, filter) {
26
+ return filter?.override({
27
+ conditionTree: filter.conditionTree?.replaceLeafs(leaf => {
28
+ const schema = datasource_toolkit_1.CollectionUtils.getFieldSchema(this.childCollection, leaf.field);
29
+ return datasource_toolkit_1.ConditionTreeEquivalent.getEquivalentTree(leaf, schema.filterOperators, schema.columnType, caller.timezone);
30
+ }),
31
+ });
32
+ }
33
+ }
34
+ exports.default = OperatorsDecorator;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL29wZXJhdG9ycy1yZXBsYWNlL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFTeUM7QUFFekMsbUZBQTBEO0FBRTFEOztHQUVHO0FBQ0gsTUFBcUIsa0JBQW1CLFNBQVEsOEJBQW1CO0lBQzlDLFlBQVksQ0FBQyxXQUE2QjtRQUMzRCxNQUFNLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO1FBRS9DLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUM1QixNQUFNLFlBQVksR0FBRyxpQ0FBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUNsRCw0Q0FBdUIsQ0FBQyxpQkFBaUIsQ0FDdkMsUUFBUSxFQUNSLE1BQU0sQ0FBQyxlQUFlLEVBQ3RCLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQ0YsQ0FBQztnQkFFRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQzthQUN0RTtpQkFBTTtnQkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ3ZCO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsR0FBRyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVrQixLQUFLLENBQUMsWUFBWSxDQUNuQyxNQUFjLEVBQ2QsTUFBd0I7UUFFeEIsT0FBTyxNQUFNLEVBQUUsUUFBUSxDQUFDO1lBQ3RCLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkQsTUFBTSxNQUFNLEdBQUcsb0NBQWUsQ0FBQyxjQUFjLENBQzNDLElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxLQUFLLENBQ0ssQ0FBQztnQkFFbEIsT0FBTyw0Q0FBdUIsQ0FBQyxpQkFBaUIsQ0FDOUMsSUFBSSxFQUNKLE1BQU0sQ0FBQyxlQUFlLEVBQ3RCLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQ2hCLENBQUM7WUFDSixDQUFDLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUEzQ0QscUNBMkNDIn0=
@@ -0,0 +1,14 @@
1
+ import { Caller, CollectionSchema, RecordData } from '@forestadmin/datasource-toolkit';
2
+ import CollectionDecorator from '../collection-decorator';
3
+ import DataSourceDecorator from '../datasource-decorator';
4
+ /** This decorator allows hiding fields */
5
+ export default class PublicationCollectionDecorator extends CollectionDecorator {
6
+ readonly dataSource: DataSourceDecorator<PublicationCollectionDecorator>;
7
+ private readonly unpublished;
8
+ /** Show/hide fields from the schema */
9
+ changeFieldVisibility(name: string, visible: boolean): void;
10
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
11
+ protected refineSchema(childSchema: CollectionSchema): CollectionSchema;
12
+ private isPublished;
13
+ }
14
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,63 @@
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_decorator_1 = __importDefault(require("../collection-decorator"));
7
+ /** This decorator allows hiding fields */
8
+ class PublicationCollectionDecorator extends collection_decorator_1.default {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.unpublished = new Set();
12
+ }
13
+ /** Show/hide fields from the schema */
14
+ changeFieldVisibility(name, visible) {
15
+ const field = this.childCollection.schema.fields[name];
16
+ if (!field) {
17
+ throw new Error(`No such field '${name}'`);
18
+ }
19
+ if (field.type === 'Column' && field.isPrimaryKey) {
20
+ throw new Error(`Cannot hide primary key`);
21
+ }
22
+ if (!visible)
23
+ this.unpublished.add(name);
24
+ else
25
+ this.unpublished.delete(name);
26
+ this.markSchemaAsDirty();
27
+ }
28
+ async create(caller, data) {
29
+ const records = await super.create(caller, data);
30
+ return records.map(childRecord => {
31
+ const record = {};
32
+ for (const key of Object.keys(childRecord))
33
+ if (!this.unpublished.has(key))
34
+ record[key] = childRecord[key];
35
+ return record;
36
+ });
37
+ }
38
+ refineSchema(childSchema) {
39
+ const fields = {};
40
+ for (const [name, field] of Object.entries(childSchema.fields)) {
41
+ if (this.isPublished(name)) {
42
+ fields[name] = field;
43
+ }
44
+ }
45
+ return { ...childSchema, fields };
46
+ }
47
+ isPublished(name) {
48
+ const field = this.childCollection.schema.fields[name];
49
+ return (!this.unpublished.has(name) &&
50
+ // Columns have no special requirements
51
+ (field.type === 'Column' ||
52
+ // Many to one, one to one and one to many need the foreign key to be published
53
+ (field.type === 'ManyToOne' && this.isPublished(field.foreignKey)) ||
54
+ ((field.type === 'OneToOne' || field.type === 'OneToMany') &&
55
+ this.dataSource.getCollection(field.foreignCollection).isPublished(field.originKey)) ||
56
+ // Many to many relations depend on both foreignKey and originKey to be published
57
+ (field.type === 'ManyToMany' &&
58
+ this.dataSource.getCollection(field.throughCollection).isPublished(field.foreignKey) &&
59
+ this.dataSource.getCollection(field.throughCollection).isPublished(field.originKey))));
60
+ }
61
+ }
62
+ exports.default = PublicationCollectionDecorator;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3B1YmxpY2F0aW9uL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxtRkFBMEQ7QUFHMUQsMENBQTBDO0FBQzFDLE1BQXFCLDhCQUErQixTQUFRLDhCQUFtQjtJQUEvRTs7UUFFbUIsZ0JBQVcsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQTREeEQsQ0FBQztJQTFEQyx1Q0FBdUM7SUFDdkMscUJBQXFCLENBQUMsSUFBWSxFQUFFLE9BQWdCO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUM1QztRQUVELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDNUM7UUFFRCxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOztZQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsSUFBa0I7UUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVqRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFa0IsWUFBWSxDQUFDLFdBQTZCO1FBQzNELE1BQU0sTUFBTSxHQUFnQyxFQUFFLENBQUM7UUFFL0MsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUN0QjtTQUNGO1FBRUQsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBWTtRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkQsT0FBTyxDQUNMLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzNCLHVDQUF1QztZQUN2QyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFDdEIsK0VBQStFO2dCQUMvRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUM7b0JBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RGLGlGQUFpRjtnQkFDakYsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVk7b0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO29CQUNwRixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDMUYsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTlERCxpREE4REMifQ==
@@ -0,0 +1,23 @@
1
+ import { AggregateResult, Aggregation, Caller, CollectionSchema, Filter, PaginatedFilter, Projection, RecordData, RelationSchema } from '@forestadmin/datasource-toolkit';
2
+ import { RelationDefinition } from './types';
3
+ import CollectionDecorator from '../collection-decorator';
4
+ import DataSourceDecorator from '../datasource-decorator';
5
+ export default class RelationCollectionDecorator extends CollectionDecorator {
6
+ readonly dataSource: DataSourceDecorator<RelationCollectionDecorator>;
7
+ protected relations: Record<string, RelationSchema>;
8
+ addRelation(name: string, partialJoint: RelationDefinition): void;
9
+ list(caller: Caller, filter: PaginatedFilter, projection: Projection): Promise<RecordData[]>;
10
+ aggregate(caller: Caller, filter: Filter, aggregation: Aggregation, limit?: number): Promise<AggregateResult[]>;
11
+ protected refineSchema(subSchema: CollectionSchema): CollectionSchema;
12
+ protected refineFilter(caller: Caller, filter: PaginatedFilter): Promise<PaginatedFilter>;
13
+ private relationWithOptionalFields;
14
+ private checkForeignKeys;
15
+ private checkOriginKeys;
16
+ private static checkKeys;
17
+ private static checkColumn;
18
+ private rewriteField;
19
+ private rewriteLeaf;
20
+ private reprojectInPlace;
21
+ private reprojectRelationInPlace;
22
+ }
23
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,190 @@
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 RelationCollectionDecorator extends collection_decorator_1.default {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.relations = {};
12
+ }
13
+ addRelation(name, partialJoint) {
14
+ const relation = this.relationWithOptionalFields(partialJoint);
15
+ this.checkForeignKeys(relation);
16
+ this.checkOriginKeys(relation);
17
+ this.relations[name] = relation;
18
+ this.markSchemaAsDirty();
19
+ }
20
+ async list(caller, filter, projection) {
21
+ const newFilter = await this.refineFilter(caller, filter);
22
+ const newProjection = projection.replace(this.rewriteField, this).withPks(this);
23
+ const records = await this.childCollection.list(caller, newFilter, newProjection);
24
+ await this.reprojectInPlace(caller, records, projection);
25
+ return projection.apply(records);
26
+ }
27
+ async aggregate(caller, filter, aggregation, limit) {
28
+ const newFilter = await this.refineFilter(caller, filter);
29
+ // No emulated relations are used in the aggregation
30
+ if (Object.keys(aggregation.projection.relations).every(prefix => !this.relations[prefix])) {
31
+ return this.childCollection.aggregate(caller, newFilter, aggregation, limit);
32
+ }
33
+ // Fallback to full emulation.
34
+ return aggregation.apply(await this.list(caller, filter, aggregation.projection), caller.timezone, limit);
35
+ }
36
+ refineSchema(subSchema) {
37
+ const schema = { ...subSchema, fields: { ...subSchema.fields } };
38
+ for (const [name, relation] of Object.entries(this.relations)) {
39
+ schema.fields[name] = relation;
40
+ }
41
+ return schema;
42
+ }
43
+ async refineFilter(caller, filter) {
44
+ return filter?.override({
45
+ conditionTree: await filter.conditionTree?.replaceLeafsAsync(leaf => this.rewriteLeaf(caller, leaf), this),
46
+ // Replace sort in emulated relations to
47
+ // - sorting by the fk of the relation for many to one
48
+ // - removing the sort altogether for one to one
49
+ //
50
+ // This is far from ideal, but the best that can be done without taking a major
51
+ // performance hit.
52
+ // Customers which want proper sorting should enable emulation in the associated
53
+ // middleware
54
+ sort: filter.sort?.replaceClauses(clause => this.rewriteField(clause.field).map(field => ({ ...clause, field }))),
55
+ });
56
+ }
57
+ relationWithOptionalFields(partialJoint) {
58
+ const relation = { ...partialJoint };
59
+ const target = this.dataSource.getCollection(relation.foreignCollection);
60
+ if (relation.type === 'ManyToOne') {
61
+ relation.foreignKeyTarget ?? (relation.foreignKeyTarget = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(target.schema)[0]);
62
+ }
63
+ else if (relation.type === 'OneToOne' || relation.type === 'OneToMany') {
64
+ relation.originKeyTarget ?? (relation.originKeyTarget = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.schema)[0]);
65
+ }
66
+ else if (relation.type === 'ManyToMany') {
67
+ relation.originKeyTarget ?? (relation.originKeyTarget = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.schema)[0]);
68
+ relation.foreignKeyTarget ?? (relation.foreignKeyTarget = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(target.schema)[0]);
69
+ }
70
+ return relation;
71
+ }
72
+ checkForeignKeys(relation) {
73
+ if (relation.type === 'ManyToOne' || relation.type === 'ManyToMany') {
74
+ RelationCollectionDecorator.checkKeys(relation.type === 'ManyToMany'
75
+ ? this.dataSource.getCollection(relation.throughCollection)
76
+ : this, this.dataSource.getCollection(relation.foreignCollection), relation.foreignKey, relation.foreignKeyTarget);
77
+ }
78
+ }
79
+ checkOriginKeys(relation) {
80
+ if (relation.type === 'OneToMany' ||
81
+ relation.type === 'OneToOne' ||
82
+ relation.type === 'ManyToMany') {
83
+ RelationCollectionDecorator.checkKeys(relation.type === 'ManyToMany'
84
+ ? this.dataSource.getCollection(relation.throughCollection)
85
+ : this.dataSource.getCollection(relation.foreignCollection), this, relation.originKey, relation.originKeyTarget);
86
+ }
87
+ }
88
+ static checkKeys(owner, targetOwner, keyName, targetName) {
89
+ RelationCollectionDecorator.checkColumn(owner, keyName);
90
+ RelationCollectionDecorator.checkColumn(targetOwner, targetName);
91
+ const key = owner.schema.fields[keyName];
92
+ const target = targetOwner.schema.fields[targetName];
93
+ if (key.columnType !== target.columnType) {
94
+ throw new Error(`Types from '${owner.name}.${keyName}' and ` +
95
+ `'${targetOwner.name}.${targetName}' do not match.`);
96
+ }
97
+ }
98
+ static checkColumn(owner, name) {
99
+ const column = owner.schema.fields[name];
100
+ if (!column || column.type !== 'Column') {
101
+ throw new Error(`Column not found: '${owner.name}.${name}'`);
102
+ }
103
+ if (!column.filterOperators?.has('In')) {
104
+ throw new Error(`Column does not support the In operator: '${owner.name}.${name}'`);
105
+ }
106
+ }
107
+ rewriteField(field) {
108
+ const prefix = field.split(':').shift();
109
+ const schema = this.schema.fields[prefix];
110
+ if (schema.type === 'Column')
111
+ return [field];
112
+ const relation = this.dataSource.getCollection(schema.foreignCollection);
113
+ let result = [];
114
+ if (!this.relations[prefix]) {
115
+ result = relation
116
+ .rewriteField(field.substring(prefix.length + 1))
117
+ .map(subField => `${prefix}:${subField}`);
118
+ }
119
+ else if (schema.type === 'ManyToOne') {
120
+ result = [schema.foreignKey];
121
+ }
122
+ else if (schema.type === 'OneToOne' ||
123
+ schema.type === 'OneToMany' ||
124
+ schema.type === 'ManyToMany') {
125
+ result = [schema.originKeyTarget];
126
+ }
127
+ return result;
128
+ }
129
+ async rewriteLeaf(caller, leaf) {
130
+ const prefix = leaf.field.split(':').shift();
131
+ const schema = this.schema.fields[prefix];
132
+ if (schema.type === 'Column')
133
+ return leaf;
134
+ const relation = this.dataSource.getCollection(schema.foreignCollection);
135
+ let result = leaf;
136
+ if (!this.relations[prefix]) {
137
+ result = (await relation.rewriteLeaf(caller, leaf.unnest())).nest(prefix);
138
+ }
139
+ else if (schema.type === 'ManyToOne') {
140
+ const records = await relation.list(caller, new datasource_toolkit_1.Filter({ conditionTree: leaf.unnest() }), new datasource_toolkit_1.Projection(schema.foreignKeyTarget));
141
+ result = new datasource_toolkit_1.ConditionTreeLeaf(schema.foreignKey, 'In', [
142
+ ...new Set(records
143
+ .map(record => datasource_toolkit_1.RecordUtils.getFieldValue(record, schema.foreignKeyTarget))
144
+ .filter(v => v !== null)),
145
+ ]);
146
+ }
147
+ else if (schema.type === 'OneToOne') {
148
+ const records = await relation.list(caller, new datasource_toolkit_1.Filter({ conditionTree: leaf.unnest() }), new datasource_toolkit_1.Projection(schema.originKey));
149
+ result = new datasource_toolkit_1.ConditionTreeLeaf(schema.originKeyTarget, 'In', [
150
+ ...new Set(records
151
+ .map(record => datasource_toolkit_1.RecordUtils.getFieldValue(record, schema.originKey))
152
+ .filter(v => v !== null)),
153
+ ]);
154
+ }
155
+ return result;
156
+ }
157
+ async reprojectInPlace(caller, records, projection) {
158
+ const promises = Object.entries(projection.relations).map(async ([prefix, subProjection]) => this.reprojectRelationInPlace(caller, records, prefix, subProjection));
159
+ await Promise.all(promises);
160
+ }
161
+ async reprojectRelationInPlace(caller, records, name, projection) {
162
+ const schema = this.schema.fields[name];
163
+ const association = this.dataSource.getCollection(schema.foreignCollection);
164
+ if (!this.relations[name]) {
165
+ await association.reprojectInPlace(caller, records.map(r => r[name]).filter(Boolean), projection);
166
+ }
167
+ else if (schema.type === 'ManyToOne') {
168
+ const ids = records.map(record => record[schema.foreignKey]).filter(fk => fk !== null);
169
+ const subFilter = new datasource_toolkit_1.Filter({
170
+ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf(schema.foreignKeyTarget, 'In', [...new Set(ids)]),
171
+ });
172
+ const subRecords = await association.list(caller, subFilter, projection.union([schema.foreignKeyTarget]));
173
+ for (const record of records) {
174
+ record[name] = subRecords.find(sr => sr[schema.foreignKeyTarget] === record[schema.foreignKey]);
175
+ }
176
+ }
177
+ else if (schema.type === 'OneToOne' || schema.type === 'OneToMany') {
178
+ const ids = records.map(record => record[schema.originKeyTarget]).filter(okt => okt !== null);
179
+ const subFilter = new datasource_toolkit_1.Filter({
180
+ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf(schema.originKey, 'In', [...new Set(ids)]),
181
+ });
182
+ const subRecords = await association.list(caller, subFilter, projection.union([schema.originKey]));
183
+ for (const record of records) {
184
+ record[name] = subRecords.find(sr => sr[schema.originKey] === record[schema.originKeyTarget]);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ exports.default = RelationCollectionDecorator;
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3JlbGF0aW9uL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFnQnlDO0FBR3pDLG1GQUEwRDtBQUcxRCxNQUFxQiwyQkFBNEIsU0FBUSw4QkFBbUI7SUFBNUU7O1FBRVksY0FBUyxHQUFtQyxFQUFFLENBQUM7SUErUjNELENBQUM7SUE3UkMsV0FBVyxDQUFDLElBQVksRUFBRSxZQUFnQztRQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJLENBQ2pCLE1BQWMsRUFDZCxNQUF1QixFQUN2QixVQUFzQjtRQUV0QixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEYsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWxGLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFekQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUSxLQUFLLENBQUMsU0FBUyxDQUN0QixNQUFjLEVBQ2QsTUFBYyxFQUNkLFdBQXdCLEVBQ3hCLEtBQWM7UUFFZCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTFELG9EQUFvRDtRQUNwRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtZQUMxRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlFO1FBRUQsOEJBQThCO1FBQzlCLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FDdEIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUN2RCxNQUFNLENBQUMsUUFBUSxFQUNmLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUVrQixZQUFZLENBQUMsU0FBMkI7UUFDekQsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBRWpFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztTQUNoQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFa0IsS0FBSyxDQUFDLFlBQVksQ0FDbkMsTUFBYyxFQUNkLE1BQXVCO1FBRXZCLE9BQU8sTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUN0QixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUMxRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUN0QyxJQUFJLENBQ0w7WUFFRCx3Q0FBd0M7WUFDeEMsc0RBQXNEO1lBQ3RELGdEQUFnRDtZQUNoRCxFQUFFO1lBQ0YsK0VBQStFO1lBQy9FLG1CQUFtQjtZQUNuQixnRkFBZ0Y7WUFDaEYsYUFBYTtZQUNiLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUNyRTtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxZQUFnQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFekUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUNqQyxRQUFRLENBQUMsZ0JBQWdCLEtBQXpCLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBSyxnQ0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7U0FDNUU7YUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3hFLFFBQVEsQ0FBQyxlQUFlLEtBQXhCLFFBQVEsQ0FBQyxlQUFlLEdBQUssZ0NBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO1NBQ3pFO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtZQUN6QyxRQUFRLENBQUMsZUFBZSxLQUF4QixRQUFRLENBQUMsZUFBZSxHQUFLLGdDQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztZQUN4RSxRQUFRLENBQUMsZ0JBQWdCLEtBQXpCLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBSyxnQ0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7U0FDNUU7UUFFRCxPQUFPLFFBQTBCLENBQUM7SUFDcEMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQXdCO1FBQy9DLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7WUFDbkUsMkJBQTJCLENBQUMsU0FBUyxDQUNuQyxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVk7Z0JBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxJQUFJLEVBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQ3pELFFBQVEsQ0FBQyxVQUFVLEVBQ25CLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDMUIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxRQUF3QjtRQUM5QyxJQUNFLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVztZQUM3QixRQUFRLENBQUMsSUFBSSxLQUFLLFVBQVU7WUFDNUIsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQzlCO1lBQ0EsMkJBQTJCLENBQUMsU0FBUyxDQUNuQyxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVk7Z0JBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFDN0QsSUFBSSxFQUNKLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFFBQVEsQ0FBQyxlQUFlLENBQ3pCLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsU0FBUyxDQUN0QixLQUFpQixFQUNqQixXQUF1QixFQUN2QixPQUFlLEVBQ2YsVUFBa0I7UUFFbEIsMkJBQTJCLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RCwyQkFBMkIsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBaUIsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQWlCLENBQUM7UUFFckUsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYixlQUFlLEtBQUssQ0FBQyxJQUFJLElBQUksT0FBTyxRQUFRO2dCQUMxQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksVUFBVSxpQkFBaUIsQ0FDdEQsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBaUIsRUFBRSxJQUFZO1FBQ3hELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNyRjtJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pFLElBQUksTUFBTSxHQUFHLEVBQWMsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixNQUFNLEdBQUcsUUFBUTtpQkFDZCxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNoRCxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzdDO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUN0QyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDOUI7YUFBTSxJQUNMLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUMxQixNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVc7WUFDM0IsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQzVCO1lBQ0EsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYyxFQUFFLElBQXVCO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekUsSUFBSSxNQUFNLEdBQUcsSUFBcUIsQ0FBQztRQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNFO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQ2pDLE1BQU0sRUFDTixJQUFJLDJCQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFDNUMsSUFBSSwrQkFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN4QyxDQUFDO1lBRUYsTUFBTSxHQUFHLElBQUksc0NBQWlCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUU7Z0JBQ3RELEdBQUcsSUFBSSxHQUFHLENBQ1IsT0FBTztxQkFDSixHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxnQ0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQ3pFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FDM0I7YUFDRixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUNqQyxNQUFNLEVBQ04sSUFBSSwyQkFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQzVDLElBQUksK0JBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQ2pDLENBQUM7WUFFRixNQUFNLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRTtnQkFDM0QsR0FBRyxJQUFJLEdBQUcsQ0FDUixPQUFPO3FCQUNKLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGdDQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ2xFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FDM0I7YUFDRixDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLE1BQWMsRUFDZCxPQUFxQixFQUNyQixVQUFzQjtRQUV0QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FDMUYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUN0RSxDQUFDO1FBRUYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxLQUFLLENBQUMsd0JBQXdCLENBQ3BDLE1BQWMsRUFDZCxPQUFxQixFQUNyQixJQUFZLEVBQ1osVUFBc0I7UUFFdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFtQixDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixDQUNoQyxNQUFNLEVBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQWlCLEVBQ3pELFVBQVUsQ0FDWCxDQUFDO1NBQ0g7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sU0FBUyxHQUFHLElBQUksMkJBQU0sQ0FBQztnQkFDM0IsYUFBYSxFQUFFLElBQUksc0NBQWlCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN2RixDQUFDLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQ3ZDLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQzVDLENBQUM7WUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtnQkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQzVCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQ2hFLENBQUM7YUFDSDtTQUNGO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUNwRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM5RixNQUFNLFNBQVMsR0FBRyxJQUFJLDJCQUFNLENBQUM7Z0JBQzNCLGFBQWEsRUFBRSxJQUFJLHNDQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hGLENBQUMsQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FDdkMsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3JDLENBQUM7WUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtnQkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQzVCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUM5RCxDQUFDO2FBQ0g7U0FDRjtJQUNILENBQUM7Q0FDRjtBQWpTRCw4Q0FpU0MifQ==
@@ -0,0 +1,5 @@
1
+ import { ManyToManySchema, ManyToOneSchema, OneToManySchema, OneToOneSchema } from '@forestadmin/datasource-toolkit';
2
+ declare type PartialBy<T, K extends Extract<keyof T, string>> = Omit<T, K> & Partial<Pick<T, K>>;
3
+ export declare type RelationDefinition = PartialBy<ManyToOneSchema, 'foreignKeyTarget'> | PartialBy<OneToManySchema | OneToOneSchema, 'originKeyTarget'> | PartialBy<ManyToManySchema, 'foreignKeyTarget' | 'originKeyTarget'>;
4
+ export {};
5
+ //# 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9yZWxhdGlvbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,15 @@
1
+ import { CollectionSchema } from '@forestadmin/datasource-toolkit';
2
+ import CollectionDecorator from '../collection-decorator';
3
+ import CollectionRenameDataSourceDecorator from './datasource';
4
+ /**
5
+ * This decorator renames collections.
6
+ * It should be used with RenameCollectionDataSourceDecorator, and not the raw DataSourceDecorator
7
+ */
8
+ export default class RenameCollectionCollectionDecorator extends CollectionDecorator {
9
+ readonly dataSource: CollectionRenameDataSourceDecorator;
10
+ private substitutedName;
11
+ get name(): string;
12
+ protected refineSchema(childSchema: CollectionSchema): CollectionSchema;
13
+ private getNewName;
14
+ }
15
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,50 @@
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_decorator_1 = __importDefault(require("../collection-decorator"));
7
+ /**
8
+ * This decorator renames collections.
9
+ * It should be used with RenameCollectionDataSourceDecorator, and not the raw DataSourceDecorator
10
+ */
11
+ class RenameCollectionCollectionDecorator extends collection_decorator_1.default {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.substitutedName = null;
15
+ }
16
+ get name() {
17
+ return this.substitutedName ?? this.childCollection.name;
18
+ }
19
+ /** @internal */
20
+ rename(name) {
21
+ this.substitutedName = name;
22
+ // Invalidate all schemas
23
+ for (const collection of this.dataSource.collections) {
24
+ collection.markSchemaAsDirty();
25
+ }
26
+ }
27
+ refineSchema(childSchema) {
28
+ const fields = {};
29
+ for (const [name, oldSchema] of Object.entries(childSchema.fields)) {
30
+ const schema = { ...oldSchema };
31
+ if (schema.type === 'ManyToOne') {
32
+ schema.foreignCollection = this.getNewName(schema.foreignCollection);
33
+ }
34
+ else if (schema.type === 'OneToMany' || schema.type === 'OneToOne') {
35
+ schema.foreignCollection = this.getNewName(schema.foreignCollection);
36
+ }
37
+ else if (schema.type === 'ManyToMany') {
38
+ schema.throughCollection = this.getNewName(schema.throughCollection);
39
+ schema.foreignCollection = this.getNewName(schema.foreignCollection);
40
+ }
41
+ fields[name] = schema;
42
+ }
43
+ return { ...childSchema, fields };
44
+ }
45
+ getNewName(oldName) {
46
+ return this.dataSource.collections.find(c => c.childCollection.name === oldName).name;
47
+ }
48
+ }
49
+ exports.default = RenameCollectionCollectionDecorator;
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3JlbmFtZS1jb2xsZWN0aW9uL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxtRkFBMEQ7QUFHMUQ7OztHQUdHO0FBQ0gsTUFBcUIsbUNBQW9DLFNBQVEsOEJBQW1CO0lBQXBGOztRQUdVLG9CQUFlLEdBQVcsSUFBSSxDQUFDO0lBd0N6QyxDQUFDO0lBdENDLElBQWEsSUFBSTtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLHlCQUF5QjtRQUN6QixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQ3BELFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVrQixZQUFZLENBQUMsV0FBNkI7UUFDM0QsTUFBTSxNQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUUvQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEUsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBRWhDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7Z0JBQy9CLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3RFO2lCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQ3BFLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3RFO2lCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7Z0JBQ3ZDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNyRSxNQUFNLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUN0RTtZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7U0FDdkI7UUFFRCxPQUFPLEVBQUUsR0FBRyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLFVBQVUsQ0FBQyxPQUFlO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hGLENBQUM7Q0FDRjtBQTNDRCxzREEyQ0MifQ==
@@ -0,0 +1,11 @@
1
+ import { DataSource } from '@forestadmin/datasource-toolkit';
2
+ import DataSourceDecorator from '../datasource-decorator';
3
+ import RenameCollectionCollectionDecorator from './collection';
4
+ export default class RenameCollectionDataSourceDecorator extends DataSourceDecorator<RenameCollectionCollectionDecorator> {
5
+ constructor(childDataSource: DataSource);
6
+ renameCollection(oldName: string, newName: string): void;
7
+ renameCollections(rename?: {
8
+ [newName: string]: string;
9
+ }): void;
10
+ }
11
+ //# sourceMappingURL=datasource.d.ts.map
@@ -0,0 +1,33 @@
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_decorator_1 = __importDefault(require("../datasource-decorator"));
7
+ const collection_1 = __importDefault(require("./collection"));
8
+ class RenameCollectionDataSourceDecorator extends datasource_decorator_1.default {
9
+ constructor(childDataSource) {
10
+ super(childDataSource, collection_1.default);
11
+ }
12
+ renameCollection(oldName, newName) {
13
+ if (!this._collections[oldName]) {
14
+ throw new Error(`The given collection name "${oldName}" does not exist`);
15
+ }
16
+ if (this._collections[newName]) {
17
+ throw new Error(`The given new collection name "${newName}" is already defined in the dataSource`);
18
+ }
19
+ if (oldName !== newName) {
20
+ const collection = this._collections[oldName];
21
+ collection.rename(newName);
22
+ this._collections[newName] = collection;
23
+ delete this._collections[oldName];
24
+ }
25
+ }
26
+ renameCollections(rename) {
27
+ for (const [oldName, newName] of Object.entries(rename ?? {})) {
28
+ this.renameCollection(oldName, newName);
29
+ }
30
+ }
31
+ }
32
+ exports.default = RenameCollectionDataSourceDecorator;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3JlbmFtZS1jb2xsZWN0aW9uL2RhdGFzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxtRkFBMEQ7QUFDMUQsOERBQStEO0FBRS9ELE1BQXFCLG1DQUFvQyxTQUFRLDhCQUF3RDtJQUN2SCxZQUFZLGVBQTJCO1FBQ3JDLEtBQUssQ0FBQyxlQUFlLEVBQUUsb0JBQW1DLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0NBQWtDLE9BQU8sd0NBQXdDLENBQ2xGLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUN2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBd0MsQ0FBQztZQUNyRixVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTNCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUFzQztRQUN0RCxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7Q0FDRjtBQTlCRCxzREE4QkMifQ==
@@ -0,0 +1,33 @@
1
+ import { AggregateResult, Aggregation, Caller, CollectionSchema, Filter, PaginatedFilter, Projection, RecordData } from '@forestadmin/datasource-toolkit';
2
+ import CollectionDecorator from '../collection-decorator';
3
+ import DataSourceDecorator from '../datasource-decorator';
4
+ /**
5
+ * This decorator renames fields.
6
+ *
7
+ * It works on one side, by rewriting all references to fields in aggregations, filters, projections
8
+ * and on the other, by rewriting records and aggregation results which are returned by the
9
+ * subCollection.
10
+ */
11
+ export default class RenameFieldCollectionDecorator extends CollectionDecorator {
12
+ readonly dataSource: DataSourceDecorator<RenameFieldCollectionDecorator>;
13
+ private readonly fromChildCollection;
14
+ private readonly toChildCollection;
15
+ /** Rename a field from the collection */
16
+ renameField(currentName: string, newName: string): void;
17
+ protected refineSchema(childSchema: CollectionSchema): CollectionSchema;
18
+ protected refineFilter(caller: Caller, filter?: PaginatedFilter): Promise<PaginatedFilter>;
19
+ create(caller: Caller, records: RecordData[]): Promise<RecordData[]>;
20
+ list(caller: Caller, filter: PaginatedFilter, projection: Projection): Promise<RecordData[]>;
21
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
22
+ aggregate(caller: Caller, filter: Filter, aggregation: Aggregation, limit?: number): Promise<AggregateResult[]>;
23
+ private markAllSchemaAsDirty;
24
+ /** Convert field path from child collection to this collection */
25
+ private pathFromChildCollection;
26
+ /** Convert field path from this collection to child collection */
27
+ private pathToChildCollection;
28
+ /** Convert record from this collection to the child collection */
29
+ private recordToChildCollection;
30
+ /** Convert record from the child collection to this collection */
31
+ private recordFromChildCollection;
32
+ }
33
+ //# sourceMappingURL=collection.d.ts.map