@forestadmin/datasource-customizer 1.1.2-alpha.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.
@@ -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 name;
14
+ private readonly dataSourceCustomizer;
14
15
  private readonly stack;
15
- constructor(stack: DecoratorsStack, name: string);
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
- * Add a relation between two collections.
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.stack.schema.getCollection(this.name).overrideSchema({ countable: false });
17
- return this;
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
- const collection = this.stack.lateComputed.getCollection(this.name);
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.stack.renameField.getCollection(this.name).renameField(oldName, newName);
71
- return this;
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
- const collection = this.stack.publication.getCollection(this.name);
81
- for (const name of names)
82
- collection.changeFieldVisibility(name, false);
83
- return this;
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.stack.action
99
- .getCollection(this.name)
100
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
- .addAction(name, definition);
102
- return this;
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
- const collectionBeforeRelations = this.stack.earlyComputed.getCollection(this.name);
117
- const collectionAfterRelations = this.stack.lateComputed.getCollection(this.name);
118
- const canBeComputedBeforeRelations = definition.dependencies.every(field => {
119
- try {
120
- return !!datasource_toolkit_1.CollectionUtils.getFieldSchema(collectionBeforeRelations, field);
121
- }
122
- catch {
123
- return false;
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.stack.validation.getCollection(this.name).addValidation(name, { operator, value });
142
- return this;
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.addRelation(name, {
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.addRelation(name, {
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.addRelation(name, {
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.addRelation(name, {
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
- const { schema } = this.stack.action.getCollection(this.name);
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.stack.segment.getCollection(this.name).addSegment(name, definition);
256
- return this;
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.stack.sortEmulate.getCollection(this.name).emulateFieldSorting(name);
267
- return this;
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.stack.sortEmulate
285
- .getCollection(this.name)
286
- .replaceFieldSorting(name, equivalentSort);
287
- return this;
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
- const collection = this.stack.lateOpEmulate.getCollection(this.name);
298
- const field = collection.schema.fields[name];
299
- if (typeof field.columnType === 'string') {
300
- const operators = datasource_toolkit_1.allowedOperatorsForColumnType[field.columnType];
301
- for (const operator of operators) {
302
- if (!field.filterOperators?.has(operator)) {
303
- this.emulateFieldOperator(name, operator);
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
- const collection = this.stack.earlyOpEmulate.getCollection(this.name).schema.fields[name]
319
- ? this.stack.earlyOpEmulate.getCollection(this.name)
320
- : this.stack.lateOpEmulate.getCollection(this.name);
321
- collection.emulateFieldOperator(name, operator);
322
- return this;
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
- const collection = this.stack.earlyOpEmulate.getCollection(this.name).schema.fields[name]
348
- ? this.stack.earlyOpEmulate.getCollection(this.name)
349
- : this.stack.lateOpEmulate.getCollection(this.name);
350
- collection.replaceFieldOperator(name, operator, replacer);
351
- return this;
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.stack.write.getCollection(this.name).replaceFieldWriting(name, definition);
365
- return this;
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.stack.search
377
- .getCollection(this.name)
378
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
379
- .replaceSearch(definition);
380
- return this;
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.stack.hook
384
- .getCollection(this.name)
385
- .addHook(position, type, handler);
386
- return this;
378
+ return this.pushCustomization(async () => {
379
+ this.stack.hook
380
+ .getCollection(this.name)
381
+ .addHook(position, type, handler);
382
+ });
387
383
  }
388
- /**
389
- * Add a relation between two collections.
390
- * @param name name of the new relation
391
- * @param definition definition of the new relation
392
- * @example
393
- * .addRelation('author', {
394
- * type: 'ManyToOne',
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
- private customizations;
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.customizations.push(async (logger) => {
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.customizations.push(async () => {
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.customizations.push(async () => {
78
- if (this.stack.dataSource.getCollection(name)) {
79
- handle(new collection_customizer_1.default(this.stack, name));
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
- while (this.customizations.length) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS1jdXN0b21pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhdGFzb3VyY2UtY3VzdG9taXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUtBLG9GQUEyRDtBQUMzRCw2RkFBb0U7QUFDcEUscUZBQTREO0FBQzVELGdHQUFzRztBQUN0RywyRkFBNEY7QUFDNUYsMEVBQWlEO0FBRWpEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXFCLG9CQUFvQjtJQUt2QztRQUZRLG1CQUFjLEdBQTBDLEVBQUUsQ0FBQztRQUdqRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSw4QkFBbUIsRUFBYyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSwwQkFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLE9BQTBCLEVBQUUsT0FBMkI7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ3RDLElBQUksVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXZDLElBQUksT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFO2dCQUN4QyxNQUFNLG9CQUFvQixHQUFHLElBQUksb0JBQXdDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RGLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvRSxVQUFVLEdBQUcsb0JBQW9CLENBQUM7YUFDbkM7WUFFRCxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQ25CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxvQkFBbUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNwRCxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7YUFDL0I7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxRQUFRLENBQUMsSUFBWSxFQUFFLFVBQThCO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLENBQ2pCLElBQU8sRUFDUCxNQUEyRDtRQUUzRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0MsTUFBTSxDQUFDLElBQUksK0JBQW9CLENBQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzFEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDaEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUNqQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7U0FDbkY7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxLQUFLLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsV0FBbUIsRUFBRSxlQUF1QjtRQUN4RSxPQUFPLDBCQUFlLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7Q0FDRjtBQTdGRCx1Q0E2RkMifQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL2RlY29yYXRvcnMtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxzRUFBNkQ7QUFDN0Qsb0VBQTBEO0FBQzFELHVFQUFnRTtBQUNoRSxrRkFBeUQ7QUFDekQsb0VBQTBEO0FBQzFELG1FQUF3RDtBQUN4RCxnRkFBaUY7QUFDakYsZ0ZBQWlGO0FBQ2pGLGdGQUFpRjtBQUNqRix1RUFBZ0U7QUFDaEUsMkVBQXVFO0FBQ3ZFLHNFQUE0RDtBQUM1RCxzRUFBNEQ7QUFDNUQsdUVBQThEO0FBQzlELDRFQUF1RTtBQUN2RSwwRUFBb0U7QUFDcEUscUVBQTBEO0FBRTFELE1BQXFCLGVBQWU7SUFzQmxDLFlBQVksVUFBc0I7UUFDaEMsSUFBSSxJQUFJLEdBQWUsVUFBVSxDQUFDO1FBRWxDLG9DQUFvQztRQUNwQyxtRkFBbUY7UUFDbkYsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQXdCLENBQUMsQ0FBQztRQUU1RSw2RkFBNkY7UUFDN0Ysc0VBQXNFO1FBQ3RFLDJGQUEyRjtRQUMzRixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBMkIsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUFtQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQW1DLENBQUMsQ0FBQztRQUNoRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBMkIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUEyQixDQUFDLENBQUM7UUFDdEYsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQW1DLENBQUMsQ0FBQztRQUMvRixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBbUMsQ0FBQyxDQUFDO1FBRS9GLDRFQUE0RTtRQUM1RSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxxQkFBeUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUEwQixDQUFDLENBQUM7UUFDaEYsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUscUJBQThCLENBQUMsQ0FBQztRQUV4Rix5REFBeUQ7UUFDekQsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxvQkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBeUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUF5QixDQUFDLENBQUM7UUFDOUUsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUscUJBQTZCLENBQUMsQ0FBQztRQUN0RixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxxQkFBd0IsQ0FBQyxDQUFDO1FBQzVFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUF1QixDQUFDLENBQUM7UUFFMUUsOEZBQThGO1FBQzlGLGlCQUFpQjtRQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBbUMsQ0FBQyxDQUFDO1FBQzdGLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUE4QixDQUFDLENBQUM7UUFDeEYsbUNBQW1DO1FBRW5DLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQTdERCxrQ0E2REMifQ==
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL2RlY29yYXRvcnMtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxzRUFBNkQ7QUFDN0Qsb0VBQTBEO0FBQzFELHVFQUFnRTtBQUNoRSxrRkFBeUQ7QUFDekQsb0VBQTBEO0FBQzFELG1FQUF3RDtBQUN4RCxnRkFBaUY7QUFDakYsZ0ZBQWlGO0FBQ2pGLGdGQUFpRjtBQUNqRix1RUFBZ0U7QUFDaEUsMkVBQXVFO0FBQ3ZFLHNFQUE0RDtBQUM1RCxzRUFBNEQ7QUFDNUQsdUVBQThEO0FBQzlELDRFQUF1RTtBQUN2RSwwRUFBb0U7QUFDcEUscUVBQTBEO0FBRTFELE1BQXFCLGVBQWU7SUF3QmxDLFlBQVksVUFBc0I7UUFGMUIsbUJBQWMsR0FBNkMsRUFBRSxDQUFDO1FBR3BFLElBQUksSUFBSSxHQUFlLFVBQVUsQ0FBQztRQUVsQyxvQ0FBb0M7UUFDcEMsbUZBQW1GO1FBQ25GLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUF3QixDQUFDLENBQUM7UUFFNUUsNkZBQTZGO1FBQzdGLHNFQUFzRTtRQUN0RSwyRkFBMkY7UUFDM0YsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQTJCLENBQUMsQ0FBQztRQUN2RixJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBbUMsQ0FBQyxDQUFDO1FBQ2hHLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUFtQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQTJCLENBQUMsQ0FBQztRQUNsRixJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBMkIsQ0FBQyxDQUFDO1FBQ3RGLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLG9CQUFtQyxDQUFDLENBQUM7UUFDL0YsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQW1DLENBQUMsQ0FBQztRQUUvRiw0RUFBNEU7UUFDNUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUscUJBQXlCLENBQUMsQ0FBQztRQUM5RSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxxQkFBMEIsQ0FBQyxDQUFDO1FBQ2hGLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUE4QixDQUFDLENBQUM7UUFFeEYseURBQXlEO1FBQ3pELElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksb0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQXlCLENBQUMsQ0FBQztRQUM5RSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxxQkFBeUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksOEJBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUE2QixDQUFDLENBQUM7UUFDdEYsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUscUJBQXdCLENBQUMsQ0FBQztRQUM1RSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBdUIsQ0FBQyxDQUFDO1FBRTFFLDhGQUE4RjtRQUM5RixpQkFBaUI7UUFDakIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSw4QkFBbUIsQ0FBQyxJQUFJLEVBQUUsb0JBQW1DLENBQUMsQ0FBQztRQUM3RixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLDhCQUFtQixDQUFDLElBQUksRUFBRSxvQkFBOEIsQ0FBQyxDQUFDO1FBQ3hGLG1DQUFtQztRQUVuQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsYUFBZ0Q7UUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxNQUFjO1FBQzVDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFL0IsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7WUFDbEMsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztZQUNuRixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztTQUN0RjtJQUNILENBQUM7Q0FDRjtBQXBGRCxrQ0FvRkMifQ==
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/datasource-customizer",
3
- "version": "1.1.2-alpha.1",
3
+ "version": "1.2.0",
4
4
  "main": "dist/index.js",
5
5
  "license": "GPL-3.0",
6
6
  "publishConfig": {
@@ -29,7 +29,7 @@
29
29
  "fishery": "^2.1.0"
30
30
  },
31
31
  "dependencies": {
32
- "@forestadmin/datasource-toolkit": "1.0.1-alpha.1",
32
+ "@forestadmin/datasource-toolkit": "1.0.0",
33
33
  "luxon": "^2.3.0",
34
34
  "object-hash": "^3.0.0",
35
35
  "uuid": "^8.3.2"