@forestadmin/datasource-customizer 1.1.1 → 1.2.0
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.
- package/dist/collection-customizer.d.ts +19 -16
- package/dist/collection-customizer.js +120 -130
- package/dist/datasource-customizer.d.ts +25 -3
- package/dist/datasource-customizer.js +38 -11
- package/dist/decorators/decorators-stack.d.ts +11 -1
- package/dist/decorators/decorators-stack.js +20 -1
- package/dist/plugins/add-external-relation.d.ts +8 -0
- package/dist/plugins/add-external-relation.js +13 -0
- package/dist/plugins/import-field.d.ts +9 -0
- package/dist/plugins/import-field.js +45 -0
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
|
@@ -1,18 +1,31 @@
|
|
|
1
|
-
import { Operator } from '@forestadmin/datasource-toolkit';
|
|
1
|
+
import { CollectionSchema, Operator } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { ActionDefinition } from './decorators/actions/types/actions';
|
|
3
3
|
import { ComputedDefinition } from './decorators/computed/types';
|
|
4
4
|
import { HookHandler, HookPosition, HookType, HooksContext } from './decorators/hook/types';
|
|
5
|
-
import { OneToManyEmbeddedDefinition } from './types';
|
|
5
|
+
import { OneToManyEmbeddedDefinition, Plugin } from './types';
|
|
6
6
|
import { OperatorDefinition } from './decorators/operators-emulate/types';
|
|
7
7
|
import { SearchDefinition } from './decorators/search/types';
|
|
8
8
|
import { SegmentDefinition } from './decorators/segment/types';
|
|
9
9
|
import { TCollectionName, TColumnName, TFieldName, TSchema, TSortClause } from './templates';
|
|
10
10
|
import { WriteDefinition } from './decorators/write/types';
|
|
11
|
+
import DataSourceCustomizer from './datasource-customizer';
|
|
11
12
|
import DecoratorsStack from './decorators/decorators-stack';
|
|
12
13
|
export default class CollectionCustomizer<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> {
|
|
13
|
-
private readonly
|
|
14
|
+
private readonly dataSourceCustomizer;
|
|
14
15
|
private readonly stack;
|
|
15
|
-
|
|
16
|
+
readonly name: string;
|
|
17
|
+
get schema(): CollectionSchema;
|
|
18
|
+
constructor(dataSourceCustomizer: DataSourceCustomizer<S>, stack: DecoratorsStack, name: string);
|
|
19
|
+
/**
|
|
20
|
+
* Load a plugin on the collection.
|
|
21
|
+
* @param plugin reference to the plugin function
|
|
22
|
+
* @param options options to pass to the plugin
|
|
23
|
+
* @example
|
|
24
|
+
* import { createFileField } from '@forestadmin/plugin-s3';
|
|
25
|
+
*
|
|
26
|
+
* collection.use(createFileField, { fieldname: 'avatar' }),
|
|
27
|
+
*/
|
|
28
|
+
use<Options>(plugin: Plugin<Options>, options?: Options): this;
|
|
16
29
|
/**
|
|
17
30
|
* Disable count in list view pagination for improved performance.
|
|
18
31
|
*
|
|
@@ -247,17 +260,7 @@ export default class CollectionCustomizer<S extends TSchema = TSchema, N extends
|
|
|
247
260
|
*/
|
|
248
261
|
replaceSearch(definition: SearchDefinition<S, N>): this;
|
|
249
262
|
addHook<P extends HookPosition, T extends HookType>(position: P, type: T, handler: HookHandler<HooksContext<S, N>[P][T]>): this;
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
* @param name name of the new relation
|
|
253
|
-
* @param definition definition of the new relation
|
|
254
|
-
* @example
|
|
255
|
-
* .addRelation('author', {
|
|
256
|
-
* type: 'ManyToOne',
|
|
257
|
-
* foreignCollection: 'persons',
|
|
258
|
-
* foreignKey: 'authorId'
|
|
259
|
-
* });
|
|
260
|
-
*/
|
|
261
|
-
private addRelation;
|
|
263
|
+
private pushRelation;
|
|
264
|
+
private pushCustomization;
|
|
262
265
|
}
|
|
263
266
|
//# sourceMappingURL=collection-customizer.d.ts.map
|
|
@@ -1,11 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const add_external_relation_1 = __importDefault(require("./plugins/add-external-relation"));
|
|
8
|
+
const import_field_1 = __importDefault(require("./plugins/import-field"));
|
|
4
9
|
class CollectionCustomizer {
|
|
5
|
-
constructor(stack, name) {
|
|
10
|
+
constructor(dataSourceCustomizer, stack, name) {
|
|
11
|
+
this.dataSourceCustomizer = dataSourceCustomizer;
|
|
6
12
|
this.name = name;
|
|
7
13
|
this.stack = stack;
|
|
8
14
|
}
|
|
15
|
+
get schema() {
|
|
16
|
+
return this.stack.hook.getCollection(this.name).schema;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load a plugin on the collection.
|
|
20
|
+
* @param plugin reference to the plugin function
|
|
21
|
+
* @param options options to pass to the plugin
|
|
22
|
+
* @example
|
|
23
|
+
* import { createFileField } from '@forestadmin/plugin-s3';
|
|
24
|
+
*
|
|
25
|
+
* collection.use(createFileField, { fieldname: 'avatar' }),
|
|
26
|
+
*/
|
|
27
|
+
use(plugin, options) {
|
|
28
|
+
return this.pushCustomization(async () => {
|
|
29
|
+
await plugin(this.dataSourceCustomizer, this, options);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
9
32
|
/**
|
|
10
33
|
* Disable count in list view pagination for improved performance.
|
|
11
34
|
*
|
|
@@ -13,8 +36,9 @@ class CollectionCustomizer {
|
|
|
13
36
|
* .disableCount()
|
|
14
37
|
*/
|
|
15
38
|
disableCount() {
|
|
16
|
-
this.
|
|
17
|
-
|
|
39
|
+
return this.pushCustomization(async () => {
|
|
40
|
+
this.stack.schema.getCollection(this.name).overrideSchema({ countable: false });
|
|
41
|
+
});
|
|
18
42
|
}
|
|
19
43
|
/**
|
|
20
44
|
* Import a field from a many to one or one to one relation.
|
|
@@ -25,39 +49,7 @@ class CollectionCustomizer {
|
|
|
25
49
|
* .importField('authorName', { path: 'author:fullName' })
|
|
26
50
|
*/
|
|
27
51
|
importField(name, options) {
|
|
28
|
-
|
|
29
|
-
const schema = datasource_toolkit_1.CollectionUtils.getFieldSchema(collection, options.path);
|
|
30
|
-
this.addField(name, {
|
|
31
|
-
columnType: schema.columnType,
|
|
32
|
-
defaultValue: schema.defaultValue,
|
|
33
|
-
dependencies: [options.path],
|
|
34
|
-
getValues: records => records.map(r => datasource_toolkit_1.RecordUtils.getFieldValue(r, options.path)),
|
|
35
|
-
enumValues: schema.enumValues,
|
|
36
|
-
});
|
|
37
|
-
if (!schema.isReadOnly && !options.readonly) {
|
|
38
|
-
this.stack.write.getCollection(this.name).replaceFieldWriting(name, value => {
|
|
39
|
-
const path = options.path.split(':');
|
|
40
|
-
const writingPath = {};
|
|
41
|
-
path.reduce((nestedPath, currentPath, index) => {
|
|
42
|
-
nestedPath[currentPath] = index === path.length - 1 ? value : {};
|
|
43
|
-
return nestedPath[currentPath];
|
|
44
|
-
}, writingPath);
|
|
45
|
-
return writingPath;
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
if (schema.isReadOnly && options.readonly === false) {
|
|
49
|
-
throw new Error(`Readonly option should not be false because the field "${options.path}" is not writable`);
|
|
50
|
-
}
|
|
51
|
-
for (const operator of schema.filterOperators) {
|
|
52
|
-
const handler = value => ({ field: options.path, operator, value });
|
|
53
|
-
this.replaceFieldOperator(name, operator, handler);
|
|
54
|
-
}
|
|
55
|
-
if (schema.isSortable) {
|
|
56
|
-
this.replaceFieldSorting(name, [
|
|
57
|
-
{ field: options.path, ascending: true },
|
|
58
|
-
]);
|
|
59
|
-
}
|
|
60
|
-
return this;
|
|
52
|
+
return this.use(import_field_1.default, { name, ...options });
|
|
61
53
|
}
|
|
62
54
|
/**
|
|
63
55
|
* Allow to rename a field of a given collection.
|
|
@@ -67,8 +59,9 @@ class CollectionCustomizer {
|
|
|
67
59
|
* .renameField('theCurrentNameOfTheField', 'theNewNameOfTheField');
|
|
68
60
|
*/
|
|
69
61
|
renameField(oldName, newName) {
|
|
70
|
-
this.
|
|
71
|
-
|
|
62
|
+
return this.pushCustomization(async () => {
|
|
63
|
+
this.stack.renameField.getCollection(this.name).renameField(oldName, newName);
|
|
64
|
+
});
|
|
72
65
|
}
|
|
73
66
|
/**
|
|
74
67
|
* Remove field by setting its visibility to false.
|
|
@@ -77,10 +70,11 @@ class CollectionCustomizer {
|
|
|
77
70
|
* .removeField('aFieldToRemove', 'anotherFieldToRemove');
|
|
78
71
|
*/
|
|
79
72
|
removeField(...names) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
return this.pushCustomization(async () => {
|
|
74
|
+
const collection = this.stack.publication.getCollection(this.name);
|
|
75
|
+
for (const name of names)
|
|
76
|
+
collection.changeFieldVisibility(name, false);
|
|
77
|
+
});
|
|
84
78
|
}
|
|
85
79
|
/**
|
|
86
80
|
* Add a new action on the collection.
|
|
@@ -95,11 +89,12 @@ class CollectionCustomizer {
|
|
|
95
89
|
* })
|
|
96
90
|
*/
|
|
97
91
|
addAction(name, definition) {
|
|
98
|
-
this.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
92
|
+
return this.pushCustomization(async () => {
|
|
93
|
+
this.stack.action
|
|
94
|
+
.getCollection(this.name)
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
+
.addAction(name, definition);
|
|
97
|
+
});
|
|
103
98
|
}
|
|
104
99
|
/**
|
|
105
100
|
* Add a new field on the collection.
|
|
@@ -113,21 +108,22 @@ class CollectionCustomizer {
|
|
|
113
108
|
* });
|
|
114
109
|
*/
|
|
115
110
|
addField(name, definition) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
111
|
+
return this.pushCustomization(async () => {
|
|
112
|
+
const collectionBeforeRelations = this.stack.earlyComputed.getCollection(this.name);
|
|
113
|
+
const collectionAfterRelations = this.stack.lateComputed.getCollection(this.name);
|
|
114
|
+
const canBeComputedBeforeRelations = definition.dependencies.every(field => {
|
|
115
|
+
try {
|
|
116
|
+
return !!datasource_toolkit_1.CollectionUtils.getFieldSchema(collectionBeforeRelations, field);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
const collection = canBeComputedBeforeRelations
|
|
123
|
+
? collectionBeforeRelations
|
|
124
|
+
: collectionAfterRelations;
|
|
125
|
+
collection.registerComputed(name, definition);
|
|
125
126
|
});
|
|
126
|
-
const collection = canBeComputedBeforeRelations
|
|
127
|
-
? collectionBeforeRelations
|
|
128
|
-
: collectionAfterRelations;
|
|
129
|
-
collection.registerComputed(name, definition);
|
|
130
|
-
return this;
|
|
131
127
|
}
|
|
132
128
|
/**
|
|
133
129
|
* Add a new validator to the edition form of a given field
|
|
@@ -138,8 +134,9 @@ class CollectionCustomizer {
|
|
|
138
134
|
* .addFieldValidation('firstName', 'LongerThan', 2);
|
|
139
135
|
*/
|
|
140
136
|
addFieldValidation(name, operator, value) {
|
|
141
|
-
this.
|
|
142
|
-
|
|
137
|
+
return this.pushCustomization(async () => {
|
|
138
|
+
this.stack.validation.getCollection(this.name).addValidation(name, { operator, value });
|
|
139
|
+
});
|
|
143
140
|
}
|
|
144
141
|
/**
|
|
145
142
|
* Add a many to one relation to the collection
|
|
@@ -150,13 +147,12 @@ class CollectionCustomizer {
|
|
|
150
147
|
* books.addManyToOneRelation('myAuthor', 'persons', { foreignKey: 'authorId' })
|
|
151
148
|
*/
|
|
152
149
|
addManyToOneRelation(name, foreignCollection, options) {
|
|
153
|
-
this.
|
|
150
|
+
return this.pushRelation(name, {
|
|
154
151
|
type: 'ManyToOne',
|
|
155
152
|
foreignCollection,
|
|
156
153
|
foreignKey: options.foreignKey,
|
|
157
154
|
foreignKeyTarget: options.foreignKeyTarget,
|
|
158
155
|
});
|
|
159
|
-
return this;
|
|
160
156
|
}
|
|
161
157
|
/**
|
|
162
158
|
* Add a one to many relation to the collection
|
|
@@ -167,13 +163,12 @@ class CollectionCustomizer {
|
|
|
167
163
|
* persons.addOneToManyRelation('writtenBooks', 'books', { originKey: 'authorId' })
|
|
168
164
|
*/
|
|
169
165
|
addOneToManyRelation(name, foreignCollection, options) {
|
|
170
|
-
this.
|
|
166
|
+
return this.pushRelation(name, {
|
|
171
167
|
type: 'OneToMany',
|
|
172
168
|
foreignCollection,
|
|
173
169
|
originKey: options.originKey,
|
|
174
170
|
originKeyTarget: options.originKeyTarget,
|
|
175
171
|
});
|
|
176
|
-
return this;
|
|
177
172
|
}
|
|
178
173
|
/**
|
|
179
174
|
* Add a one to one relation to the collection
|
|
@@ -184,13 +179,12 @@ class CollectionCustomizer {
|
|
|
184
179
|
* persons.addOneToOneRelation('bestFriend', 'persons', { originKey: 'bestFriendId' })
|
|
185
180
|
*/
|
|
186
181
|
addOneToOneRelation(name, foreignCollection, options) {
|
|
187
|
-
this.
|
|
182
|
+
return this.pushRelation(name, {
|
|
188
183
|
type: 'OneToOne',
|
|
189
184
|
foreignCollection,
|
|
190
185
|
originKey: options.originKey,
|
|
191
186
|
originKeyTarget: options.originKeyTarget,
|
|
192
187
|
});
|
|
193
|
-
return this;
|
|
194
188
|
}
|
|
195
189
|
/**
|
|
196
190
|
* Add a many to many relation to the collection
|
|
@@ -205,7 +199,7 @@ class CollectionCustomizer {
|
|
|
205
199
|
* })
|
|
206
200
|
*/
|
|
207
201
|
addManyToManyRelation(name, foreignCollection, throughCollection, options) {
|
|
208
|
-
this.
|
|
202
|
+
return this.pushRelation(name, {
|
|
209
203
|
type: 'ManyToMany',
|
|
210
204
|
foreignCollection,
|
|
211
205
|
throughCollection,
|
|
@@ -214,7 +208,6 @@ class CollectionCustomizer {
|
|
|
214
208
|
foreignKey: options.foreignKey,
|
|
215
209
|
foreignKeyTarget: options.foreignKeyTarget,
|
|
216
210
|
});
|
|
217
|
-
return this;
|
|
218
211
|
}
|
|
219
212
|
/**
|
|
220
213
|
* Add a virtual collection into the related data of a record.
|
|
@@ -232,13 +225,7 @@ class CollectionCustomizer {
|
|
|
232
225
|
* })
|
|
233
226
|
*/
|
|
234
227
|
addExternalRelation(name, definition) {
|
|
235
|
-
|
|
236
|
-
const primaryKeys = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(schema);
|
|
237
|
-
return this.addField(name, {
|
|
238
|
-
dependencies: definition.dependencies ?? primaryKeys,
|
|
239
|
-
columnType: [definition.schema],
|
|
240
|
-
getValues: async (records, context) => Promise.all(records.map(async (record) => definition.listRecords(record, context))),
|
|
241
|
-
});
|
|
228
|
+
return this.use(add_external_relation_1.default, { name, ...definition });
|
|
242
229
|
}
|
|
243
230
|
/**
|
|
244
231
|
* Add a new segment on the collection.
|
|
@@ -252,8 +239,9 @@ class CollectionCustomizer {
|
|
|
252
239
|
* );
|
|
253
240
|
*/
|
|
254
241
|
addSegment(name, definition) {
|
|
255
|
-
this.
|
|
256
|
-
|
|
242
|
+
return this.pushCustomization(async () => {
|
|
243
|
+
this.stack.segment.getCollection(this.name).addSegment(name, definition);
|
|
244
|
+
});
|
|
257
245
|
}
|
|
258
246
|
/**
|
|
259
247
|
* Enable sorting on a specific field using emulation.
|
|
@@ -263,8 +251,9 @@ class CollectionCustomizer {
|
|
|
263
251
|
* .emulateFieldSorting('fullName');
|
|
264
252
|
*/
|
|
265
253
|
emulateFieldSorting(name) {
|
|
266
|
-
this.
|
|
267
|
-
|
|
254
|
+
return this.pushCustomization(async () => {
|
|
255
|
+
this.stack.sortEmulate.getCollection(this.name).emulateFieldSorting(name);
|
|
256
|
+
});
|
|
268
257
|
}
|
|
269
258
|
/**
|
|
270
259
|
* Replace an implementation for the sorting.
|
|
@@ -281,10 +270,11 @@ class CollectionCustomizer {
|
|
|
281
270
|
* )
|
|
282
271
|
*/
|
|
283
272
|
replaceFieldSorting(name, equivalentSort) {
|
|
284
|
-
this.
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
273
|
+
return this.pushCustomization(async () => {
|
|
274
|
+
this.stack.sortEmulate
|
|
275
|
+
.getCollection(this.name)
|
|
276
|
+
.replaceFieldSorting(name, equivalentSort);
|
|
277
|
+
});
|
|
288
278
|
}
|
|
289
279
|
/**
|
|
290
280
|
* Enable filtering on a specific field using emulation.
|
|
@@ -294,17 +284,18 @@ class CollectionCustomizer {
|
|
|
294
284
|
* .emulateFieldFiltering('aField');
|
|
295
285
|
*/
|
|
296
286
|
emulateFieldFiltering(name) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
287
|
+
return this.pushCustomization(async () => {
|
|
288
|
+
const collection = this.stack.lateOpEmulate.getCollection(this.name);
|
|
289
|
+
const field = collection.schema.fields[name];
|
|
290
|
+
if (typeof field.columnType === 'string') {
|
|
291
|
+
const operators = datasource_toolkit_1.allowedOperatorsForColumnType[field.columnType];
|
|
292
|
+
for (const operator of operators) {
|
|
293
|
+
if (!field.filterOperators?.has(operator)) {
|
|
294
|
+
this.emulateFieldOperator(name, operator);
|
|
295
|
+
}
|
|
304
296
|
}
|
|
305
297
|
}
|
|
306
|
-
}
|
|
307
|
-
return this;
|
|
298
|
+
});
|
|
308
299
|
}
|
|
309
300
|
/**
|
|
310
301
|
* Enable filtering on a specific field with a specific operator using emulation.
|
|
@@ -315,11 +306,12 @@ class CollectionCustomizer {
|
|
|
315
306
|
* .emulateFieldOperator('aField', 'In');
|
|
316
307
|
*/
|
|
317
308
|
emulateFieldOperator(name, operator) {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
309
|
+
return this.pushCustomization(async () => {
|
|
310
|
+
const collection = this.stack.earlyOpEmulate.getCollection(this.name).schema.fields[name]
|
|
311
|
+
? this.stack.earlyOpEmulate.getCollection(this.name)
|
|
312
|
+
: this.stack.lateOpEmulate.getCollection(this.name);
|
|
313
|
+
collection.emulateFieldOperator(name, operator);
|
|
314
|
+
});
|
|
323
315
|
}
|
|
324
316
|
/**
|
|
325
317
|
* Replace an implementation for a specific operator on a specific field.
|
|
@@ -344,11 +336,12 @@ class CollectionCustomizer {
|
|
|
344
336
|
* });
|
|
345
337
|
*/
|
|
346
338
|
replaceFieldOperator(name, operator, replacer) {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
339
|
+
return this.pushCustomization(async () => {
|
|
340
|
+
const collection = this.stack.earlyOpEmulate.getCollection(this.name).schema.fields[name]
|
|
341
|
+
? this.stack.earlyOpEmulate.getCollection(this.name)
|
|
342
|
+
: this.stack.lateOpEmulate.getCollection(this.name);
|
|
343
|
+
collection.replaceFieldOperator(name, operator, replacer);
|
|
344
|
+
});
|
|
352
345
|
}
|
|
353
346
|
/**
|
|
354
347
|
* Replace the write behavior of a field.
|
|
@@ -361,8 +354,9 @@ class CollectionCustomizer {
|
|
|
361
354
|
* });
|
|
362
355
|
*/
|
|
363
356
|
replaceFieldWriting(name, definition) {
|
|
364
|
-
this.
|
|
365
|
-
|
|
357
|
+
return this.pushCustomization(async () => {
|
|
358
|
+
this.stack.write.getCollection(this.name).replaceFieldWriting(name, definition);
|
|
359
|
+
});
|
|
366
360
|
}
|
|
367
361
|
/**
|
|
368
362
|
* Replace the behavior of the search bar
|
|
@@ -373,33 +367,29 @@ class CollectionCustomizer {
|
|
|
373
367
|
* });
|
|
374
368
|
*/
|
|
375
369
|
replaceSearch(definition) {
|
|
376
|
-
this.
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
370
|
+
return this.pushCustomization(async () => {
|
|
371
|
+
this.stack.search
|
|
372
|
+
.getCollection(this.name)
|
|
373
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
374
|
+
.replaceSearch(definition);
|
|
375
|
+
});
|
|
381
376
|
}
|
|
382
377
|
addHook(position, type, handler) {
|
|
383
|
-
this.
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
378
|
+
return this.pushCustomization(async () => {
|
|
379
|
+
this.stack.hook
|
|
380
|
+
.getCollection(this.name)
|
|
381
|
+
.addHook(position, type, handler);
|
|
382
|
+
});
|
|
387
383
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
* foreignCollection: 'persons',
|
|
396
|
-
* foreignKey: 'authorId'
|
|
397
|
-
* });
|
|
398
|
-
*/
|
|
399
|
-
addRelation(name, definition) {
|
|
400
|
-
this.stack.relation.getCollection(this.name).addRelation(name, definition);
|
|
384
|
+
pushRelation(name, definition) {
|
|
385
|
+
return this.pushCustomization(async () => {
|
|
386
|
+
this.stack.relation.getCollection(this.name).addRelation(name, definition);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
pushCustomization(customization) {
|
|
390
|
+
this.stack.queueCustomization(customization);
|
|
401
391
|
return this;
|
|
402
392
|
}
|
|
403
393
|
}
|
|
404
394
|
exports.default = CollectionCustomizer;
|
|
405
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1jdXN0b21pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxlY3Rpb24tY3VzdG9taXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdFQU95QztBQWN6QyxNQUFxQixvQkFBb0I7SUFPdkMsWUFBWSxLQUFzQixFQUFFLElBQVk7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWTtRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFaEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxJQUFZLEVBQUUsT0FBdUQ7UUFDL0UsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxvQ0FBZSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBaUIsQ0FBQztRQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdDQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsRUFB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
|
|
395
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1jdXN0b21pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxlY3Rpb24tY3VzdG9taXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQU15QztBQWN6Qyw0RkFBa0U7QUFDbEUsMEVBQWlEO0FBRWpELE1BQXFCLG9CQUFvQjtJQVl2QyxZQUFZLG9CQUE2QyxFQUFFLEtBQXNCLEVBQUUsSUFBWTtRQUM3RixJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQVJELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekQsQ0FBQztJQVFEOzs7Ozs7OztPQVFHO0lBQ0gsR0FBRyxDQUFVLE1BQXVCLEVBQUUsT0FBaUI7UUFDckQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFD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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DataSource, DataSourceFactory, Logger } from '@forestadmin/datasource-toolkit';
|
|
1
|
+
import { DataSource, DataSourceFactory, DataSourceSchema, Logger } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { ChartDefinition } from './decorators/chart/types';
|
|
3
|
-
import { DataSourceOptions } from './types';
|
|
3
|
+
import { DataSourceOptions, Plugin } from './types';
|
|
4
4
|
import { TCollectionName, TSchema } from './templates';
|
|
5
5
|
import CollectionCustomizer from './collection-customizer';
|
|
6
6
|
/**
|
|
@@ -16,7 +16,14 @@ import CollectionCustomizer from './collection-customizer';
|
|
|
16
16
|
export default class DataSourceCustomizer<S extends TSchema = TSchema> {
|
|
17
17
|
private readonly compositeDataSource;
|
|
18
18
|
private readonly stack;
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Retrieve schema of the agent
|
|
21
|
+
*/
|
|
22
|
+
get schema(): DataSourceSchema;
|
|
23
|
+
/**
|
|
24
|
+
* Get list of customizable collections
|
|
25
|
+
*/
|
|
26
|
+
get collections(): CollectionCustomizer<S>[];
|
|
20
27
|
constructor();
|
|
21
28
|
/**
|
|
22
29
|
* Add a datasource
|
|
@@ -46,6 +53,21 @@ export default class DataSourceCustomizer<S extends TSchema = TSchema> {
|
|
|
46
53
|
* .customizeCollection('books', books => books.renameField('xx', 'yy'))
|
|
47
54
|
*/
|
|
48
55
|
customizeCollection<N extends TCollectionName<S>>(name: N, handle: (collection: CollectionCustomizer<S, N>) => unknown): this;
|
|
56
|
+
/**
|
|
57
|
+
* Get given collection by name
|
|
58
|
+
* @param name name of the collection
|
|
59
|
+
*/
|
|
60
|
+
getCollection<N extends TCollectionName<S>>(name: N): CollectionCustomizer<S, N>;
|
|
61
|
+
/**
|
|
62
|
+
* Load a plugin across all collections
|
|
63
|
+
* @param plugin instance of the plugin
|
|
64
|
+
* @param options options which need to be passed to the plugin
|
|
65
|
+
* @example
|
|
66
|
+
* import { advancedExport } from '@forestadmin/plugin-advanced-export';
|
|
67
|
+
*
|
|
68
|
+
* dataSourceCustomizer.use(advancedExportPlugin, { format: 'xlsx' });
|
|
69
|
+
*/
|
|
70
|
+
use<Options>(plugin: Plugin<Options>, options?: Options): this;
|
|
49
71
|
getDataSource(logger: Logger): Promise<DataSource>;
|
|
50
72
|
getFactory(): DataSourceFactory;
|
|
51
73
|
updateTypesOnFileSystem(typingsPath: string, typingsMaxDepth: number): Promise<void>;
|
|
@@ -21,17 +21,28 @@ const typing_generator_1 = __importDefault(require("./typing-generator"));
|
|
|
21
21
|
*/
|
|
22
22
|
class DataSourceCustomizer {
|
|
23
23
|
constructor() {
|
|
24
|
-
this.customizations = [];
|
|
25
24
|
this.compositeDataSource = new composite_datasource_1.default();
|
|
26
25
|
this.stack = new decorators_stack_1.default(this.compositeDataSource);
|
|
27
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Retrieve schema of the agent
|
|
29
|
+
*/
|
|
30
|
+
get schema() {
|
|
31
|
+
return this.stack.hook.schema;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get list of customizable collections
|
|
35
|
+
*/
|
|
36
|
+
get collections() {
|
|
37
|
+
return this.stack.hook.collections.map(c => this.getCollection(c.name));
|
|
38
|
+
}
|
|
28
39
|
/**
|
|
29
40
|
* Add a datasource
|
|
30
41
|
* @param factory the datasource to add
|
|
31
42
|
* @param options the options
|
|
32
43
|
*/
|
|
33
44
|
addDataSource(factory, options) {
|
|
34
|
-
this.
|
|
45
|
+
this.stack.queueCustomization(async (logger) => {
|
|
35
46
|
let dataSource = await factory(logger);
|
|
36
47
|
if (options?.include || options?.exclude) {
|
|
37
48
|
const publicationDecorator = new datasource_1.default(dataSource);
|
|
@@ -60,7 +71,7 @@ class DataSourceCustomizer {
|
|
|
60
71
|
* })
|
|
61
72
|
*/
|
|
62
73
|
addChart(name, definition) {
|
|
63
|
-
this.
|
|
74
|
+
this.stack.queueCustomization(async () => {
|
|
64
75
|
this.stack.chart.addChart(name, definition);
|
|
65
76
|
});
|
|
66
77
|
return this;
|
|
@@ -74,17 +85,33 @@ class DataSourceCustomizer {
|
|
|
74
85
|
* .customizeCollection('books', books => books.renameField('xx', 'yy'))
|
|
75
86
|
*/
|
|
76
87
|
customizeCollection(name, handle) {
|
|
77
|
-
this.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
handle(this.getCollection(name));
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get given collection by name
|
|
93
|
+
* @param name name of the collection
|
|
94
|
+
*/
|
|
95
|
+
getCollection(name) {
|
|
96
|
+
return new collection_customizer_1.default(this, this.stack, name);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load a plugin across all collections
|
|
100
|
+
* @param plugin instance of the plugin
|
|
101
|
+
* @param options options which need to be passed to the plugin
|
|
102
|
+
* @example
|
|
103
|
+
* import { advancedExport } from '@forestadmin/plugin-advanced-export';
|
|
104
|
+
*
|
|
105
|
+
* dataSourceCustomizer.use(advancedExportPlugin, { format: 'xlsx' });
|
|
106
|
+
*/
|
|
107
|
+
use(plugin, options) {
|
|
108
|
+
this.stack.queueCustomization(async () => {
|
|
109
|
+
await plugin(this, null, options);
|
|
81
110
|
});
|
|
82
111
|
return this;
|
|
83
112
|
}
|
|
84
113
|
async getDataSource(logger) {
|
|
85
|
-
|
|
86
|
-
await this.customizations.shift()(logger); // eslint-disable-line no-await-in-loop
|
|
87
|
-
}
|
|
114
|
+
await this.stack.applyQueuedCustomizations(logger);
|
|
88
115
|
return this.stack.dataSource;
|
|
89
116
|
}
|
|
90
117
|
getFactory() {
|
|
@@ -95,4 +122,4 @@ class DataSourceCustomizer {
|
|
|
95
122
|
}
|
|
96
123
|
}
|
|
97
124
|
exports.default = DataSourceCustomizer;
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS1jdXN0b21pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhdGFzb3VyY2UtY3VzdG9taXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVdBLG9GQUEyRDtBQUMzRCw2RkFBb0U7QUFDcEUscUZBQTREO0FBQzVELGdHQUFzRztBQUN0RywyRkFBNEY7QUFDNUYsMEVBQWlEO0FBRWpEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXFCLG9CQUFvQjtJQWtCdkM7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSw4QkFBbUIsRUFBYyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSwwQkFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFqQkQ7O09BRUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUEwQixDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBT0Q7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxPQUEwQixFQUFFLE9BQTJCO1FBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQzNDLElBQUksVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXZDLElBQUksT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFO2dCQUN4QyxNQUFNLG9CQUFvQixHQUFHLElBQUksb0JBQXdDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RGLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvRSxVQUFVLEdBQUcsb0JBQW9CLENBQUM7YUFDbkM7WUFFRCxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQ25CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxvQkFBbUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNwRCxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7YUFDL0I7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxRQUFRLENBQUMsSUFBWSxFQUFFLFVBQThCO1FBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxtQkFBbUIsQ0FDakIsSUFBTyxFQUNQLE1BQTJEO1FBRTNELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxDQUErQixJQUFPO1FBQ2pELE9BQU8sSUFBSSwrQkFBb0IsQ0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxHQUFHLENBQVUsTUFBdUIsRUFBRSxPQUFpQjtRQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDaEMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLEtBQUssRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxXQUFtQixFQUFFLGVBQXVCO1FBQ3hFLE9BQU8sMEJBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDaEcsQ0FBQztDQUNGO0FBN0hELHVDQTZIQyJ9
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataSource } from '@forestadmin/datasource-toolkit';
|
|
1
|
+
import { DataSource, Logger } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import ActionCollectionDecorator from './actions/collection';
|
|
3
3
|
import ChartDataSourceDecorator from './chart/datasource';
|
|
4
4
|
import ComputedCollectionDecorator from './computed/collection';
|
|
@@ -37,6 +37,16 @@ export default class DecoratorsStack {
|
|
|
37
37
|
write: DataSourceDecorator<WriteCollectionDecorator>;
|
|
38
38
|
hook: DataSourceDecorator<HookCollectionDecorator>;
|
|
39
39
|
dataSource: DataSource;
|
|
40
|
+
private customizations;
|
|
40
41
|
constructor(dataSource: DataSource);
|
|
42
|
+
queueCustomization(customization: (logger: Logger) => Promise<void>): void;
|
|
43
|
+
/**
|
|
44
|
+
* Apply all customizations
|
|
45
|
+
* Plugins may queue new customizations, or call other plugins which will queue customizations.
|
|
46
|
+
*
|
|
47
|
+
* This method will be called recursively and clears the queue at each recursion to ensure
|
|
48
|
+
* that all customizations are applied in the right order.
|
|
49
|
+
*/
|
|
50
|
+
applyQueuedCustomizations(logger: Logger): Promise<void>;
|
|
41
51
|
}
|
|
42
52
|
//# sourceMappingURL=decorators-stack.d.ts.map
|
|
@@ -22,6 +22,7 @@ const collection_14 = __importDefault(require("./validation/collection"));
|
|
|
22
22
|
const collection_15 = __importDefault(require("./write/collection"));
|
|
23
23
|
class DecoratorsStack {
|
|
24
24
|
constructor(dataSource) {
|
|
25
|
+
this.customizations = [];
|
|
25
26
|
let last = dataSource;
|
|
26
27
|
/* eslint-disable no-multi-assign */
|
|
27
28
|
// Step 0: Do not query datasource when we know the result with yield an empty set.
|
|
@@ -54,6 +55,24 @@ class DecoratorsStack {
|
|
|
54
55
|
/* eslint-enable no-multi-assign */
|
|
55
56
|
this.dataSource = last;
|
|
56
57
|
}
|
|
58
|
+
queueCustomization(customization) {
|
|
59
|
+
this.customizations.push(customization);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Apply all customizations
|
|
63
|
+
* Plugins may queue new customizations, or call other plugins which will queue customizations.
|
|
64
|
+
*
|
|
65
|
+
* This method will be called recursively and clears the queue at each recursion to ensure
|
|
66
|
+
* that all customizations are applied in the right order.
|
|
67
|
+
*/
|
|
68
|
+
async applyQueuedCustomizations(logger) {
|
|
69
|
+
const queuedCustomizations = this.customizations.slice();
|
|
70
|
+
this.customizations.length = 0;
|
|
71
|
+
while (queuedCustomizations.length) {
|
|
72
|
+
await queuedCustomizations.shift()(logger); // eslint-disable-line no-await-in-loop
|
|
73
|
+
await this.applyQueuedCustomizations(logger); // eslint-disable-line no-await-in-loop
|
|
74
|
+
}
|
|
75
|
+
}
|
|
57
76
|
}
|
|
58
77
|
exports.default = DecoratorsStack;
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL2RlY29yYXRvcnMtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxzRUFBNkQ7QUFDN0Qsb0VBQTBEO0FBQzFELHVFQUFnRTtBQUNoRSxrRkFBeUQ7QUFDekQsb0VBQTBEO0FBQzFELG1FQUF3RDtBQUN4RCxnRkFBaUY7QUFDakYsZ0ZBQWlGO0FBQ2pGLGdGQUFpRjtBQUNqRix1RUFBZ0U7QUFDaEUsMkVBQXVFO0FBQ3ZFLHNFQUE0RDtBQUM1RCxzRUFBNEQ7QUFDNUQsdUVBQThEO0FBQzlELDRFQUF1RTtBQUN2RSwwRUFBb0U7QUFDcEUscUVBQTBEO0FBRTFELE1BQXFCLGVBQWU7SUF3QmxDLFlBQVksVUFBc0I7UUFGMUIsbUJBQWMsR0FBNkMsRUFBRSxDQUFDO1FBR3BFLElBQUksSUFBSSxHQUFlLFVBQVUsQ0FBQztRQUVsQyxvQ0FBb0M7UUFDcEMsbUZBQW1GO1FBQ25GLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUF3QixDQUFDLENBQUM7UUFFNUUsNkZBQTZGO1FBQzdGLHNFQUFzRTtRQUN0RSwyRkFBMkY7UUFDM0YsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQTJCLENBQUMsQ0FBQztRQUN2RixJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBbUMsQ0FBQyxDQUFDO1FBQ2hHLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUFtQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { OneToManyEmbeddedDefinition } from '../types';
|
|
2
|
+
import { TCollectionName, TSchema } from '../templates';
|
|
3
|
+
import CollectionCustomizer from '../collection-customizer';
|
|
4
|
+
import DataSourceCustomizer from '../datasource-customizer';
|
|
5
|
+
export default function addExternalRelation<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>>(dataSourceCustomizer: DataSourceCustomizer<S>, collectionCustomizer: CollectionCustomizer<S, N>, options: {
|
|
6
|
+
name: string;
|
|
7
|
+
} & OneToManyEmbeddedDefinition<S, N>): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=add-external-relation.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
4
|
+
async function addExternalRelation(dataSourceCustomizer, collectionCustomizer, options) {
|
|
5
|
+
const primaryKeys = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(collectionCustomizer.schema);
|
|
6
|
+
collectionCustomizer.addField(options.name, {
|
|
7
|
+
dependencies: options.dependencies ?? primaryKeys,
|
|
8
|
+
columnType: [options.schema],
|
|
9
|
+
getValues: async (records, context) => Promise.all(records.map(async (record) => options.listRecords(record, context))),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
exports.default = addExternalRelation;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWV4dGVybmFsLXJlbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvYWRkLWV4dGVybmFsLXJlbGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsd0VBQThEO0FBTy9DLEtBQUssVUFBVSxtQkFBbUIsQ0FJL0Msb0JBQTZDLEVBQzdDLG9CQUFnRCxFQUNoRCxPQUE2RDtJQUU3RCxNQUFNLFdBQVcsR0FBRyxnQ0FBVyxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQXVCLENBQUM7SUFFbEcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7UUFDMUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksV0FBVztRQUNqRCxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzVCLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ2pGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFoQkQsc0NBZ0JDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TCollectionName, TFieldName, TSchema } from '../templates';
|
|
2
|
+
import CollectionCustomizer from '../collection-customizer';
|
|
3
|
+
import DataSourceCustomizer from '../datasource-customizer';
|
|
4
|
+
export default function importField<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>>(dataSourceCustomizer: DataSourceCustomizer<S>, collectionCustomizer: CollectionCustomizer<S, N>, options: {
|
|
5
|
+
name: string;
|
|
6
|
+
path: TFieldName<S, N>;
|
|
7
|
+
readonly?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=import-field.d.ts.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
4
|
+
async function importField(dataSourceCustomizer, collectionCustomizer, options) {
|
|
5
|
+
const name = options.name;
|
|
6
|
+
const { schema } = options.path.split(':').reduce((memo, field) => {
|
|
7
|
+
const collection = dataSourceCustomizer.getCollection(memo.collection);
|
|
8
|
+
const fieldSchema = collection.schema.fields[field];
|
|
9
|
+
if (fieldSchema.type === 'Column')
|
|
10
|
+
return { schema: fieldSchema };
|
|
11
|
+
if (fieldSchema.type === 'ManyToOne' || fieldSchema.type === 'OneToOne')
|
|
12
|
+
return { collection: fieldSchema.foreignCollection };
|
|
13
|
+
throw new Error('Invalid options.path');
|
|
14
|
+
}, { collection: collectionCustomizer.name });
|
|
15
|
+
collectionCustomizer.addField(name, {
|
|
16
|
+
columnType: schema.columnType,
|
|
17
|
+
defaultValue: schema.defaultValue,
|
|
18
|
+
dependencies: [options.path],
|
|
19
|
+
getValues: records => records.map(r => datasource_toolkit_1.RecordUtils.getFieldValue(r, options.path)),
|
|
20
|
+
enumValues: schema.enumValues,
|
|
21
|
+
});
|
|
22
|
+
if (!schema.isReadOnly && !options.readonly) {
|
|
23
|
+
collectionCustomizer.replaceFieldWriting(name, value => {
|
|
24
|
+
const path = options.path.split(':');
|
|
25
|
+
const writingPath = {};
|
|
26
|
+
path.reduce((nestedPath, currentPath, index) => {
|
|
27
|
+
nestedPath[currentPath] = index === path.length - 1 ? value : {};
|
|
28
|
+
return nestedPath[currentPath];
|
|
29
|
+
}, writingPath);
|
|
30
|
+
return writingPath;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (schema.isReadOnly && options.readonly === false) {
|
|
34
|
+
throw new Error(`Readonly option should not be false because the field "${options.path}" is not writable`);
|
|
35
|
+
}
|
|
36
|
+
for (const operator of schema.filterOperators) {
|
|
37
|
+
const handler = value => ({ field: options.path, operator, value });
|
|
38
|
+
collectionCustomizer.replaceFieldOperator(name, operator, handler);
|
|
39
|
+
}
|
|
40
|
+
if (schema.isSortable) {
|
|
41
|
+
collectionCustomizer.replaceFieldSorting(name, [{ field: options.path, ascending: true }]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.default = importField;
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvaW1wb3J0LWZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsd0VBQTRFO0FBTzdELEtBQUssVUFBVSxXQUFXLENBSXZDLG9CQUE2QyxFQUM3QyxvQkFBZ0QsRUFDaEQsT0FBcUU7SUFFckUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQXlCLENBQUM7SUFDL0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FDL0MsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDZCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQWdDLENBQUMsQ0FBQztRQUM3RixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbEUsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVU7WUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDMUMsQ0FBQyxFQUNELEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUMxQyxDQUFDO0lBRUYsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtRQUNsQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ2pDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdDQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEYsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO0tBQzlCLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtRQUMzQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDckQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBRXZCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM3QyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFFakUsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRWhCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FDYiwwREFBMEQsT0FBTyxDQUFDLElBQUksbUJBQW1CLENBQzFGLENBQUM7S0FDSDtJQUVELEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTtRQUM3QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQW1DLENBQUMsQ0FBQztLQUNoRztJQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNyQixvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUY7QUFDSCxDQUFDO0FBMURELDhCQTBEQyJ9
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PrimitiveTypes } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { TCollectionName, TFieldName, TRow, TSchema } from './templates';
|
|
3
3
|
import CollectionCustomizationContext from './context/collection-context';
|
|
4
|
+
import CollectionCustomizer from './collection-customizer';
|
|
5
|
+
import DataSourceCustomizer from './datasource-customizer';
|
|
4
6
|
export declare type OneToManyEmbeddedDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
|
|
5
7
|
schema: Record<string, PrimitiveTypes>;
|
|
6
8
|
dependencies?: TFieldName<S, N>[];
|
|
@@ -13,4 +15,5 @@ export declare type DataSourceOptions = {
|
|
|
13
15
|
include?: string[];
|
|
14
16
|
exclude?: string[];
|
|
15
17
|
};
|
|
18
|
+
export declare type Plugin<Options> = (dataSourceCustomizer: DataSourceCustomizer<any>, collectionCustomizer: CollectionCustomizer<any, any>, options?: Options) => Promise<void>;
|
|
16
19
|
//# sourceMappingURL=types.d.ts.map
|