@forestadmin/agent 1.0.0-beta.5 → 1.0.0-beta.52
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/CHANGELOG.md +500 -0
- package/dist/agent/forestadmin-http-driver.d.ts +5 -27
- package/dist/agent/forestadmin-http-driver.js +17 -47
- package/dist/agent/routes/access/api-chart.d.ts +16 -0
- package/dist/agent/routes/access/api-chart.js +47 -0
- package/dist/agent/routes/access/chart.js +47 -23
- package/dist/agent/routes/access/count-related.js +13 -6
- package/dist/agent/routes/access/count.js +14 -7
- package/dist/agent/routes/access/csv-related.js +3 -3
- package/dist/agent/routes/access/csv.js +4 -3
- package/dist/agent/routes/access/get.js +3 -2
- package/dist/agent/routes/access/list-related.js +2 -3
- package/dist/agent/routes/access/list.js +2 -3
- package/dist/agent/routes/base-route.d.ts +0 -1
- package/dist/agent/routes/base-route.js +1 -4
- package/dist/agent/routes/index.js +20 -2
- package/dist/agent/routes/modification/action.d.ts +0 -1
- package/dist/agent/routes/modification/action.js +11 -11
- package/dist/agent/routes/modification/associate-related.d.ts +3 -3
- package/dist/agent/routes/modification/associate-related.js +13 -11
- package/dist/agent/routes/modification/create.js +14 -12
- package/dist/agent/routes/modification/delete.js +3 -2
- package/dist/agent/routes/modification/dissociate-delete-related.js +19 -18
- package/dist/agent/routes/modification/update-field.d.ts +9 -0
- package/dist/agent/routes/modification/update-field.js +39 -0
- package/dist/agent/routes/modification/update-relation.js +19 -13
- package/dist/agent/routes/modification/update.js +5 -3
- package/dist/agent/routes/security/authentication.d.ts +1 -2
- package/dist/agent/routes/security/authentication.js +8 -12
- package/dist/agent/routes/system/error-handling.d.ts +2 -0
- package/dist/agent/routes/system/error-handling.js +28 -9
- package/dist/agent/routes/system/logger.js +4 -5
- package/dist/agent/services/index.js +2 -2
- package/dist/agent/services/serializer.d.ts +0 -5
- package/dist/agent/services/serializer.js +4 -4
- package/dist/agent/types.d.ts +2 -1
- package/dist/agent/types.js +2 -1
- package/dist/agent/utils/condition-tree-parser.d.ts +11 -0
- package/dist/agent/utils/condition-tree-parser.js +53 -0
- package/dist/agent/utils/context-filter-factory.js +1 -2
- package/dist/agent/utils/csv-generator.d.ts +2 -2
- package/dist/agent/utils/csv-generator.js +3 -3
- package/dist/agent/utils/forest-http-api.d.ts +1 -0
- package/dist/agent/utils/forest-http-api.js +58 -50
- package/dist/agent/utils/forest-schema/emitter.d.ts +1 -1
- package/dist/agent/utils/forest-schema/emitter.js +4 -4
- package/dist/agent/utils/forest-schema/generator-actions.d.ts +1 -1
- package/dist/agent/utils/forest-schema/generator-actions.js +4 -4
- package/dist/agent/utils/forest-schema/generator-collection.d.ts +1 -1
- package/dist/agent/utils/forest-schema/generator-collection.js +9 -4
- package/dist/agent/utils/forest-schema/generator-fields.d.ts +1 -0
- package/dist/agent/utils/forest-schema/generator-fields.js +56 -27
- package/dist/agent/utils/forest-schema/types.d.ts +9 -3
- package/dist/agent/utils/forest-schema/types.js +1 -1
- package/dist/agent/utils/query-string.d.ts +2 -2
- package/dist/agent/utils/query-string.js +8 -4
- package/dist/builder/agent.d.ts +63 -40
- package/dist/builder/agent.js +202 -53
- package/dist/builder/collection.d.ts +152 -53
- package/dist/builder/collection.js +219 -59
- package/dist/builder/decorators-stack.d.ts +24 -0
- package/dist/builder/decorators-stack.js +39 -0
- package/dist/builder/types.d.ts +15 -2
- package/dist/{agent/utils/http-driver-options.d.ts → builder/utils/options-validator.d.ts} +4 -4
- package/dist/builder/utils/options-validator.js +107 -0
- package/dist/builder/utils/typing-generator.d.ts +10 -0
- package/dist/builder/utils/typing-generator.js +98 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +13 -5
- package/dist/types.d.ts +6 -9
- package/dist/types.js +1 -9
- package/package.json +15 -5
- package/dist/agent/utils/http-driver-options.js +0 -86
|
@@ -6,9 +6,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
7
|
const filterable_1 = __importDefault(require("../agent/utils/forest-schema/filterable"));
|
|
8
8
|
class CollectionBuilder {
|
|
9
|
-
constructor(
|
|
10
|
-
this.agentBuilder = agentBuilder;
|
|
9
|
+
constructor(stack, name) {
|
|
11
10
|
this.name = name;
|
|
11
|
+
this.stack = stack;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Disable count in list view pagination for improved performance.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* .disableCount()
|
|
18
|
+
*/
|
|
19
|
+
disableCount() {
|
|
20
|
+
this.stack.schema.getCollection(this.name).overrideSchema({ countable: false });
|
|
21
|
+
return this;
|
|
12
22
|
}
|
|
13
23
|
/**
|
|
14
24
|
* Import a field from a many to one or one to one relation.
|
|
@@ -19,7 +29,7 @@ class CollectionBuilder {
|
|
|
19
29
|
* .importField('authorName', { path: 'author:fullName' })
|
|
20
30
|
*/
|
|
21
31
|
importField(name, options) {
|
|
22
|
-
const collection = this.
|
|
32
|
+
const collection = this.stack.lateComputed.getCollection(this.name);
|
|
23
33
|
const schema = datasource_toolkit_1.CollectionUtils.getFieldSchema(collection, options.path);
|
|
24
34
|
this.addField(name, {
|
|
25
35
|
beforeRelations: options.beforeRelations,
|
|
@@ -29,58 +39,77 @@ class CollectionBuilder {
|
|
|
29
39
|
getValues: records => records.map(r => datasource_toolkit_1.RecordUtils.getFieldValue(r, options.path)),
|
|
30
40
|
enumValues: schema.enumValues,
|
|
31
41
|
});
|
|
42
|
+
if (!schema.isReadOnly && !options.readonly) {
|
|
43
|
+
this.stack.write.getCollection(this.name).replaceFieldWriting(name, value => {
|
|
44
|
+
const path = options.path.split(':');
|
|
45
|
+
const writingPath = {};
|
|
46
|
+
path.reduce((nestedPath, currentPath, index) => {
|
|
47
|
+
nestedPath[currentPath] = index === path.length - 1 ? value : {};
|
|
48
|
+
return nestedPath[currentPath];
|
|
49
|
+
}, writingPath);
|
|
50
|
+
return writingPath;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (schema.isReadOnly && options.readonly === false) {
|
|
54
|
+
throw new Error(`Readonly option should not be false because the field "${options.path}" is not writable`);
|
|
55
|
+
}
|
|
32
56
|
for (const operator of schema.filterOperators) {
|
|
33
|
-
const handler =
|
|
57
|
+
const handler = value => ({ field: options.path, operator, value });
|
|
34
58
|
this.replaceFieldOperator(name, operator, handler);
|
|
35
59
|
}
|
|
36
60
|
if (schema.isSortable) {
|
|
37
|
-
this.replaceFieldSorting(name, [
|
|
61
|
+
this.replaceFieldSorting(name, [
|
|
62
|
+
{ field: options.path, ascending: true },
|
|
63
|
+
]);
|
|
38
64
|
}
|
|
39
65
|
return this;
|
|
40
66
|
}
|
|
41
67
|
/**
|
|
42
68
|
* Allow to rename a field of a given collection.
|
|
43
|
-
* @param
|
|
44
|
-
* @param
|
|
69
|
+
* @param oldName the current name of the field in a given collection
|
|
70
|
+
* @param newName the new name of the field
|
|
45
71
|
* @example
|
|
46
72
|
* .renameField('theCurrentNameOfTheField', 'theNewNameOfTheField');
|
|
47
73
|
*/
|
|
48
74
|
renameField(oldName, newName) {
|
|
49
|
-
this.
|
|
75
|
+
this.stack.renameField.getCollection(this.name).renameField(oldName, newName);
|
|
50
76
|
return this;
|
|
51
77
|
}
|
|
52
78
|
/**
|
|
53
79
|
* Remove field by setting its visibility to false.
|
|
54
|
-
* @param
|
|
80
|
+
* @param names the fields to remove
|
|
55
81
|
* @example
|
|
56
|
-
* .removeField('aFieldToRemove', '
|
|
82
|
+
* .removeField('aFieldToRemove', 'anotherFieldToRemove');
|
|
57
83
|
*/
|
|
58
84
|
removeField(...names) {
|
|
59
|
-
const collection = this.
|
|
85
|
+
const collection = this.stack.publication.getCollection(this.name);
|
|
60
86
|
for (const name of names)
|
|
61
87
|
collection.changeFieldVisibility(name, false);
|
|
62
88
|
return this;
|
|
63
89
|
}
|
|
64
90
|
/**
|
|
65
91
|
* Add a new action on the collection.
|
|
66
|
-
* @param
|
|
67
|
-
* @param
|
|
92
|
+
* @param name the name of the action
|
|
93
|
+
* @param definition the definition of the action
|
|
68
94
|
* @example
|
|
69
95
|
* .addAction('is live', {
|
|
70
96
|
* scope: 'Single',
|
|
71
|
-
* execute: async (context,
|
|
72
|
-
* return
|
|
97
|
+
* execute: async (context, resultBuilder) => {
|
|
98
|
+
* return resultBuilder.success(`Is live!`);
|
|
73
99
|
* },
|
|
74
100
|
* })
|
|
75
101
|
*/
|
|
76
102
|
addAction(name, definition) {
|
|
77
|
-
this.
|
|
103
|
+
this.stack.action
|
|
104
|
+
.getCollection(this.name)
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
+
.addAction(name, definition);
|
|
78
107
|
return this;
|
|
79
108
|
}
|
|
80
109
|
/**
|
|
81
110
|
* Add a new field on the collection.
|
|
82
|
-
* @param
|
|
83
|
-
* @param
|
|
111
|
+
* @param name the name of the field
|
|
112
|
+
* @param definition The definition of the field
|
|
84
113
|
* @example
|
|
85
114
|
* .addField('fullName', {
|
|
86
115
|
* columnType: 'String',
|
|
@@ -91,57 +120,141 @@ class CollectionBuilder {
|
|
|
91
120
|
addField(name, definition) {
|
|
92
121
|
const { beforeRelations, ...computedDefinition } = definition;
|
|
93
122
|
const collection = definition.beforeRelations
|
|
94
|
-
? this.
|
|
95
|
-
: this.
|
|
123
|
+
? this.stack.earlyComputed.getCollection(this.name)
|
|
124
|
+
: this.stack.lateComputed.getCollection(this.name);
|
|
96
125
|
collection.registerComputed(name, computedDefinition);
|
|
97
126
|
return this;
|
|
98
127
|
}
|
|
99
128
|
/**
|
|
100
|
-
* Add a relation
|
|
129
|
+
* Add a many to one relation to the collection
|
|
101
130
|
* @param name name of the new relation
|
|
102
|
-
* @param
|
|
131
|
+
* @param foreignCollection name of the targeted collection
|
|
132
|
+
* @param options extra information about the relation
|
|
103
133
|
* @example
|
|
104
|
-
* .
|
|
105
|
-
* type: 'ManyToOne',
|
|
106
|
-
* foreignCollection: 'persons',
|
|
107
|
-
* foreignKey: 'authorId'
|
|
108
|
-
* });
|
|
134
|
+
* books.addManyToOneRelation('myAuthor', 'persons', { foreignKey: 'authorId' })
|
|
109
135
|
*/
|
|
110
|
-
|
|
111
|
-
this.
|
|
136
|
+
addManyToOneRelation(name, foreignCollection, options) {
|
|
137
|
+
this.addRelation(name, {
|
|
138
|
+
type: 'ManyToOne',
|
|
139
|
+
foreignCollection,
|
|
140
|
+
foreignKey: options.foreignKey,
|
|
141
|
+
foreignKeyTarget: options.foreignKeyTarget,
|
|
142
|
+
});
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Add a one to many relation to the collection
|
|
147
|
+
* @param name name of the new relation
|
|
148
|
+
* @param foreignCollection name of the targeted collection
|
|
149
|
+
* @param options extra information about the relation
|
|
150
|
+
* @example
|
|
151
|
+
* persons.addOneToManyRelation('writtenBooks', 'books', { originKey: 'authorId' })
|
|
152
|
+
*/
|
|
153
|
+
addOneToManyRelation(name, foreignCollection, options) {
|
|
154
|
+
this.addRelation(name, {
|
|
155
|
+
type: 'OneToMany',
|
|
156
|
+
foreignCollection,
|
|
157
|
+
originKey: options.originKey,
|
|
158
|
+
originKeyTarget: options.originKeyTarget,
|
|
159
|
+
});
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Add a one to one relation to the collection
|
|
164
|
+
* @param name name of the new relation
|
|
165
|
+
* @param foreignCollection name of the targeted collection
|
|
166
|
+
* @param options extra information about the relation
|
|
167
|
+
* @example
|
|
168
|
+
* persons.addOneToOneRelation('bestFriend', 'persons', { originKey: 'bestFriendId' })
|
|
169
|
+
*/
|
|
170
|
+
addOneToOneRelation(name, foreignCollection, options) {
|
|
171
|
+
this.addRelation(name, {
|
|
172
|
+
type: 'OneToOne',
|
|
173
|
+
foreignCollection,
|
|
174
|
+
originKey: options.originKey,
|
|
175
|
+
originKeyTarget: options.originKeyTarget,
|
|
176
|
+
});
|
|
177
|
+
return this;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Add a many to many relation to the collection
|
|
181
|
+
* @param name name of the new relation
|
|
182
|
+
* @param foreignCollection name of the targeted collection
|
|
183
|
+
* @param throughCollection name of the intermediary collection
|
|
184
|
+
* @param options extra information about the relation
|
|
185
|
+
* @example
|
|
186
|
+
* dvds.addManyToManyRelation('rentalsOfThisDvd', 'rentals', 'dvdRentals', {
|
|
187
|
+
* originKey: 'dvdId',
|
|
188
|
+
* foreignKey: 'rentalId'
|
|
189
|
+
* })
|
|
190
|
+
*/
|
|
191
|
+
addManyToManyRelation(name, foreignCollection, throughCollection, options) {
|
|
192
|
+
this.addRelation(name, {
|
|
193
|
+
type: 'ManyToMany',
|
|
194
|
+
foreignCollection,
|
|
195
|
+
throughCollection,
|
|
196
|
+
originKey: options.originKey,
|
|
197
|
+
originKeyTarget: options.originKeyTarget,
|
|
198
|
+
foreignKey: options.foreignKey,
|
|
199
|
+
foreignKeyTarget: options.foreignKeyTarget,
|
|
200
|
+
});
|
|
112
201
|
return this;
|
|
113
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Add a virtual collection into the related data of a record.
|
|
205
|
+
*
|
|
206
|
+
* @param name name of the relation
|
|
207
|
+
* @param definition the definition of the new relation
|
|
208
|
+
* @example
|
|
209
|
+
* .addExternalRelation('states', {
|
|
210
|
+
* schema: { code: 'Number', name: 'String' },
|
|
211
|
+
* listRecords: ({ id }) => {
|
|
212
|
+
* return record.id == 34 ?
|
|
213
|
+
* [{ code: 'AL', name: 'Alabama' }, { code: 'AK', name: 'Alaska' }] :
|
|
214
|
+
* [{ code: 'AZ', name: 'Arizona' }, { code: 'TX', name: 'Texas' }];
|
|
215
|
+
* }
|
|
216
|
+
* })
|
|
217
|
+
*/
|
|
218
|
+
addExternalRelation(name, definition) {
|
|
219
|
+
const { schema } = this.stack.action.getCollection(this.name);
|
|
220
|
+
const primaryKeys = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(schema);
|
|
221
|
+
return this.addField(name, {
|
|
222
|
+
dependencies: definition.dependencies ?? primaryKeys,
|
|
223
|
+
columnType: [definition.schema],
|
|
224
|
+
getValues: async (records, context) => Promise.all(records.map(async (record) => definition.listRecords(record, context))),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
114
227
|
/**
|
|
115
228
|
* Add a new segment on the collection.
|
|
116
|
-
* @param
|
|
117
|
-
* @param
|
|
229
|
+
* @param name the name of the segment
|
|
230
|
+
* @param definition a function used to generate a condition tree
|
|
118
231
|
* or a condition tree
|
|
119
232
|
* @example
|
|
120
233
|
* .addSegment(
|
|
121
234
|
* 'Wrote more than 2 books',
|
|
122
|
-
*
|
|
235
|
+
* { field: 'booksCount', operator: 'GreaterThan', value: 2 }
|
|
123
236
|
* );
|
|
124
237
|
*/
|
|
125
238
|
addSegment(name, definition) {
|
|
126
|
-
this.
|
|
239
|
+
this.stack.segment.getCollection(this.name).addSegment(name, definition);
|
|
127
240
|
return this;
|
|
128
241
|
}
|
|
129
242
|
/**
|
|
130
243
|
* Enable sorting on a specific field using emulation.
|
|
131
244
|
* As for all the emulation method, the field sorting will be done in-memory.
|
|
132
|
-
* @param
|
|
245
|
+
* @param name the name of the field to enable emulation on
|
|
133
246
|
* @example
|
|
134
247
|
* .emulateFieldSorting('fullName');
|
|
135
248
|
*/
|
|
136
249
|
emulateFieldSorting(name) {
|
|
137
|
-
this.
|
|
250
|
+
this.stack.sortEmulate.getCollection(this.name).emulateFieldSorting(name);
|
|
138
251
|
return this;
|
|
139
252
|
}
|
|
140
253
|
/**
|
|
141
254
|
* Replace an implementation for the sorting.
|
|
142
255
|
* The field sorting will be done by the datasource.
|
|
143
|
-
* @param
|
|
144
|
-
* @param
|
|
256
|
+
* @param name the name of the field to enable sort
|
|
257
|
+
* @param equivalentSort the sort equivalent
|
|
145
258
|
* @example
|
|
146
259
|
* .replaceFieldSorting(
|
|
147
260
|
* 'fullName',
|
|
@@ -152,7 +265,7 @@ class CollectionBuilder {
|
|
|
152
265
|
* )
|
|
153
266
|
*/
|
|
154
267
|
replaceFieldSorting(name, equivalentSort) {
|
|
155
|
-
this.
|
|
268
|
+
this.stack.sortEmulate
|
|
156
269
|
.getCollection(this.name)
|
|
157
270
|
.replaceFieldSorting(name, equivalentSort);
|
|
158
271
|
return this;
|
|
@@ -165,10 +278,10 @@ class CollectionBuilder {
|
|
|
165
278
|
* .emulateFieldFiltering('aField');
|
|
166
279
|
*/
|
|
167
280
|
emulateFieldFiltering(name) {
|
|
168
|
-
const collection = this.
|
|
281
|
+
const collection = this.stack.lateOpEmulate.getCollection(this.name);
|
|
169
282
|
const field = collection.schema.fields[name];
|
|
170
283
|
for (const operator of filterable_1.default.getRequiredOperators(field.columnType)) {
|
|
171
|
-
if (!field.filterOperators
|
|
284
|
+
if (!field.filterOperators?.has(operator)) {
|
|
172
285
|
this.emulateFieldOperator(name, operator);
|
|
173
286
|
}
|
|
174
287
|
}
|
|
@@ -177,50 +290,97 @@ class CollectionBuilder {
|
|
|
177
290
|
/**
|
|
178
291
|
* Enable filtering on a specific field with a specific operator using emulation.
|
|
179
292
|
* As for all the emulation method, the field filtering will be done in-memory.
|
|
180
|
-
* @param
|
|
181
|
-
* @param
|
|
293
|
+
* @param name the name of the field to enable emulation on
|
|
294
|
+
* @param operator the operator to emulate
|
|
182
295
|
* @example
|
|
183
296
|
* .emulateFieldOperator('aField', 'In');
|
|
184
297
|
*/
|
|
185
298
|
emulateFieldOperator(name, operator) {
|
|
186
|
-
const collection = this.
|
|
187
|
-
? this.
|
|
188
|
-
: this.
|
|
299
|
+
const collection = this.stack.earlyOpEmulate.getCollection(this.name).schema.fields[name]
|
|
300
|
+
? this.stack.earlyOpEmulate.getCollection(this.name)
|
|
301
|
+
: this.stack.lateOpEmulate.getCollection(this.name);
|
|
189
302
|
collection.emulateFieldOperator(name, operator);
|
|
190
303
|
return this;
|
|
191
304
|
}
|
|
192
305
|
/**
|
|
193
306
|
* Replace an implementation for a specific operator on a specific field.
|
|
194
307
|
* The operator replacement will be done by the datasource.
|
|
195
|
-
* @param
|
|
196
|
-
* @param
|
|
197
|
-
* @param
|
|
308
|
+
* @param name the name of the field to filter on
|
|
309
|
+
* @param operator the operator to replace
|
|
310
|
+
* @param replacer the proposed implementation
|
|
198
311
|
* @example
|
|
199
|
-
* .replaceFieldOperator('
|
|
200
|
-
*
|
|
201
|
-
*
|
|
312
|
+
* .replaceFieldOperator('fullName', 'Contains', (value) => {
|
|
313
|
+
* return {
|
|
314
|
+
* aggregator: 'Or',
|
|
315
|
+
* conditions: [{
|
|
316
|
+
* field: 'firstName',
|
|
317
|
+
* operator: 'Contains',
|
|
318
|
+
* value
|
|
319
|
+
* }, {
|
|
320
|
+
* field: 'lastName',
|
|
321
|
+
* operator: 'Contains',
|
|
322
|
+
* value
|
|
323
|
+
* }]
|
|
324
|
+
* }
|
|
325
|
+
* });
|
|
202
326
|
*/
|
|
203
327
|
replaceFieldOperator(name, operator, replacer) {
|
|
204
|
-
const collection = this.
|
|
205
|
-
? this.
|
|
206
|
-
: this.
|
|
328
|
+
const collection = this.stack.earlyOpEmulate.getCollection(this.name).schema.fields[name]
|
|
329
|
+
? this.stack.earlyOpEmulate.getCollection(this.name)
|
|
330
|
+
: this.stack.lateOpEmulate.getCollection(this.name);
|
|
207
331
|
collection.replaceFieldOperator(name, operator, replacer);
|
|
208
332
|
return this;
|
|
209
333
|
}
|
|
210
334
|
/**
|
|
211
335
|
* Replace the write behavior of a field.
|
|
212
|
-
* @param
|
|
213
|
-
* @param
|
|
336
|
+
* @param name the name of the field
|
|
337
|
+
* @param definition the function or a value to represent the write behavior
|
|
214
338
|
* @example
|
|
215
|
-
* .replaceFieldWriting('fullName',
|
|
339
|
+
* .replaceFieldWriting('fullName', fullName => {
|
|
216
340
|
* const [firstName, lastName] = fullName.split(' ');
|
|
217
341
|
* return { firstName, lastName };
|
|
218
342
|
* });
|
|
219
343
|
*/
|
|
220
344
|
replaceFieldWriting(name, definition) {
|
|
221
|
-
this.
|
|
345
|
+
this.stack.write.getCollection(this.name).replaceFieldWriting(name, definition);
|
|
346
|
+
return this;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Replace the behavior of the search bar
|
|
350
|
+
* @param definition handler to describe the new behavior
|
|
351
|
+
* @example
|
|
352
|
+
* .replaceSearch(async (searchString) => {
|
|
353
|
+
* return { field: 'name', operator: 'Contains', value: searchString };
|
|
354
|
+
* });
|
|
355
|
+
*/
|
|
356
|
+
replaceSearch(definition) {
|
|
357
|
+
this.stack.search
|
|
358
|
+
.getCollection(this.name)
|
|
359
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
360
|
+
.replaceSearch(definition);
|
|
361
|
+
return this;
|
|
362
|
+
}
|
|
363
|
+
addHook(position, type, handler) {
|
|
364
|
+
this.stack.hook
|
|
365
|
+
.getCollection(this.name)
|
|
366
|
+
.addHook(position, type, handler);
|
|
367
|
+
return this;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Add a relation between two collections.
|
|
371
|
+
* @param name name of the new relation
|
|
372
|
+
* @param definition definition of the new relation
|
|
373
|
+
* @example
|
|
374
|
+
* .addRelation('author', {
|
|
375
|
+
* type: 'ManyToOne',
|
|
376
|
+
* foreignCollection: 'persons',
|
|
377
|
+
* foreignKey: 'authorId'
|
|
378
|
+
* });
|
|
379
|
+
*/
|
|
380
|
+
addRelation(name, definition) {
|
|
381
|
+
this.stack.relation.getCollection(this.name).addRelation(name, definition);
|
|
222
382
|
return this;
|
|
223
383
|
}
|
|
224
384
|
}
|
|
225
385
|
exports.default = CollectionBuilder;
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
386
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVyL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFxQnlDO0FBSXpDLHlGQUE4RTtBQUU5RSxNQUFxQixpQkFBaUI7SUFPcEMsWUFBWSxLQUFzQixFQUFFLElBQVk7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWTtRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFaEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FDVCxJQUFZLEVBQ1osT0FBa0Y7UUFFbEYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxvQ0FBZSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBaUIsQ0FBQztRQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNsQixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVB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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ActionCollectionDecorator, ChartDataSourceDecorator, ComputedCollectionDecorator, DataSource, DataSourceDecorator, EmptyCollectionDecorator, HookCollectionDecorator, OperatorsEmulateCollectionDecorator, OperatorsReplaceCollectionDecorator, PublicationCollectionDecorator, RelationCollectionDecorator, RenameFieldCollectionDecorator, SchemaCollectionDecorator, SearchCollectionDecorator, SegmentCollectionDecorator, SortEmulateCollectionDecorator, WriteCollectionDecorator } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export default class DecoratorsStack {
|
|
3
|
+
action: DataSourceDecorator<ActionCollectionDecorator>;
|
|
4
|
+
chart: ChartDataSourceDecorator;
|
|
5
|
+
earlyComputed: DataSourceDecorator<ComputedCollectionDecorator>;
|
|
6
|
+
earlyOpEmulate: DataSourceDecorator<OperatorsEmulateCollectionDecorator>;
|
|
7
|
+
earlyOpReplace: DataSourceDecorator<OperatorsReplaceCollectionDecorator>;
|
|
8
|
+
empty: DataSourceDecorator<EmptyCollectionDecorator>;
|
|
9
|
+
relation: DataSourceDecorator<RelationCollectionDecorator>;
|
|
10
|
+
lateComputed: DataSourceDecorator<ComputedCollectionDecorator>;
|
|
11
|
+
lateOpEmulate: DataSourceDecorator<OperatorsEmulateCollectionDecorator>;
|
|
12
|
+
lateOpReplace: DataSourceDecorator<OperatorsReplaceCollectionDecorator>;
|
|
13
|
+
publication: DataSourceDecorator<PublicationCollectionDecorator>;
|
|
14
|
+
renameField: DataSourceDecorator<RenameFieldCollectionDecorator>;
|
|
15
|
+
schema: DataSourceDecorator<SchemaCollectionDecorator>;
|
|
16
|
+
search: DataSourceDecorator<SearchCollectionDecorator>;
|
|
17
|
+
segment: DataSourceDecorator<SegmentCollectionDecorator>;
|
|
18
|
+
sortEmulate: DataSourceDecorator<SortEmulateCollectionDecorator>;
|
|
19
|
+
write: DataSourceDecorator<WriteCollectionDecorator>;
|
|
20
|
+
hook: DataSourceDecorator<HookCollectionDecorator>;
|
|
21
|
+
dataSource: DataSource;
|
|
22
|
+
constructor(dataSource: DataSource);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=decorators-stack.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
4
|
+
class DecoratorsStack {
|
|
5
|
+
constructor(dataSource) {
|
|
6
|
+
let last = dataSource;
|
|
7
|
+
/* eslint-disable no-multi-assign */
|
|
8
|
+
// Step 0: Do not query datasource when we know the result with yield an empty set.
|
|
9
|
+
last = this.empty = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.EmptyCollectionDecorator);
|
|
10
|
+
// Step 1: Computed-Relation-Computed sandwich (needed because some emulated relations depend
|
|
11
|
+
// on computed fields, and some computed fields depend on relation...)
|
|
12
|
+
// Note that replacement goes before emulation, as replacements may use emulated operators.
|
|
13
|
+
last = this.earlyComputed = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.ComputedCollectionDecorator);
|
|
14
|
+
last = this.earlyOpEmulate = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.OperatorsEmulateCollectionDecorator);
|
|
15
|
+
last = this.earlyOpReplace = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.OperatorsReplaceCollectionDecorator);
|
|
16
|
+
last = this.relation = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.RelationCollectionDecorator);
|
|
17
|
+
last = this.lateComputed = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.ComputedCollectionDecorator);
|
|
18
|
+
last = this.lateOpEmulate = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.OperatorsEmulateCollectionDecorator);
|
|
19
|
+
last = this.lateOpReplace = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.OperatorsReplaceCollectionDecorator);
|
|
20
|
+
// Step 2: Those need access to all fields. They can be loaded in any order.
|
|
21
|
+
last = this.search = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.SearchCollectionDecorator);
|
|
22
|
+
last = this.segment = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.SegmentCollectionDecorator);
|
|
23
|
+
last = this.sortEmulate = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.SortEmulateCollectionDecorator);
|
|
24
|
+
last = this.write = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.WriteCollectionDecorator);
|
|
25
|
+
// Step 3: Access to all fields AND emulated capabilities
|
|
26
|
+
last = this.chart = new datasource_toolkit_1.ChartDataSourceDecorator(last);
|
|
27
|
+
last = this.action = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.ActionCollectionDecorator);
|
|
28
|
+
last = this.schema = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.SchemaCollectionDecorator);
|
|
29
|
+
last = this.hook = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.HookCollectionDecorator);
|
|
30
|
+
// Step 4: Renaming must be either the very first or very last so that naming in customer code
|
|
31
|
+
// is consistent.
|
|
32
|
+
last = this.publication = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.PublicationCollectionDecorator);
|
|
33
|
+
last = this.renameField = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.RenameFieldCollectionDecorator);
|
|
34
|
+
/* eslint-enable no-multi-assign */
|
|
35
|
+
this.dataSource = last;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.default = DecoratorsStack;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVyL2RlY29yYXRvcnMtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3RUFrQnlDO0FBRXpDLE1BQXFCLGVBQWU7SUFxQmxDLFlBQVksVUFBc0I7UUFDaEMsSUFBSSxJQUFJLEdBQWUsVUFBVSxDQUFDO1FBRWxDLG9DQUFvQztRQUNwQyxtRkFBbUY7UUFDbkYsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsNkNBQXdCLENBQUMsQ0FBQztRQUU1RSw2RkFBNkY7UUFDN0Ysc0VBQXNFO1FBQ3RFLDJGQUEyRjtRQUMzRixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSxnREFBMkIsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLHdEQUFtQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsd0RBQW1DLENBQUMsQ0FBQztRQUNoRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSxnREFBMkIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLGdEQUEyQixDQUFDLENBQUM7UUFDdEYsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsd0RBQW1DLENBQUMsQ0FBQztRQUMvRixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSx3REFBbUMsQ0FBQyxDQUFDO1FBRS9GLDRFQUE0RTtRQUM1RSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSw4Q0FBeUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLCtDQUEwQixDQUFDLENBQUM7UUFDaEYsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsbURBQThCLENBQUMsQ0FBQztRQUN4RixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSw2Q0FBd0IsQ0FBQyxDQUFDO1FBRTVFLHlEQUF5RDtRQUN6RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLDZDQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLDhDQUF5QixDQUFDLENBQUM7UUFDOUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsOENBQXlCLENBQUMsQ0FBQztRQUM5RSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSw0Q0FBdUIsQ0FBQyxDQUFDO1FBRTFFLDhGQUE4RjtRQUM5RixpQkFBaUI7UUFDakIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsbURBQThCLENBQUMsQ0FBQztRQUN4RixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSxtREFBOEIsQ0FBQyxDQUFDO1FBQ3hGLG1DQUFtQztRQUVuQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUEzREQsa0NBMkRDIn0=
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { CollectionCustomizationContext, ComputedDefinition, PrimitiveTypes, TCollectionName, TFieldName, TRow, TSchema } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
4
|
+
export declare type FieldDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = ComputedDefinition<S, N> & {
|
|
3
5
|
beforeRelations?: boolean;
|
|
4
6
|
};
|
|
7
|
+
export declare type OneToManyEmbeddedDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
|
|
8
|
+
schema: Record<string, PrimitiveTypes>;
|
|
9
|
+
dependencies?: TFieldName<S, N>[];
|
|
10
|
+
listRecords(records: TRow<S, N>, context: CollectionCustomizationContext<S, N>): Promise<unknown[]> | unknown[];
|
|
11
|
+
};
|
|
12
|
+
export declare type HttpCallback = (req: IncomingMessage, res: ServerResponse) => void;
|
|
13
|
+
export declare type DataSourceOptions = {
|
|
14
|
+
rename?: {
|
|
15
|
+
[oldName: string]: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
5
18
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { AgentOptions } from '../../types';
|
|
2
|
-
import { AgentOptionsWithDefaults } from '
|
|
3
|
-
export default class
|
|
2
|
+
import { AgentOptionsWithDefaults } from '../../agent/types';
|
|
3
|
+
export default class OptionsValidator {
|
|
4
4
|
private static loggerPrefix;
|
|
5
5
|
static withDefaults(options: AgentOptions): AgentOptionsWithDefaults;
|
|
6
|
-
static validate(options:
|
|
6
|
+
static validate(options: AgentOptions): AgentOptionsWithDefaults;
|
|
7
7
|
private static checkForestServerOptions;
|
|
8
8
|
private static checkAuthOptions;
|
|
9
9
|
private static checkOtherOptions;
|
|
10
10
|
private static isExistingPath;
|
|
11
11
|
private static isUrl;
|
|
12
12
|
}
|
|
13
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=options-validator.d.ts.map
|