@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,67 @@
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 aggregate_1 = require("./context/aggregate");
7
+ const create_1 = require("./context/create");
8
+ const delete_1 = require("./context/delete");
9
+ const list_1 = require("./context/list");
10
+ const update_1 = require("./context/update");
11
+ const collection_decorator_1 = __importDefault(require("../collection-decorator"));
12
+ const hook_1 = __importDefault(require("./hook"));
13
+ class CollectionHookDecorator extends collection_decorator_1.default {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.hooks = {
17
+ List: new hook_1.default(),
18
+ Create: new hook_1.default(),
19
+ Update: new hook_1.default(),
20
+ Delete: new hook_1.default(),
21
+ Aggregate: new hook_1.default(),
22
+ };
23
+ }
24
+ addHook(position, type, handler) {
25
+ this.hooks[type].addHandler(position, handler);
26
+ }
27
+ async create(caller, data) {
28
+ const beforeContext = new create_1.InternalHookBeforeCreateContext(this.childCollection, caller, data);
29
+ await this.hooks.Create.executeBefore(beforeContext);
30
+ const records = await this.childCollection.create(caller, beforeContext.getData());
31
+ const afterContext = new create_1.HookAfterCreateContext(this.childCollection, caller, data, records);
32
+ await this.hooks.Create.executeAfter(afterContext);
33
+ return records;
34
+ }
35
+ async list(caller, filter, projection) {
36
+ const beforeContext = new list_1.InternalHookBeforeListContext(this.childCollection, caller, filter, projection);
37
+ await this.hooks.List.executeBefore(beforeContext);
38
+ const records = await this.childCollection.list(caller, beforeContext.getFilter(), beforeContext.getProjection());
39
+ const afterContext = new list_1.HookAfterListContext(this.childCollection, caller, filter, projection, records);
40
+ await this.hooks.List.executeAfter(afterContext);
41
+ return records;
42
+ }
43
+ async update(caller, filter, patch) {
44
+ const beforeContext = new update_1.InternalHookBeforeUpdateContext(this.childCollection, caller, filter, patch);
45
+ await this.hooks.Update.executeBefore(beforeContext);
46
+ await this.childCollection.update(caller, beforeContext.getFilter(), beforeContext.patch);
47
+ const afterContext = new update_1.HookAfterUpdateContext(this.childCollection, caller, filter, patch);
48
+ await this.hooks.Update.executeAfter(afterContext);
49
+ }
50
+ async delete(caller, filter) {
51
+ const beforeContext = new delete_1.InternalHookBeforeDeleteContext(this.childCollection, caller, filter);
52
+ await this.hooks.Delete.executeBefore(beforeContext);
53
+ await this.childCollection.delete(caller, beforeContext.getFilter());
54
+ const afterContext = new delete_1.HookAfterDeleteContext(this.childCollection, caller, filter);
55
+ await this.hooks.Delete.executeAfter(afterContext);
56
+ }
57
+ async aggregate(caller, filter, aggregation, limit) {
58
+ const beforeContext = new aggregate_1.InternalHookBeforeAggregateContext(this.childCollection, caller, filter, aggregation, limit);
59
+ await this.hooks.Aggregate.executeBefore(beforeContext);
60
+ const aggregationResult = await this.childCollection.aggregate(caller, beforeContext.getFilter(), beforeContext.getAggregation(), beforeContext.limit);
61
+ const afterContext = new aggregate_1.HookAfterAggregateContext(this.childCollection, caller, filter, aggregation, aggregationResult, limit);
62
+ await this.hooks.Aggregate.executeAfter(afterContext);
63
+ return aggregationResult;
64
+ }
65
+ }
66
+ exports.default = CollectionHookDecorator;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL2hvb2svY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVVBLG1EQUk2QjtBQUM3Qiw2Q0FJMEI7QUFDMUIsNkNBSTBCO0FBQzFCLHlDQUl3QjtBQUN4Qiw2Q0FJMEI7QUFFMUIsbUZBQTBEO0FBRTFELGtEQUEyQjtBQUUzQixNQUFxQix1QkFBd0IsU0FBUSw4QkFBbUI7SUFBeEU7O1FBQ1UsVUFBSyxHQUFxRTtZQUNoRixJQUFJLEVBQUUsSUFBSSxjQUFLLEVBQStDO1lBQzlELE1BQU0sRUFBRSxJQUFJLGNBQUssRUFBbUQ7WUFDcEUsTUFBTSxFQUFFLElBQUksY0FBSyxFQUFtRDtZQUNwRSxNQUFNLEVBQUUsSUFBSSxjQUFLLEVBQW1EO1lBQ3BFLFNBQVMsRUFBRSxJQUFJLGNBQUssRUFBeUQ7U0FDOUUsQ0FBQztJQWdISixDQUFDO0lBOUdDLE9BQU8sQ0FDTCxRQUFXLEVBQ1gsSUFBTyxFQUNQLE9BQXdDO1FBRXhDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBbUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFUSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWMsRUFBRSxJQUFrQjtRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLHdDQUErQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlGLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXJELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRW5GLE1BQU0sWUFBWSxHQUFH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
@@ -0,0 +1,22 @@
1
+ import { Aggregation, Caller, Collection, Filter } from '@forestadmin/datasource-toolkit';
2
+ import { TAggregateResult, TAggregation, TCollectionName, TFilter, TSchema } from '../../../templates';
3
+ import HookContext from './hook';
4
+ export declare class HookBeforeAggregateContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookContext<S, N> {
5
+ protected _filter: Filter;
6
+ protected _aggregation: Aggregation;
7
+ protected _limit: number;
8
+ constructor(collection: Collection, caller: Caller, filter: Filter, aggregation: Aggregation, limit?: number);
9
+ get filter(): Readonly<TFilter<S, N>>;
10
+ get aggregation(): Readonly<TAggregation<S, N>>;
11
+ get limit(): number;
12
+ }
13
+ export declare class InternalHookBeforeAggregateContext extends HookBeforeAggregateContext {
14
+ getFilter(): Filter;
15
+ getAggregation(): Aggregation;
16
+ }
17
+ export declare class HookAfterAggregateContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookBeforeAggregateContext<S, N> {
18
+ private _aggregateResult;
19
+ constructor(collection: Collection, caller: Caller, filter: Filter, aggregation: Aggregation, aggregateResult: TAggregateResult<S, N>[], limit?: number);
20
+ get aggregateResult(): readonly TAggregateResult<S, N>[];
21
+ }
22
+ //# sourceMappingURL=aggregate.d.ts.map
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /* eslint-disable max-classes-per-file */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.HookAfterAggregateContext = exports.InternalHookBeforeAggregateContext = exports.HookBeforeAggregateContext = void 0;
8
+ const hook_1 = __importDefault(require("./hook"));
9
+ class HookBeforeAggregateContext extends hook_1.default {
10
+ constructor(collection, caller, filter, aggregation, limit) {
11
+ super(collection, caller);
12
+ this._filter = filter;
13
+ this._aggregation = aggregation;
14
+ this._limit = limit;
15
+ }
16
+ get filter() {
17
+ return Object.freeze(this._filter);
18
+ }
19
+ get aggregation() {
20
+ return Object.freeze(this._aggregation);
21
+ }
22
+ get limit() {
23
+ return this._limit;
24
+ }
25
+ }
26
+ exports.HookBeforeAggregateContext = HookBeforeAggregateContext;
27
+ class InternalHookBeforeAggregateContext extends HookBeforeAggregateContext {
28
+ getFilter() {
29
+ return this._filter;
30
+ }
31
+ getAggregation() {
32
+ return this._aggregation;
33
+ }
34
+ }
35
+ exports.InternalHookBeforeAggregateContext = InternalHookBeforeAggregateContext;
36
+ class HookAfterAggregateContext extends HookBeforeAggregateContext {
37
+ constructor(collection, caller, filter, aggregation, aggregateResult, limit) {
38
+ super(collection, caller, filter, aggregation, limit);
39
+ this._aggregateResult = aggregateResult;
40
+ }
41
+ get aggregateResult() {
42
+ return Object.freeze(this._aggregateResult);
43
+ }
44
+ }
45
+ exports.HookAfterAggregateContext = HookAfterAggregateContext;
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvaG9vay9jb250ZXh0L2FnZ3JlZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUNBQXlDOzs7Ozs7QUFVekMsa0RBQWlDO0FBRWpDLE1BQWEsMEJBR1gsU0FBUSxjQUFpQjtJQUt6QixZQUNFLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCxNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsS0FBYztRQUVkLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBbUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQTZDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQWpDRCxnRUFpQ0M7QUFFRCxNQUFhLGtDQUFtQyxTQUFRLDBCQUEwQjtJQUNoRixTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQVJELGdGQVFDO0FBRUQsTUFBYSx5QkFHWCxTQUFRLDBCQUFnQztJQUd4QyxZQUNFLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCxNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsZUFBeUMsRUFDekMsS0FBYztRQUVkLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUF0QkQsOERBc0JDIn0=
@@ -0,0 +1,17 @@
1
+ import { Caller, Collection, RecordData } from '@forestadmin/datasource-toolkit';
2
+ import { TCollectionName, TRow, TSchema } from '../../../templates';
3
+ import HookContext from './hook';
4
+ export declare class HookBeforeCreateContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookContext<S, N> {
5
+ protected _data: RecordData[];
6
+ constructor(collection: Collection, caller: Caller, data: RecordData[]);
7
+ get data(): readonly TRow<S, N>[];
8
+ }
9
+ export declare class InternalHookBeforeCreateContext extends HookBeforeCreateContext {
10
+ getData(): RecordData[];
11
+ }
12
+ export declare class HookAfterCreateContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookBeforeCreateContext<S, N> {
13
+ private _records;
14
+ constructor(collection: Collection, caller: Caller, data: RecordData[], records: RecordData[]);
15
+ get records(): readonly TRow<S, N>[];
16
+ }
17
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /* eslint-disable max-classes-per-file */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.HookAfterCreateContext = exports.InternalHookBeforeCreateContext = exports.HookBeforeCreateContext = void 0;
8
+ const hook_1 = __importDefault(require("./hook"));
9
+ class HookBeforeCreateContext extends hook_1.default {
10
+ constructor(collection, caller, data) {
11
+ super(collection, caller);
12
+ this._data = data;
13
+ }
14
+ get data() {
15
+ return Object.freeze(this._data);
16
+ }
17
+ }
18
+ exports.HookBeforeCreateContext = HookBeforeCreateContext;
19
+ class InternalHookBeforeCreateContext extends HookBeforeCreateContext {
20
+ getData() {
21
+ return this._data;
22
+ }
23
+ }
24
+ exports.InternalHookBeforeCreateContext = InternalHookBeforeCreateContext;
25
+ class HookAfterCreateContext extends HookBeforeCreateContext {
26
+ constructor(collection, caller, data, records) {
27
+ super(collection, caller, data);
28
+ this._records = records;
29
+ }
30
+ get records() {
31
+ return Object.freeze(this._records);
32
+ }
33
+ }
34
+ exports.HookAfterCreateContext = HookAfterCreateContext;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvaG9vay9jb250ZXh0L2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUNBQXlDOzs7Ozs7QUFJekMsa0RBQWlDO0FBRWpDLE1BQWEsdUJBR1gsU0FBUSxjQUFpQjtJQUd6QixZQUFZLFVBQXNCLEVBQUUsTUFBYyxFQUFFLElBQWtCO1FBQ3BFLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBZ0MsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRjtBQWZELDBEQWVDO0FBRUQsTUFBYSwrQkFBZ0MsU0FBUSx1QkFBdUI7SUFDMUUsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFKRCwwRUFJQztBQUVELE1BQWEsc0JBR1gsU0FBUSx1QkFBNkI7SUFHckMsWUFBWSxVQUFzQixFQUFFLE1BQWMsRUFBRSxJQUFrQixFQUFFLE9BQXFCO1FBQzNGLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBdUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFmRCx3REFlQyJ9
@@ -0,0 +1,14 @@
1
+ import { Caller, Collection, Filter } from '@forestadmin/datasource-toolkit';
2
+ import { TCollectionName, TFilter, TSchema } from '../../../templates';
3
+ import HookContext from './hook';
4
+ export declare class HookBeforeDeleteContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookContext<S, N> {
5
+ protected _filter: Filter;
6
+ constructor(collection: Collection, caller: Caller, filter: Filter);
7
+ get filter(): Readonly<TFilter<S, N>>;
8
+ }
9
+ export declare class InternalHookBeforeDeleteContext extends HookBeforeDeleteContext {
10
+ getFilter(): Filter;
11
+ }
12
+ export declare class HookAfterDeleteContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookBeforeDeleteContext<S, N> {
13
+ }
14
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /* eslint-disable max-classes-per-file */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.HookAfterDeleteContext = exports.InternalHookBeforeDeleteContext = exports.HookBeforeDeleteContext = void 0;
8
+ const hook_1 = __importDefault(require("./hook"));
9
+ class HookBeforeDeleteContext extends hook_1.default {
10
+ constructor(collection, caller, filter) {
11
+ super(collection, caller);
12
+ this._filter = filter;
13
+ }
14
+ get filter() {
15
+ return Object.freeze(this._filter);
16
+ }
17
+ }
18
+ exports.HookBeforeDeleteContext = HookBeforeDeleteContext;
19
+ class InternalHookBeforeDeleteContext extends HookBeforeDeleteContext {
20
+ getFilter() {
21
+ return this._filter;
22
+ }
23
+ }
24
+ exports.InternalHookBeforeDeleteContext = InternalHookBeforeDeleteContext;
25
+ class HookAfterDeleteContext extends HookBeforeDeleteContext {
26
+ }
27
+ exports.HookAfterDeleteContext = HookAfterDeleteContext;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvaG9vay9jb250ZXh0L2RlbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUNBQXlDOzs7Ozs7QUFJekMsa0RBQWlDO0FBRWpDLE1BQWEsdUJBR1gsU0FBUSxjQUFpQjtJQUd6QixZQUFZLFVBQXNCLEVBQUUsTUFBYyxFQUFFLE1BQWM7UUFDaEUsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFtQyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBZkQsMERBZUM7QUFFRCxNQUFhLCtCQUFnQyxTQUFRLHVCQUF1QjtJQUMxRSxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUpELDBFQUlDO0FBRUQsTUFBYSxzQkFHWCxTQUFRLHVCQUE2QjtDQUFHO0FBSDFDLHdEQUcwQyJ9
@@ -0,0 +1,26 @@
1
+ import { TCollectionName, TSchema } from '../../../templates';
2
+ import CollectionCustomizationContext from '../../../context/collection-context';
3
+ export default abstract class HookContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends CollectionCustomizationContext<S, N> {
4
+ /**
5
+ * Stop hooks execution and send Validation error to the UI
6
+ * @param message the validation error message
7
+ * @example
8
+ * .throwValidationError('My validation error message');
9
+ */
10
+ throwValidationError(message: string): never;
11
+ /**
12
+ * Stop hooks execution and send Forbidden error to the UI
13
+ * @param message the forbidden error message
14
+ * @example
15
+ * .throwForbiddenError('My forbidden error message');
16
+ */
17
+ throwForbiddenError(message: string): never;
18
+ /**
19
+ * Stop hooks execution and send error to the UI
20
+ * @param message the error message
21
+ * @example
22
+ * .throwError('My error message');
23
+ */
24
+ throwError(message: string): never;
25
+ }
26
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1,38 @@
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_context_1 = __importDefault(require("../../../context/collection-context"));
8
+ class HookContext extends collection_context_1.default {
9
+ /**
10
+ * Stop hooks execution and send Validation error to the UI
11
+ * @param message the validation error message
12
+ * @example
13
+ * .throwValidationError('My validation error message');
14
+ */
15
+ throwValidationError(message) {
16
+ throw new datasource_toolkit_1.ValidationError(message);
17
+ }
18
+ /**
19
+ * Stop hooks execution and send Forbidden error to the UI
20
+ * @param message the forbidden error message
21
+ * @example
22
+ * .throwForbiddenError('My forbidden error message');
23
+ */
24
+ throwForbiddenError(message) {
25
+ throw new datasource_toolkit_1.ForbiddenError(message);
26
+ }
27
+ /**
28
+ * Stop hooks execution and send error to the UI
29
+ * @param message the error message
30
+ * @example
31
+ * .throwError('My error message');
32
+ */
33
+ throwError(message) {
34
+ throw new datasource_toolkit_1.UnprocessableError(message);
35
+ }
36
+ }
37
+ exports.default = HookContext;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL2hvb2svY29udGV4dC9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBSXlDO0FBR3pDLDZGQUFpRjtBQUVqRixNQUE4QixXQUc1QixTQUFRLDRCQUFvQztJQUM1Qzs7Ozs7T0FLRztJQUNILG9CQUFvQixDQUFDLE9BQWU7UUFDbEMsTUFBTSxJQUFJLG9DQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsbUJBQW1CLENBQUMsT0FBZTtRQUNqQyxNQUFNLElBQUksbUNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVLENBQUMsT0FBZTtRQUN4QixNQUFNLElBQUksdUNBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBakNELDhCQWlDQyJ9
@@ -0,0 +1,20 @@
1
+ import { Caller, Collection, PaginatedFilter, Projection, RecordData } from '@forestadmin/datasource-toolkit';
2
+ import { TCollectionName, TFieldName, TPaginatedFilter, TRow, TSchema } from '../../../templates';
3
+ import HookContext from './hook';
4
+ export declare class HookBeforeListContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookContext<S, N> {
5
+ protected _filter: PaginatedFilter;
6
+ protected _projection: Projection;
7
+ constructor(collection: Collection, caller: Caller, filter: PaginatedFilter, projection: Projection);
8
+ get filter(): Readonly<TPaginatedFilter<S, N>>;
9
+ get projection(): readonly TFieldName<S, N>[];
10
+ }
11
+ export declare class InternalHookBeforeListContext extends HookBeforeListContext {
12
+ getFilter(): PaginatedFilter;
13
+ getProjection(): Projection;
14
+ }
15
+ export declare class HookAfterListContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookBeforeListContext<S, N> {
16
+ private _records;
17
+ constructor(collection: Collection, caller: Caller, filter: PaginatedFilter, projection: Projection, records: RecordData[]);
18
+ get records(): readonly TRow<S, N>[];
19
+ }
20
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /* eslint-disable max-classes-per-file */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.HookAfterListContext = exports.InternalHookBeforeListContext = exports.HookBeforeListContext = void 0;
8
+ const hook_1 = __importDefault(require("./hook"));
9
+ class HookBeforeListContext extends hook_1.default {
10
+ constructor(collection, caller, filter, projection) {
11
+ super(collection, caller);
12
+ this._filter = filter;
13
+ this._projection = projection;
14
+ }
15
+ get filter() {
16
+ return Object.freeze(this._filter);
17
+ }
18
+ get projection() {
19
+ return Object.freeze(this._projection);
20
+ }
21
+ }
22
+ exports.HookBeforeListContext = HookBeforeListContext;
23
+ class InternalHookBeforeListContext extends HookBeforeListContext {
24
+ getFilter() {
25
+ return this._filter;
26
+ }
27
+ getProjection() {
28
+ return this._projection;
29
+ }
30
+ }
31
+ exports.InternalHookBeforeListContext = InternalHookBeforeListContext;
32
+ class HookAfterListContext extends HookBeforeListContext {
33
+ constructor(collection, caller, filter, projection, records) {
34
+ super(collection, caller, filter, projection);
35
+ this._records = records;
36
+ }
37
+ get records() {
38
+ return Object.freeze(this._records);
39
+ }
40
+ }
41
+ exports.HookAfterListContext = HookAfterListContext;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL2hvb2svY29udGV4dC9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5Q0FBeUM7Ozs7OztBQVV6QyxrREFBaUM7QUFFakMsTUFBYSxxQkFHWCxTQUFRLGNBQWlCO0lBSXpCLFlBQ0UsVUFBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQXVCLEVBQ3ZCLFVBQXNCO1FBRXRCLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBNEMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQTRDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0Y7QUExQkQsc0RBMEJDO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxxQkFBcUI7SUFDdEUsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFSRCxzRUFRQztBQUVELE1BQWEsb0JBR1gsU0FBUSxxQkFBMkI7SUFHbkMsWUFDRSxVQUFzQixFQUN0QixNQUFjLEVBQ2QsTUFBdUIsRUFDdkIsVUFBc0IsRUFDdEIsT0FBcUI7UUFFckIsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTlDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBdUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFyQkQsb0RBcUJDIn0=
@@ -0,0 +1,16 @@
1
+ import { Caller, Collection, Filter, RecordData } from '@forestadmin/datasource-toolkit';
2
+ import { TCollectionName, TFilter, TRow, TSchema } from '../../../templates';
3
+ import HookContext from './hook';
4
+ export declare class HookBeforeUpdateContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookContext<S, N> {
5
+ protected _filter: Filter;
6
+ protected _patch: RecordData;
7
+ constructor(collection: Collection, caller: Caller, filter: Filter, patch: RecordData);
8
+ get filter(): Readonly<TFilter<S, N>>;
9
+ get patch(): Readonly<TRow<S, N>>;
10
+ }
11
+ export declare class InternalHookBeforeUpdateContext extends HookBeforeUpdateContext {
12
+ getFilter(): Filter;
13
+ }
14
+ export declare class HookAfterUpdateContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends HookBeforeUpdateContext<S, N> {
15
+ }
16
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1,31 @@
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
+ exports.HookAfterUpdateContext = exports.InternalHookBeforeUpdateContext = exports.HookBeforeUpdateContext = void 0;
7
+ const hook_1 = __importDefault(require("./hook"));
8
+ class HookBeforeUpdateContext extends hook_1.default {
9
+ constructor(collection, caller, filter, patch) {
10
+ super(collection, caller);
11
+ this._filter = filter;
12
+ this._patch = patch;
13
+ }
14
+ get filter() {
15
+ return Object.freeze(this._filter);
16
+ }
17
+ get patch() {
18
+ return Object.freeze(this._patch);
19
+ }
20
+ }
21
+ exports.HookBeforeUpdateContext = HookBeforeUpdateContext;
22
+ class InternalHookBeforeUpdateContext extends HookBeforeUpdateContext {
23
+ getFilter() {
24
+ return this._filter;
25
+ }
26
+ }
27
+ exports.InternalHookBeforeUpdateContext = InternalHookBeforeUpdateContext;
28
+ class HookAfterUpdateContext extends HookBeforeUpdateContext {
29
+ }
30
+ exports.HookAfterUpdateContext = HookAfterUpdateContext;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvaG9vay9jb250ZXh0L3VwZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxrREFBaUM7QUFFakMsTUFBYSx1QkFHWCxTQUFRLGNBQWlCO0lBSXpCLFlBQVksVUFBc0IsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLEtBQWlCO1FBQ25GLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBbUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQStCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFyQkQsMERBcUJDO0FBRUQsTUFBYSwrQkFBZ0MsU0FBUSx1QkFBdUI7SUFDMUUsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFKRCwwRUFJQztBQUVELE1BQWEsc0JBR1gsU0FBUSx1QkFBNkI7Q0FBRztBQUgxQyx3REFHMEMifQ==
@@ -0,0 +1,10 @@
1
+ import { HookHandler, HookPosition } from './types';
2
+ import HookContext from './context/hook';
3
+ export default class Hooks<B extends HookContext, A extends HookContext> {
4
+ private before;
5
+ private after;
6
+ executeBefore(context: B): Promise<void>;
7
+ executeAfter(context: A): Promise<void>;
8
+ addHandler(position: HookPosition, handler: HookHandler<A> | HookHandler<B>): void;
9
+ }
10
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class Hooks {
4
+ constructor() {
5
+ this.before = [];
6
+ this.after = [];
7
+ }
8
+ async executeBefore(context) {
9
+ for (const hook of this.before) {
10
+ // eslint-disable-next-line no-await-in-loop
11
+ await hook(context);
12
+ }
13
+ }
14
+ async executeAfter(context) {
15
+ for (const hook of this.after) {
16
+ // eslint-disable-next-line no-await-in-loop
17
+ await hook(context);
18
+ }
19
+ }
20
+ addHandler(position, handler) {
21
+ if (position === 'After') {
22
+ this.after.push(handler);
23
+ }
24
+ else {
25
+ this.before.push(handler);
26
+ }
27
+ }
28
+ }
29
+ exports.default = Hooks;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL2hvb2svaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLE1BQXFCLEtBQUs7SUFBMUI7UUFDVSxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUM5QixVQUFLLEdBQXFCLEVBQUUsQ0FBQztJQXVCdkMsQ0FBQztJQXJCQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQVU7UUFDNUIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzlCLDRDQUE0QztZQUM1QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQVU7UUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdCLDRDQUE0QztZQUM1QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsUUFBc0IsRUFBRSxPQUF3QztRQUN6RSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBeUIsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUF5QixDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0NBQ0Y7QUF6QkQsd0JBeUJDIn0=
@@ -0,0 +1,27 @@
1
+ import { HookAfterAggregateContext, HookBeforeAggregateContext } from './context/aggregate';
2
+ import { HookAfterCreateContext, HookBeforeCreateContext } from './context/create';
3
+ import { HookAfterDeleteContext, HookBeforeDeleteContext } from './context/delete';
4
+ import { HookAfterListContext, HookBeforeListContext } from './context/list';
5
+ import { HookAfterUpdateContext, HookBeforeUpdateContext } from './context/update';
6
+ import { TCollectionName, TSchema } from '../../templates';
7
+ import HookContext from './context/hook';
8
+ export declare type HookHandler<C extends HookContext<S, N>, R = void, S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = (context: C) => Promise<R> | R;
9
+ export declare type HookType<P extends HookPosition = HookPosition> = Extract<keyof HooksContext[P], string>;
10
+ export declare type HookPosition = Extract<keyof HooksContext, string>;
11
+ export declare type HooksContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
12
+ Before: {
13
+ List: HookBeforeListContext<S, N>;
14
+ Create: HookBeforeCreateContext<S, N>;
15
+ Update: HookBeforeUpdateContext<S, N>;
16
+ Delete: HookBeforeDeleteContext<S, N>;
17
+ Aggregate: HookBeforeAggregateContext<S, N>;
18
+ };
19
+ After: {
20
+ List: HookAfterListContext<S, N>;
21
+ Create: HookAfterCreateContext<S, N>;
22
+ Update: HookAfterUpdateContext<S, N>;
23
+ Delete: HookAfterDeleteContext<S, N>;
24
+ Aggregate: HookAfterAggregateContext<S, N>;
25
+ };
26
+ };
27
+ //# 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9ob29rL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,15 @@
1
+ import { Caller, CollectionSchema, Operator, PaginatedFilter } from '@forestadmin/datasource-toolkit';
2
+ import { OperatorDefinition } from './types';
3
+ import CollectionDecorator from '../collection-decorator';
4
+ import DataSourceDecorator from '../datasource-decorator';
5
+ export default class OperatorsEmulate extends CollectionDecorator {
6
+ readonly dataSource: DataSourceDecorator<OperatorsEmulate>;
7
+ private readonly fields;
8
+ emulateFieldOperator(name: string, operator: Operator): void;
9
+ replaceFieldOperator(name: string, operator: Operator, replaceBy: OperatorDefinition): void;
10
+ protected refineSchema(childSchema: CollectionSchema): CollectionSchema;
11
+ protected refineFilter(caller: Caller, filter: PaginatedFilter): Promise<PaginatedFilter>;
12
+ private replaceLeaf;
13
+ private computeEquivalent;
14
+ }
15
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,99 @@
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_context_1 = __importDefault(require("../../context/collection-context"));
8
+ const collection_decorator_1 = __importDefault(require("../collection-decorator"));
9
+ class OperatorsEmulate extends collection_decorator_1.default {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.fields = new Map();
13
+ }
14
+ emulateFieldOperator(name, operator) {
15
+ this.replaceFieldOperator(name, operator, null);
16
+ }
17
+ replaceFieldOperator(name, operator, replaceBy) {
18
+ // Check that the collection can actually support our rewriting
19
+ const pks = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.childCollection.schema);
20
+ pks.forEach(pk => {
21
+ const schema = this.childCollection.schema.fields[pk];
22
+ const operators = schema.filterOperators;
23
+ if (!operators?.has('Equal') || !operators?.has('In')) {
24
+ throw new Error(`Cannot override operators on collection '${this.name}': ` +
25
+ `the primary key columns must support 'Equal' and 'In' operators`);
26
+ }
27
+ });
28
+ // Check that targeted field is valid
29
+ const field = this.childCollection.schema.fields[name];
30
+ datasource_toolkit_1.FieldValidator.validate(this, name);
31
+ if (!field)
32
+ throw new Error('Cannot replace operator for relation');
33
+ // Mark the field operator as replaced.
34
+ if (!this.fields.has(name))
35
+ this.fields.set(name, new Map());
36
+ this.fields.get(name).set(operator, replaceBy);
37
+ this.markSchemaAsDirty();
38
+ }
39
+ refineSchema(childSchema) {
40
+ const fields = {};
41
+ for (const [name, schema] of Object.entries(childSchema.fields)) {
42
+ if (this.fields.has(name)) {
43
+ const column = schema;
44
+ fields[name] = {
45
+ ...column,
46
+ filterOperators: new Set([
47
+ ...(column.filterOperators ?? []),
48
+ ...this.fields.get(name).keys(),
49
+ ]),
50
+ };
51
+ }
52
+ else {
53
+ fields[name] = schema;
54
+ }
55
+ }
56
+ return { ...childSchema, fields };
57
+ }
58
+ async refineFilter(caller, filter) {
59
+ return filter?.override({
60
+ conditionTree: await filter.conditionTree?.replaceLeafsAsync(leaf => this.replaceLeaf(caller, leaf, [])),
61
+ });
62
+ }
63
+ async replaceLeaf(caller, leaf, replacements) {
64
+ // ConditionTree is targeting a field on another collection => recurse.
65
+ if (leaf.field.includes(':')) {
66
+ const [prefix] = leaf.field.split(':');
67
+ const schema = this.schema.fields[prefix];
68
+ const association = this.dataSource.getCollection(schema.foreignCollection);
69
+ const associationLeaf = await leaf
70
+ .unnest()
71
+ .replaceLeafsAsync(subLeaf => association.replaceLeaf(caller, subLeaf, replacements));
72
+ return associationLeaf.nest(prefix);
73
+ }
74
+ return this.fields.get(leaf.field)?.has(leaf.operator)
75
+ ? this.computeEquivalent(caller, leaf, replacements)
76
+ : leaf;
77
+ }
78
+ async computeEquivalent(caller, leaf, replacements) {
79
+ const handler = this.fields.get(leaf.field)?.get(leaf.operator);
80
+ if (handler) {
81
+ const replacementId = `${this.name}.${leaf.field}[${leaf.operator}]`;
82
+ const subReplacements = [...replacements, replacementId];
83
+ if (replacements.includes(replacementId)) {
84
+ throw new Error(`Operator replacement cycle: ${subReplacements.join(' -> ')}`);
85
+ }
86
+ const result = await handler(leaf.value, new collection_context_1.default(this, caller));
87
+ if (result) {
88
+ let equivalent = result instanceof datasource_toolkit_1.ConditionTree ? result : datasource_toolkit_1.ConditionTreeFactory.fromPlainObject(result);
89
+ equivalent = await equivalent.replaceLeafsAsync(subLeaf => this.replaceLeaf(caller, subLeaf, subReplacements));
90
+ datasource_toolkit_1.ConditionTreeValidator.validate(equivalent, this);
91
+ return equivalent;
92
+ }
93
+ }
94
+ // Query all records on the dataSource and emulate the filter.
95
+ return datasource_toolkit_1.ConditionTreeFactory.matchRecords(this.schema, leaf.apply(await this.list(caller, new datasource_toolkit_1.PaginatedFilter({}), leaf.projection.withPks(this)), this, caller.timezone));
96
+ }
97
+ }
98
+ exports.default = OperatorsEmulate;
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL29wZXJhdG9ycy1lbXVsYXRlL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFjeUM7QUFHekMsMEZBQThFO0FBQzlFLG1GQUEwRDtBQUcxRCxNQUFxQixnQkFBaUIsU0FBUSw4QkFBbUI7SUFBakU7O1FBRW1CLFdBQU0sR0FBbUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQStIdEYsQ0FBQztJQTdIQyxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsUUFBa0I7UUFDbkQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVksRUFBRSxRQUFrQixFQUFFLFNBQTZCO1FBQ2xGLCtEQUErRDtRQUMvRCxNQUFNLEdBQUcsR0FBRyxnQ0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFpQixDQUFDO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFFekMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLDRDQUE0QyxJQUFJLENBQUMsSUFBSSxLQUFLO29CQUN4RCxpRUFBaUUsQ0FDcEUsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsTUFBTSxLQUFLLEdB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