@forestadmin/datasource-replica 1.0.0 → 1.0.2-alpha-widgets.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 (44) hide show
  1. package/dist/cache-interface/collection.d.ts +54 -0
  2. package/dist/cache-interface/collection.js +89 -0
  3. package/dist/cache-interface/datasource.d.ts +14 -0
  4. package/dist/cache-interface/datasource.js +33 -0
  5. package/dist/decorators/schema/collection.d.ts +8 -0
  6. package/dist/decorators/schema/collection.js +35 -0
  7. package/dist/decorators/schema/data-source.d.ts +9 -0
  8. package/dist/decorators/schema/data-source.js +18 -0
  9. package/dist/decorators/sync/collection.d.ts +15 -0
  10. package/dist/decorators/sync/collection.js +107 -0
  11. package/dist/decorators/sync/data-source.d.ts +9 -0
  12. package/dist/decorators/sync/data-source.js +15 -0
  13. package/dist/decorators/write/collection.d.ts +11 -0
  14. package/dist/decorators/write/collection.js +54 -0
  15. package/dist/decorators/write/data-source.d.ts +8 -0
  16. package/dist/decorators/write/data-source.js +23 -0
  17. package/dist/flattener.d.ts +3 -0
  18. package/dist/flattener.js +59 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/options/flattener/options.d.ts +5 -0
  21. package/dist/options/flattener/options.js +103 -0
  22. package/dist/options/flattener/schema.d.ts +8 -0
  23. package/dist/options/flattener/schema.js +39 -0
  24. package/dist/options/index.d.ts +5 -0
  25. package/dist/options/index.js +37 -0
  26. package/dist/options/schema/analyzer.d.ts +11 -0
  27. package/dist/options/schema/analyzer.js +53 -0
  28. package/dist/options/schema/index.d.ts +6 -0
  29. package/dist/options/schema/index.js +43 -0
  30. package/dist/options/utils.d.ts +3 -0
  31. package/dist/options/utils.js +8 -0
  32. package/dist/sequelize.d.ts +6 -0
  33. package/dist/sequelize.js +122 -0
  34. package/dist/synchronization/analysis-passthrough.d.ts +20 -0
  35. package/dist/synchronization/analysis-passthrough.js +79 -0
  36. package/dist/synchronization/cache-target.d.ts +15 -0
  37. package/dist/synchronization/cache-target.js +85 -0
  38. package/dist/synchronization/customer-source.d.ts +31 -0
  39. package/dist/synchronization/customer-source.js +188 -0
  40. package/dist/types.d.ts +176 -0
  41. package/dist/types.js +11 -0
  42. package/dist/utils.d.ts +7 -0
  43. package/dist/utils.js +35 -0
  44. package/package.json +7 -7
