@forestadmin/agent 1.0.0-beta.24 → 1.0.0-beta.25
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 +7 -0
- package/dist/builder/collection.d.ts +63 -9
- package/dist/builder/collection.js +85 -10
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# @forestadmin/agent [1.0.0-beta.25](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/agent@1.0.0-beta.24...@forestadmin/agent@1.0.0-beta.25) (2022-05-16)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **builder:** create one method per relation type in the collection customizer ([#302](https://github.com/ForestAdmin/agent-nodejs/issues/302)) ([df5438d](https://github.com/ForestAdmin/agent-nodejs/commit/df5438d641bd8c4f8ad7c114120189d9dda26c44))
|
|
7
|
+
|
|
1
8
|
# @forestadmin/agent [1.0.0-beta.24](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/agent@1.0.0-beta.23...@forestadmin/agent@1.0.0-beta.24) (2022-05-16)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ActionDefinition, Operator, OperatorDefinition, PlainSortClause,
|
|
1
|
+
import { ActionDefinition, Operator, OperatorDefinition, PlainSortClause, SegmentDefinition, WriteDefinition } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { FieldDefinition } from './types';
|
|
3
3
|
import DecoratorsStack from './decorators-stack';
|
|
4
4
|
export default class CollectionBuilder {
|
|
@@ -58,17 +58,59 @@ export default class CollectionBuilder {
|
|
|
58
58
|
*/
|
|
59
59
|
addField(name: string, definition: FieldDefinition): this;
|
|
60
60
|
/**
|
|
61
|
-
* Add a relation
|
|
61
|
+
* Add a many to one relation to the collection
|
|
62
62
|
* @param name name of the new relation
|
|
63
|
-
* @param
|
|
63
|
+
* @param foreignCollection name of the targeted collection
|
|
64
|
+
* @param options extra information about the relation
|
|
64
65
|
* @example
|
|
65
|
-
* .
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
* books.addManyToOne('myAuthor', 'persons', { foreignKey: 'author_id' })
|
|
67
|
+
*/
|
|
68
|
+
addManyToOne(name: string, foreignCollection: string, options: {
|
|
69
|
+
foreignKey: string;
|
|
70
|
+
foreignKeyTarget?: string;
|
|
71
|
+
}): this;
|
|
72
|
+
/**
|
|
73
|
+
* Add a one to many relation to the collection
|
|
74
|
+
* @param name name of the new relation
|
|
75
|
+
* @param foreignCollection name of the targeted collection
|
|
76
|
+
* @param options extra information about the relation
|
|
77
|
+
* @example
|
|
78
|
+
* persons.addOneToMany('writtenBooks', 'books', { originKey: 'author_id' })
|
|
79
|
+
*/
|
|
80
|
+
addOneToMany(name: string, foreignCollection: string, options: {
|
|
81
|
+
originKey: string;
|
|
82
|
+
originKeyTarget?: string;
|
|
83
|
+
}): this;
|
|
84
|
+
/**
|
|
85
|
+
* Add a one to one relation to the collection
|
|
86
|
+
* @param name name of the new relation
|
|
87
|
+
* @param foreignCollection name of the targeted collection
|
|
88
|
+
* @param options extra information about the relation
|
|
89
|
+
* @example
|
|
90
|
+
* persons.addOneToOne('bestFriend', 'persons', { originKey: 'best_friend_id' })
|
|
70
91
|
*/
|
|
71
|
-
|
|
92
|
+
addOneToOne(name: string, foreignCollection: string, options: {
|
|
93
|
+
originKey: string;
|
|
94
|
+
originKeyTarget?: string;
|
|
95
|
+
}): this;
|
|
96
|
+
/**
|
|
97
|
+
* Add a many to many relation to the collection
|
|
98
|
+
* @param name name of the new relation
|
|
99
|
+
* @param foreignCollection name of the targeted collection
|
|
100
|
+
* @param throughCollection name of the intermediary collection
|
|
101
|
+
* @param options extra information about the relation
|
|
102
|
+
* @example
|
|
103
|
+
* dvds.addManyToMany('rentalsOfThisDvd', 'rentals', 'dvd_rentals', {
|
|
104
|
+
* originKey: 'dvd_id',
|
|
105
|
+
* foreignKey: 'rental_id'
|
|
106
|
+
* })
|
|
107
|
+
*/
|
|
108
|
+
addManyToMany(name: string, foreignCollection: string, throughCollection: string, options: {
|
|
109
|
+
originKey: string;
|
|
110
|
+
foreignKey: string;
|
|
111
|
+
originKeyTarget?: string;
|
|
112
|
+
foreignKeyTarget?: string;
|
|
113
|
+
}): this;
|
|
72
114
|
/**
|
|
73
115
|
* Add a new segment on the collection.
|
|
74
116
|
* @param name the name of the segment
|
|
@@ -144,5 +186,17 @@ export default class CollectionBuilder {
|
|
|
144
186
|
* });
|
|
145
187
|
*/
|
|
146
188
|
replaceFieldWriting(name: string, definition: WriteDefinition): this;
|
|
189
|
+
/**
|
|
190
|
+
* Add a relation between two collections.
|
|
191
|
+
* @param name name of the new relation
|
|
192
|
+
* @param definition definition of the new relation
|
|
193
|
+
* @example
|
|
194
|
+
* .addRelation('author', {
|
|
195
|
+
* type: 'ManyToOne',
|
|
196
|
+
* foreignCollection: 'persons',
|
|
197
|
+
* foreignKey: 'authorId'
|
|
198
|
+
* });
|
|
199
|
+
*/
|
|
200
|
+
private addRelation;
|
|
147
201
|
}
|
|
148
202
|
//# sourceMappingURL=collection.d.ts.map
|
|
@@ -97,18 +97,78 @@ class CollectionBuilder {
|
|
|
97
97
|
return this;
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
|
-
* Add a relation
|
|
100
|
+
* Add a many to one relation to the collection
|
|
101
101
|
* @param name name of the new relation
|
|
102
|
-
* @param
|
|
102
|
+
* @param foreignCollection name of the targeted collection
|
|
103
|
+
* @param options extra information about the relation
|
|
103
104
|
* @example
|
|
104
|
-
* .
|
|
105
|
-
* type: 'ManyToOne',
|
|
106
|
-
* foreignCollection: 'persons',
|
|
107
|
-
* foreignKey: 'authorId'
|
|
108
|
-
* });
|
|
105
|
+
* books.addManyToOne('myAuthor', 'persons', { foreignKey: 'author_id' })
|
|
109
106
|
*/
|
|
110
|
-
|
|
111
|
-
this.
|
|
107
|
+
addManyToOne(name, foreignCollection, options) {
|
|
108
|
+
this.addRelation(name, {
|
|
109
|
+
type: 'ManyToOne',
|
|
110
|
+
foreignCollection,
|
|
111
|
+
foreignKey: options.foreignKey,
|
|
112
|
+
foreignKeyTarget: options.foreignKeyTarget,
|
|
113
|
+
});
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Add a one to many relation to the collection
|
|
118
|
+
* @param name name of the new relation
|
|
119
|
+
* @param foreignCollection name of the targeted collection
|
|
120
|
+
* @param options extra information about the relation
|
|
121
|
+
* @example
|
|
122
|
+
* persons.addOneToMany('writtenBooks', 'books', { originKey: 'author_id' })
|
|
123
|
+
*/
|
|
124
|
+
addOneToMany(name, foreignCollection, options) {
|
|
125
|
+
this.addRelation(name, {
|
|
126
|
+
type: 'OneToMany',
|
|
127
|
+
foreignCollection,
|
|
128
|
+
originKey: options.originKey,
|
|
129
|
+
originKeyTarget: options.originKeyTarget,
|
|
130
|
+
});
|
|
131
|
+
return this;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Add a one to one relation to the collection
|
|
135
|
+
* @param name name of the new relation
|
|
136
|
+
* @param foreignCollection name of the targeted collection
|
|
137
|
+
* @param options extra information about the relation
|
|
138
|
+
* @example
|
|
139
|
+
* persons.addOneToOne('bestFriend', 'persons', { originKey: 'best_friend_id' })
|
|
140
|
+
*/
|
|
141
|
+
addOneToOne(name, foreignCollection, options) {
|
|
142
|
+
this.addRelation(name, {
|
|
143
|
+
type: 'OneToOne',
|
|
144
|
+
foreignCollection,
|
|
145
|
+
originKey: options.originKey,
|
|
146
|
+
originKeyTarget: options.originKeyTarget,
|
|
147
|
+
});
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Add a many to many relation to the collection
|
|
152
|
+
* @param name name of the new relation
|
|
153
|
+
* @param foreignCollection name of the targeted collection
|
|
154
|
+
* @param throughCollection name of the intermediary collection
|
|
155
|
+
* @param options extra information about the relation
|
|
156
|
+
* @example
|
|
157
|
+
* dvds.addManyToMany('rentalsOfThisDvd', 'rentals', 'dvd_rentals', {
|
|
158
|
+
* originKey: 'dvd_id',
|
|
159
|
+
* foreignKey: 'rental_id'
|
|
160
|
+
* })
|
|
161
|
+
*/
|
|
162
|
+
addManyToMany(name, foreignCollection, throughCollection, options) {
|
|
163
|
+
this.addRelation(name, {
|
|
164
|
+
type: 'ManyToMany',
|
|
165
|
+
foreignCollection,
|
|
166
|
+
throughCollection,
|
|
167
|
+
originKey: options.originKey,
|
|
168
|
+
originKeyTarget: options.originKeyTarget,
|
|
169
|
+
foreignKey: options.foreignKey,
|
|
170
|
+
foreignKeyTarget: options.foreignKeyTarget,
|
|
171
|
+
});
|
|
112
172
|
return this;
|
|
113
173
|
}
|
|
114
174
|
/**
|
|
@@ -219,6 +279,21 @@ class CollectionBuilder {
|
|
|
219
279
|
this.stack.write.getCollection(this.name).replaceFieldWriting(name, definition);
|
|
220
280
|
return this;
|
|
221
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Add a relation between two collections.
|
|
284
|
+
* @param name name of the new relation
|
|
285
|
+
* @param definition definition of the new relation
|
|
286
|
+
* @example
|
|
287
|
+
* .addRelation('author', {
|
|
288
|
+
* type: 'ManyToOne',
|
|
289
|
+
* foreignCollection: 'persons',
|
|
290
|
+
* foreignKey: 'authorId'
|
|
291
|
+
* });
|
|
292
|
+
*/
|
|
293
|
+
addRelation(name, definition) {
|
|
294
|
+
this.stack.relation.getCollection(this.name).addRelation(name, definition);
|
|
295
|
+
return this;
|
|
296
|
+
}
|
|
222
297
|
}
|
|
223
298
|
exports.default = CollectionBuilder;
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVyL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFXeUM7QUFHekMseUZBQThFO0FBRTlFLE1BQXFCLGlCQUFpQjtJQUlwQyxZQUFZLEtBQXNCLEVBQUUsSUFBWTtRQUM5QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxJQUFZLEVBQUUsT0FBb0Q7UUFDNUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxvQ0FBZSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBaUIsQ0FBQztRQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNsQixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQ0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xGLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtTQUM5QixDQUFDLENBQUM7UUFFSCxLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7WUFDN0MsTUFBTSxPQUFP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
|