@@ -0,0 +1,54 @@
1
+ import { TAggregateResult, TAggregation, TFilter, TPaginatedFilter, TRow } from '@forestadmin/datasource-customizer';
2
+ import { Caller, Collection } from '@forestadmin/datasource-toolkit';
3
+ export default class CacheCollectionInterface {
4
+ private collection;
5
+ private caller;
6
+ constructor(collection: Collection, caller: Caller);
7
+ /**
8
+ * List multiple records
9
+ * @param filter the filter used to select the records to list
10
+ * @param projection an array of fields name representing the data to select
11
+ * @example
12
+ * .list({
13
+ * conditionTree: {
14
+ * aggregator: 'And',
15
+ * conditions: [{
16
+ * field: 'amountInEur',
17
+ * operator: 'GreaterThan',
18
+ * value: 1000
19
+ * }, {
20
+ * field: 'description',
21
+ * operator: 'Contains',
22
+ * value: 'Refund',
23
+ * }],
24
+ * page: { limit: 10, skip: 0 },
25
+ * sort: [{ field: 'id', ascending: true }]
26
+ * }
27
+ * }, ['id', 'amountInEur', 'description']);
28
+ */
29
+ list(filter: TPaginatedFilter, projection: string[]): Promise<TRow[]>;
30
+ /**
31
+ * Aggregate a list of records
32
+ * @param filter the filter used to list the records to aggregate
33
+ * @param aggregation the aggregation to apply
34
+ * @param limit the maximum number of result to return
35
+ * @example
36
+ * .aggregate({
37
+ * conditionTree: {
38
+ * field: "user:company:id",
39
+ * operator: "In",
40
+ * value: records.map((r) => r.id),
41
+ * },
42
+ * }, {
43
+ * operation: "Sum",
44
+ * field: "amountInEur",
45
+ * groups: [{ field: "user:company:id" }],
46
+ * }, 10);
47
+ */
48
+ aggregate(filter: TFilter, aggregation: TAggregation, limit?: number): Promise<TAggregateResult[]>;
49
+ private buildFilter;
50
+ private buildPaginatedFilter;
51
+ private buildProjection;
52
+ private buildAggregation;
53
+ }
54
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
4
+ class CacheCollectionInterface {
5
+ constructor(collection, caller) {
6
+ this.caller = caller;
7
+ this.collection = collection;
8
+ }
9
+ /**
10
+ * List multiple records
11
+ * @param filter the filter used to select the records to list
12
+ * @param projection an array of fields name representing the data to select
13
+ * @example
14
+ * .list({
15
+ * conditionTree: {
16
+ * aggregator: 'And',
17
+ * conditions: [{
18
+ * field: 'amountInEur',
19
+ * operator: 'GreaterThan',
20
+ * value: 1000
21
+ * }, {
22
+ * field: 'description',
23
+ * operator: 'Contains',
24
+ * value: 'Refund',
25
+ * }],
26
+ * page: { limit: 10, skip: 0 },
27
+ * sort: [{ field: 'id', ascending: true }]
28
+ * }
29
+ * }, ['id', 'amountInEur', 'description']);
30
+ */
31
+ list(filter, projection) {
32
+ const filterInstance = this.buildPaginatedFilter(filter);
33
+ const projectionInstance = this.buildProjection(projection);
34
+ const rows = this.collection.list(this.caller, filterInstance, projectionInstance);
35
+ return rows;
36
+ }
37
+ /**
38
+ * Aggregate a list of records
39
+ * @param filter the filter used to list the records to aggregate
40
+ * @param aggregation the aggregation to apply
41
+ * @param limit the maximum number of result to return
42
+ * @example
43
+ * .aggregate({
44
+ * conditionTree: {
45
+ * field: "user:company:id",
46
+ * operator: "In",
47
+ * value: records.map((r) => r.id),
48
+ * },
49
+ * }, {
50
+ * operation: "Sum",
51
+ * field: "amountInEur",
52
+ * groups: [{ field: "user:company:id" }],
53
+ * }, 10);
54
+ */
55
+ async aggregate(filter, aggregation, limit) {
56
+ const filterInstance = this.buildFilter(filter);
57
+ const aggregationInstance = this.buildAggregation(aggregation);
58
+ const result = await this.collection.aggregate(this.caller, filterInstance, aggregationInstance, limit);
59
+ return result;
60
+ }
61
+ buildFilter(filter) {
62
+ return filter
63
+ ? new datasource_toolkit_1.Filter({
64
+ ...filter,
65
+ conditionTree: filter.conditionTree
66
+ ? datasource_toolkit_1.ConditionTreeFactory.fromPlainObject(filter.conditionTree)
67
+ : undefined,
68
+ })
69
+ : null;
70
+ }
71
+ buildPaginatedFilter(filter) {
72
+ return new datasource_toolkit_1.PaginatedFilter({
73
+ ...filter,
74
+ conditionTree: filter?.conditionTree
75
+ ? datasource_toolkit_1.ConditionTreeFactory.fromPlainObject(filter.conditionTree)
76
+ : undefined,
77
+ sort: filter.sort ? new datasource_toolkit_1.Sort(...filter.sort) : undefined,
78
+ page: filter.page ? new datasource_toolkit_1.Page(filter.page.skip, filter.page.limit) : undefined,
79
+ });
80
+ }
81
+ buildProjection(projection) {
82
+ return new datasource_toolkit_1.Projection(...projection);
83
+ }
84
+ buildAggregation(aggregation) {
85
+ return new datasource_toolkit_1.Aggregation(aggregation);
86
+ }
87
+ }
88
+ exports.default = CacheCollectionInterface;
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS1pbnRlcmZhY2UvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLHdFQVV5QztBQUV6QyxNQUFxQix3QkFBd0I7SUFJM0MsWUFBWSxVQUFzQixFQUFFLE1BQWM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxJQUFJLENBQUMsTUFBd0IsRUFBRSxVQUFvQjtRQUNqRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFbkYsT0FBTyxJQUF1QixDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLE1BQWUsRUFDZixXQUF5QixFQUN6QixLQUFjO1FBRWQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUM1QyxJQUFJLENBQUMsTUFBTSxFQUNYLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsS0FBSyxDQUNOLENBQUM7UUFFRixPQUFPLE1BQTRCLENBQUM7SUFDdEMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFlO1FBQ2pDLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxJQUFJLDJCQUFNLENBQUM7Z0JBQ1QsR0FBRyxNQUFNO2dCQUNULGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtvQkFDakMsQ0FBQyxDQUFDLHlDQUFvQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO29CQUM1RCxDQUFDLENBQUMsU0FBUzthQUNkLENBQUM7WUFDSixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE1BQXdCO1FBQ25ELE9BQU8sSUFBSSxvQ0FBZSxDQUFDO1lBQ3pCLEdBQUcsTUFBTTtZQUNULGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYTtnQkFDbEMsQ0FBQyxDQUFDLHlDQUFvQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUM1RCxDQUFDLENBQUMsU0FBUztZQUNiLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLHlCQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDeEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUkseUJBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzlFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsVUFBb0I7UUFDMUMsT0FBTyxJQUFJLCtCQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsV0FBeUI7UUFDaEQsT0FBTyxJQUFJLGdDQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBdkdELDJDQXVHQyJ9
@@ -0,0 +1,14 @@
1
+ import type { DataSource } from '@forestadmin/datasource-toolkit';
2
+ import CacheCollectionInterface from './collection';
3
+ /** DataSource wrapper which accepts plain objects in all methods */
4
+ export default class CacheDataSourceInterface {
5
+ private dataSource;
6
+ private caller;
7
+ constructor(dataSource: DataSource);
8
+ /**
9
+ * Get a collection from a datasource
10
+ * @param name the name of the collection
11
+ */
12
+ getCollection(name: string): CacheCollectionInterface;
13
+ }
14
+ //# 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 collection_1 = __importDefault(require("./collection"));
7
+ /** DataSource wrapper which accepts plain objects in all methods */
8
+ class CacheDataSourceInterface {
9
+ constructor(dataSource) {
10
+ this.caller = {
11
+ id: 0,
12
+ email: 'datasource-replica@forestadmin.com',
13
+ firstName: 'Datasource',
14
+ lastName: 'Replica',
15
+ renderingId: 0,
16
+ role: 'system',
17
+ tags: {},
18
+ team: 'system',
19
+ timezone: 'UTC',
20
+ requestId: '',
21
+ };
22
+ this.dataSource = dataSource;
23
+ }
24
+ /**
25
+ * Get a collection from a datasource
26
+ * @param name the name of the collection
27
+ */
28
+ getCollection(name) {
29
+ return new collection_1.default(this.dataSource.getCollection(name), this.caller);
30
+ }
31
+ }
32
+ exports.default = CacheDataSourceInterface;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS1pbnRlcmZhY2UvZGF0YXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLDhEQUFvRDtBQUVwRCxvRUFBb0U7QUFDcEUsTUFBcUIsd0JBQXdCO0lBZTNDLFlBQVksVUFBc0I7UUFiMUIsV0FBTSxHQUFXO1lBQ3ZCLEVBQUUsRUFBRSxDQUFDO1lBQ0wsS0FBSyxFQUFFLG9DQUFvQztZQUMzQyxTQUFTLEVBQUUsWUFBWTtZQUN2QixRQUFRLEVBQUUsU0FBUztZQUNuQixXQUFXLEVBQUUsQ0FBQztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLEVBQUU7WUFDUixJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBR0EsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxvQkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEYsQ0FBQztDQUNGO0FBMUJELDJDQTBCQyJ9
@@ -0,0 +1,8 @@
1
+ import { CollectionDecorator, CollectionSchema } from '@forestadmin/datasource-toolkit';
2
+ import SchemaDataSourceDecorator from './data-source';
3
+ export default class SchemaCollectionDecorator extends CollectionDecorator {
4
+ dataSource: SchemaDataSourceDecorator;
5
+ protected refineSchema(subSchema: CollectionSchema): CollectionSchema;
6
+ private computeType;
7
+ }
8
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
4
+ const types_1 = require("../../types");
5
+ class SchemaCollectionDecorator extends datasource_toolkit_1.CollectionDecorator {
6
+ refineSchema(subSchema) {
7
+ const baseFields = this.dataSource.getFields(this.name);
8
+ const newSchema = { ...subSchema, fields: { ...subSchema.fields } };
9
+ for (const [key, field] of Object.entries(newSchema.fields)) {
10
+ if (field.type === 'Column') {
11
+ const baseField = baseFields[key];
12
+ newSchema.fields[key] = {
13
+ ...field,
14
+ columnType: this.computeType(baseField),
15
+ isReadOnly: baseField.isReadOnly,
16
+ defaultValue: baseField.defaultValue,
17
+ validation: baseField.validation,
18
+ };
19
+ }
20
+ }
21
+ return newSchema;
22
+ }
23
+ computeType(field) {
24
+ if ((0, types_1.isLeafField)(field)) {
25
+ return field.type === 'Integer' ? 'Number' : field.type;
26
+ }
27
+ if (Array.isArray(field)) {
28
+ return [this.computeType(field[0])];
29
+ }
30
+ const entries = Object.entries(field).map(([key, value]) => [key, this.computeType(value)]);
31
+ return Object.fromEntries(entries);
32
+ }
33
+ }
34
+ exports.default = SchemaCollectionDecorator;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3NjaGVtYS9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsd0VBQW9HO0FBR3BHLHVDQUE0RDtBQUU1RCxNQUFxQix5QkFBMEIsU0FBUSx3Q0FBbUI7SUFHckQsWUFBWSxDQUFDLFNBQTJCO1FBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFFcEUsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzNELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzNCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQWMsQ0FBQztnQkFDL0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRztvQkFDdEIsR0FBRyxLQUFLO29CQUNSLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztvQkFDdkMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO29CQUNoQyxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVk7b0JBQ3BDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtpQkFDakMsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVk7UUFDOUIsSUFBSSxJQUFBLG1CQUFXLEVBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQ3pEO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBcENELDRDQW9DQyJ9
@@ -0,0 +1,9 @@
1
+ import { DataSource, DataSourceDecorator } from '@forestadmin/datasource-toolkit';
2
+ import SchemaCollectionDecorator from './collection';
3
+ import { CollectionReplicaSchema, ResolvedOptions } from '../../types';
4
+ export default class SchemaDataSourceDecorator extends DataSourceDecorator<SchemaCollectionDecorator> {
5
+ private readonly flatSchema;
6
+ constructor(childDataSource: DataSource, options: ResolvedOptions);
7
+ getFields(name: string): CollectionReplicaSchema['fields'];
8
+ }
9
+ //# sourceMappingURL=data-source.d.ts.map
@@ -0,0 +1,18 @@
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_1 = __importDefault(require("./collection"));
8
+ class SchemaDataSourceDecorator extends datasource_toolkit_1.DataSourceDecorator {
9
+ constructor(childDataSource, options) {
10
+ super(childDataSource, collection_1.default);
11
+ this.flatSchema = options.flattenSchema;
12
+ }
13
+ getFields(name) {
14
+ return this.flatSchema.find(c => c.name === name).fields;
15
+ }
16
+ }
17
+ exports.default = SchemaDataSourceDecorator;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9zY2hlbWEvZGF0YS1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFBa0Y7QUFFbEYsOERBQXFEO0FBR3JELE1BQXFCLHlCQUEwQixTQUFRLHdDQUE4QztJQUduRyxZQUFZLGVBQTJCLEVBQUUsT0FBd0I7UUFDL0QsS0FBSyxDQUFDLGVBQWUsRUFBRSxvQkFBeUIsQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVk7UUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNELENBQUM7Q0FDRjtBQVpELDRDQVlDIn0=
@@ -0,0 +1,15 @@
1
+ import type TriggerSyncDataSourceDecorator from './data-source';
2
+ import type { AggregateResult, Aggregation, Caller, Filter, PaginatedFilter, Projection, RecordData } from '@forestadmin/datasource-toolkit';
3
+ import { CollectionDecorator } from '@forestadmin/datasource-toolkit';
4
+ export default class SyncCollectionDecorator extends CollectionDecorator {
5
+ dataSource: TriggerSyncDataSourceDecorator;
6
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
7
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
8
+ delete(caller: Caller, filter: Filter): Promise<void>;
9
+ list(caller: Caller, filter: PaginatedFilter, projection: Projection): Promise<RecordData[]>;
10
+ aggregate(caller: Caller, filter: Filter, aggregation: Aggregation, limit?: number): Promise<AggregateResult[]>;
11
+ private getLinkedCollections;
12
+ private getCollectionsFromProjection;
13
+ private getCollectionFromPath;
14
+ }
15
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
4
+ class SyncCollectionDecorator extends datasource_toolkit_1.CollectionDecorator {
5
+ async create(caller, data) {
6
+ const { options } = this.dataSource;
7
+ const records = await this.childCollection.create(caller, data);
8
+ if (options.pullDeltaOnAfterWrite) {
9
+ await options.source.queuePullDelta({
10
+ name: 'after-create',
11
+ collection: this.name,
12
+ caller,
13
+ affectedCollections: [this.name],
14
+ records,
15
+ });
16
+ }
17
+ return records;
18
+ }
19
+ async update(caller, filter, patch) {
20
+ const { options } = this.dataSource;
21
+ await super.update(caller, filter, patch);
22
+ if (options.pullDeltaOnAfterWrite) {
23
+ await options.source.queuePullDelta({
24
+ name: 'after-update',
25
+ collection: this.name,
26
+ affectedCollections: [this.name],
27
+ caller,
28
+ filter: filter,
29
+ patch,
30
+ });
31
+ }
32
+ }
33
+ async delete(caller, filter) {
34
+ const { options } = this.dataSource;
35
+ await super.delete(caller, filter);
36
+ if (options.pullDeltaOnAfterWrite) {
37
+ // Deletes may cascade to other collections!
38
+ // Let's find out which one are affected assuming that all deletes cascade
39
+ // (which is the worst case scenario)
40
+ await options.source.queuePullDelta({
41
+ name: 'after-delete',
42
+ collection: this.name,
43
+ affectedCollections: this.getLinkedCollections(new Set()),
44
+ caller,
45
+ filter: filter,
46
+ });
47
+ }
48
+ }
49
+ async list(caller, filter, projection) {
50
+ const { options } = this.dataSource;
51
+ if (options.pullDeltaOnBeforeAccess) {
52
+ await options.source.queuePullDelta({
53
+ name: 'before-list',
54
+ collection: this.name,
55
+ affectedCollections: this.getCollectionsFromProjection(projection),
56
+ caller,
57
+ filter: filter,
58
+ projection,
59
+ });
60
+ }
61
+ return super.list(caller, filter, projection);
62
+ }
63
+ async aggregate(caller, filter, aggregation, limit) {
64
+ const { options } = this.dataSource;
65
+ if (options.pullDeltaOnBeforeAccess) {
66
+ await options.source.queuePullDelta({
67
+ name: 'before-aggregate',
68
+ collection: this.name,
69
+ affectedCollections: this.getCollectionsFromProjection(aggregation.projection),
70
+ caller,
71
+ filter: filter,
72
+ aggregation,
73
+ });
74
+ }
75
+ return super.aggregate(caller, filter, aggregation, limit);
76
+ }
77
+ getLinkedCollections(exclude) {
78
+ const set = new Set();
79
+ set.add(this.name);
80
+ Object.values(this.schema.fields).forEach(f => {
81
+ if (f.type === 'ManyToOne' || f.type === 'OneToOne') {
82
+ const collection = this.dataSource.getCollection(f.foreignCollection);
83
+ if (!exclude.has(collection.name)) {
84
+ collection.getLinkedCollections(set).forEach(c => set.add(c));
85
+ }
86
+ }
87
+ });
88
+ return [...set];
89
+ }
90
+ getCollectionsFromProjection(projection) {
91
+ const set = new Set();
92
+ for (const field of projection)
93
+ set.add(this.getCollectionFromPath(field));
94
+ return [...set];
95
+ }
96
+ getCollectionFromPath(path) {
97
+ const [prefix, suffix] = path.split(/:(.*)/);
98
+ const schema = this.childCollection.schema.fields[prefix];
99
+ // FIXME need to handle many to many relationships here
100
+ // the through table is not included, and it should be
101
+ return schema.type === 'Column'
102
+ ? this.name
103
+ : this.dataSource.getCollection(schema.foreignCollection).getCollectionFromPath(suffix);
104
+ }
105
+ }
106
+ exports.default = SyncCollectionDecorator;
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3N5bmMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLHdFQUFzRTtBQUV0RSxNQUFxQix1QkFBd0IsU0FBUSx3Q0FBbUI7SUFHN0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsSUFBa0I7UUFDdEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEUsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDakMsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDckIsTUFBTTtnQkFDTixtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLE9BQU87YUFDUixDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFUSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsS0FBaUI7UUFDckUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFcEMsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFMUMsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDakMsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDckIs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
@@ -0,0 +1,9 @@
1
+ import type { ResolvedOptions } from '../../types';
2
+ import type { DataSource } from '@forestadmin/datasource-toolkit';
3
+ import { DataSourceDecorator } from '@forestadmin/datasource-toolkit';
4
+ import SyncCollectionDecorator from './collection';
5
+ export default class TriggerSyncDataSourceDecorator extends DataSourceDecorator<SyncCollectionDecorator> {
6
+ options: ResolvedOptions;
7
+ constructor(childDataSource: DataSource, options: ResolvedOptions);
8
+ }
9
+ //# sourceMappingURL=data-source.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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
7
+ const collection_1 = __importDefault(require("./collection"));
8
+ class TriggerSyncDataSourceDecorator extends datasource_toolkit_1.DataSourceDecorator {
9
+ constructor(childDataSource, options) {
10
+ super(childDataSource, collection_1.default);
11
+ this.options = options;
12
+ }
13
+ }
14
+ exports.default = TriggerSyncDataSourceDecorator;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9zeW5jL2RhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esd0VBQXNFO0FBRXRFLDhEQUFtRDtBQUVuRCxNQUFxQiw4QkFBK0IsU0FBUSx3Q0FBNEM7SUFHdEcsWUFBWSxlQUEyQixFQUFFLE9BQXdCO1FBQy9ELEtBQUssQ0FBQyxlQUFlLEVBQUUsb0JBQXVCLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFSRCxpREFRQyJ9
@@ -0,0 +1,11 @@
1
+ import type WriteDataSourceDecorator from './data-source';
2
+ import type { Caller, Filter, RecordData } from '@forestadmin/datasource-toolkit';
3
+ import { CollectionDecorator } from '@forestadmin/datasource-toolkit';
4
+ export default class WriteCollectionDecorator extends CollectionDecorator {
5
+ dataSource: WriteDataSourceDecorator;
6
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
7
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
8
+ delete(caller: Caller, filter: Filter): Promise<void>;
9
+ private get options();
10
+ }
11
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
4
+ class WriteCollectionDecorator extends datasource_toolkit_1.CollectionDecorator {
5
+ async create(caller, data) {
6
+ // we actually can't tell the db not to perform the creation...
7
+ if (!this.options.createRecordHandler) {
8
+ throw new datasource_toolkit_1.UnprocessableError('This collection does not supports creations');
9
+ }
10
+ if (this.dataSource.options.schema.find(({ name }) => name === this.name)) {
11
+ // I am a root collection, I can forward the creation to the target
12
+ const promises = data.map(async (record) => {
13
+ const newRecord = await this.options.createRecordHandler(this.name, record);
14
+ Object.assign(record, newRecord ?? {});
15
+ });
16
+ await Promise.all(promises);
17
+ }
18
+ return this.childCollection.create(caller, data);
19
+ }
20
+ async update(caller, filter, patch) {
21
+ if (!this.options.updateRecordHandler) {
22
+ throw new datasource_toolkit_1.UnprocessableError('This collection does not supports updates');
23
+ }
24
+ if (this.dataSource.options.schema.find(({ name }) => name === this.name)) {
25
+ // I am a root collection, I can forward the update to the target
26
+ const recordsPks = await super.list(caller, filter, new datasource_toolkit_1.Projection().withPks(this));
27
+ const promises = recordsPks.map(async (record) => {
28
+ Object.assign(record, patch);
29
+ await this.options.updateRecordHandler(this.name, record);
30
+ });
31
+ await Promise.all(promises);
32
+ }
33
+ return super.update(caller, filter, patch);
34
+ }
35
+ async delete(caller, filter) {
36
+ if (!this.options.deleteRecordHandler) {
37
+ throw new datasource_toolkit_1.UnprocessableError('This collection does not supports deletes');
38
+ }
39
+ if (this.dataSource.options.schema.find(({ name }) => name === this.name)) {
40
+ // I am a root collection, I can forward the delete to the target
41
+ const recordsPks = await super.list(caller, filter, new datasource_toolkit_1.Projection().withPks(this));
42
+ const promises = recordsPks.map(async (record) => {
43
+ await this.options.deleteRecordHandler(this.name, record);
44
+ });
45
+ await Promise.all(promises);
46
+ }
47
+ return super.delete(caller, filter);
48
+ }
49
+ get options() {
50
+ return this.dataSource.options;
51
+ }
52
+ }
53
+ exports.default = WriteCollectionDecorator;
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3dyaXRlL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSx3RUFJeUM7QUFFekMsTUFBcUIsd0JBQXlCLFNBQVEsd0NBQW1CO0lBRzlELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLElBQWtCO1FBQ3RELCtEQUErRDtRQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtZQUNyQyxNQUFNLElBQUksdUNBQWtCLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUM3RTtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekUsbUVBQW1FO1lBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO2dCQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVRLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxLQUFpQjtRQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtZQUNyQyxNQUFNLElBQUksdUNBQWtCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUMzRTtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekUsaUVBQWlFO1lBQ2pFLE1BQU0sVUFBVSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksK0JBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO2dCQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7UUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsTUFBYztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtZQUNyQyxNQUFNLElBQUksdUNBQWtCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUMzRTtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekUsaUVBQWlFO1lBQ2pFLE1BQU0sVUFBVSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksK0JBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO2dCQUM3QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtRQUVELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVksT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBbUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUE5REQsMkNBOERDIn0=
@@ -0,0 +1,8 @@
1
+ import type { ResolvedOptions } from '../../types';
2
+ import type { DataSource } from '@forestadmin/datasource-toolkit';
3
+ import { DataSourceDecorator } from '@forestadmin/datasource-toolkit';
4
+ export default class WriteDataSourceDecorator extends DataSourceDecorator {
5
+ options: ResolvedOptions;
6
+ constructor(childDataSource: DataSource, options: ResolvedOptions);
7
+ }
8
+ //# sourceMappingURL=data-source.d.ts.map
@@ -0,0 +1,23 @@
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_1 = __importDefault(require("./collection"));
8
+ class WriteDataSourceDecorator extends datasource_toolkit_1.DataSourceDecorator {
9
+ constructor(childDataSource, options) {
10
+ super(childDataSource, collection_1.default);
11
+ this.options = options;
12
+ childDataSource.collections.forEach(collection => {
13
+ if ((options.flattenOptions[collection.name]?.asModels.length ||
14
+ options.flattenOptions[collection.name]?.asFields.length) &&
15
+ (options.createRecordHandler || options.updateRecordHandler || options.deleteRecordHandler)) {
16
+ throw new Error('Cannot use flattenOptions with' +
17
+ ' createRecordHandler, updateRecordHandler or deleteRecordHandler.');
18
+ }
19
+ });
20
+ }
21
+ }
22
+ exports.default = WriteDataSourceDecorator;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy93cml0ZS9kYXRhLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLHdFQUFzRTtBQUV0RSw4REFBb0Q7QUFFcEQsTUFBcUIsd0JBQXlCLFNBQVEsd0NBQW1CO0lBR3ZFLFlBQVksZUFBMkIsRUFBRSxPQUF3QjtRQUMvRCxLQUFLLENBQUMsZUFBZSxFQUFFLG9CQUF3QixDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0MsSUFDRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2RCxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMzRCxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLENBQUMsbUJBQW1CLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQzNGO2dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWdDO29CQUM5QixtRUFBbUUsQ0FDdEUsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFyQkQsMkNBcUJDIn0=
@@ -0,0 +1,3 @@
1
+ import type { CollectionReplicaSchema, RecordDataWithCollection } from './types';
2
+ export default function flattenRecord(recordWithCollection: RecordDataWithCollection, fields: CollectionReplicaSchema['fields'], asFields: string[], asModels: string[]): RecordDataWithCollection[];
3
+ //# sourceMappingURL=flattener.d.ts.map
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("./utils");
4
+ function flattenRecordRec(recordWithCollection, fields, asFields, asModels) {
5
+ const { collection, record } = recordWithCollection;
6
+ const flattenedRecords = [];
7
+ for (let asModelIndex = 0; asModelIndex < asModels.length; asModelIndex += 1) {
8
+ const asModel = asModels[asModelIndex];
9
+ // Build subAsModels and subAsFields + remove them from asModels and asFields
10
+ const subAsModels = [];
11
+ while (asModels[asModelIndex + 1]?.startsWith(`${asModel}.`)) {
12
+ // asModels must be sorted for this to work
13
+ subAsModels.push(asModels[asModelIndex + 1].substring(asModel.length + 1));
14
+ asModels.splice(asModelIndex + 1, 1);
15
+ }
16
+ const subAsFields = [];
17
+ for (let i = 0; i < asFields.length; i += 1) {
18
+ if (asFields[i].startsWith(`${asModel}.`)) {
19
+ subAsFields.push(asFields[i].substring(asModel.length + 1));
20
+ asFields.splice(i, 1);
21
+ i -= 1;
22
+ }
23
+ }
24
+ // Build schema for subModel + some metadata
25
+ let subFields = (0, utils_1.extractValue)(fields, asModel, false);
26
+ const isArray = Array.isArray(subFields);
27
+ if (isArray)
28
+ [subFields] = subFields;
29
+ const isPrimitive = typeof subFields.type === 'string';
30
+ // Recurse
31
+ let subRecords = (0, utils_1.extractValue)(record, asModel, true);
32
+ if (subRecords) {
33
+ if (!isArray)
34
+ subRecords = [subRecords];
35
+ if (isPrimitive)
36
+ subRecords = subRecords.map(v => ({ value: v }));
37
+ for (const [index, subRecord] of subRecords.entries()) {
38
+ if (subRecord !== null && subRecord !== undefined) {
39
+ const recordId = (0, utils_1.getRecordId)(fields, record);
40
+ // eslint-disable-next-line no-underscore-dangle
41
+ subRecord._fid = isArray ? `${recordId}.${asModel}.${index}` : `${recordId}.${asModel}`;
42
+ // eslint-disable-next-line no-underscore-dangle
43
+ subRecord._fpid = recordId;
44
+ flattenedRecords.push(...flattenRecordRec({ collection: (0, utils_1.escape) `${collection}.${asModel}`, record: subRecord }, subFields, subAsFields, subAsModels));
45
+ }
46
+ }
47
+ }
48
+ }
49
+ for (const asField of asFields) {
50
+ record[asField.replace('.', '@@@')] = (0, utils_1.extractValue)(record, asField, true);
51
+ }
52
+ flattenedRecords.push(recordWithCollection);
53
+ return flattenedRecords;
54
+ }
55
+ function flattenRecord(recordWithCollection, fields, asFields, asModels) {
56
+ return flattenRecordRec((0, utils_1.deepclone)(recordWithCollection), fields, [...asFields].sort(), [...asModels].sort());
57
+ }
58
+ exports.default = flattenRecord;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhdHRlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZsYXR0ZW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLG1DQUF1RTtBQUV2RSxTQUFTLGdCQUFnQixDQUN2QixvQkFBOEMsRUFDOUMsTUFBeUMsRUFDekMsUUFBa0IsRUFDbEIsUUFBa0I7SUFFbEIsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQztJQUNwRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUU1QixLQUFLLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLElBQUksQ0FBQyxFQUFFO1FBQzVFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV2Qyw2RUFBNkU7UUFDN0UsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXZCLE9BQU8sUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQzVELDJDQUEyQztZQUMzQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFFRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcs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
@@ -0,0 +1,6 @@
1
+ import type { ReplicaDataSourceOptions } from './types';
2
+ import type { DataSourceFactory } from '@forestadmin/datasource-toolkit';
3
+ declare function createReplicaDataSource(rawOptions: ReplicaDataSourceOptions): DataSourceFactory;
4
+ export * from './types';
5
+ export { createReplicaDataSource };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ import type { CollectionReplicaSchema, ReplicaDataSourceOptions, ResolvedOptions } from '../../types';
2
+ type ResolvedFlattenOptions = ResolvedOptions['flattenOptions'];
3
+ export default function computeFlattenOptions(schema: CollectionReplicaSchema[], rawOptions: ReplicaDataSourceOptions): Promise<ResolvedFlattenOptions>;
4
+ export {};
5
+ //# sourceMappingURL=options.d.ts.map