@@ -11,6 +11,7 @@ permissions and limitations under the License.
11
11
*/
12
12
13
13
import { schemaStringify } from './schemaParser.js' ;
14
+ import { print } from 'graphql' ;
14
15
import { gql } from 'graphql-tag'
15
16
import { loggerInfo , yellow } from "./logger.js" ;
16
17
@@ -135,31 +136,11 @@ function injectChanges(schemaModel) {
135
136
136
137
function addNode ( def ) {
137
138
let name = def . name . value ;
138
-
139
- // Input fields
140
- let inputFields = '' ;
141
- inputFields += `\n _id: ID @id`
142
- def . fields . forEach ( field => {
143
- try {
144
- if ( field . name . value === 'id' ) {
145
- inputFields += `\n id: ID` ;
146
- }
147
-
148
- } catch { }
149
-
150
- try {
151
- if ( field . type . name . value === 'String' ||
152
- field . type . name . value === 'Int' ||
153
- field . type . name . value === 'Float' ||
154
- field . type . name . value === 'Boolean' ) {
155
-
156
- inputFields += `\n ${ field . name . value } : ${ field . type . name . value } ` ;
157
- }
158
- } catch { }
159
- } ) ;
139
+ const idField = getIdField ( def ) ;
160
140
161
141
// Create Input type
162
- typesToAdd . push ( `input ${ name } Input {${ inputFields } \n}` ) ;
142
+ const inputFields = [ idField , ...getInputFields ( def ) ] ;
143
+ typesToAdd . push ( `input ${ name } Input {\n${ print ( inputFields ) } \n}` ) ;
163
144
164
145
// Create query
165
146
queriesToAdd . push ( `getNode${ name } (filter: ${ name } Input, options: Options): ${ name } \n` ) ;
@@ -168,7 +149,7 @@ function addNode(def) {
168
149
// Create mutation
169
150
mutationsToAdd . push ( `createNode${ name } (input: ${ name } Input!): ${ name } \n` ) ;
170
151
mutationsToAdd . push ( `updateNode${ name } (input: ${ name } Input!): ${ name } \n` ) ;
171
- mutationsToAdd . push ( `deleteNode${ name } (_id: ID! ): Boolean\n` ) ;
152
+ mutationsToAdd . push ( `deleteNode${ name } (${ print ( idFieldToInputValue ( idField ) ) } ): Boolean\n` ) ;
172
153
173
154
loggerInfo ( `Added input type: ${ yellow ( name + 'Input' ) } ` ) ;
174
155
loggerInfo ( `Added query: ${ yellow ( 'getNode' + name ) } ` ) ;
@@ -231,6 +212,40 @@ function addFilterOptionsArguments(field) {
231
212
}
232
213
233
214
215
+ function getIdField ( objTypeDef ) {
216
+ return objTypeDef . fields . find (
217
+ field =>
218
+ field . directives && field . directives . some ( directive => directive . name . value === 'id' )
219
+ ) ;
220
+ }
221
+
222
+
223
+ function createIdField ( ) {
224
+ return {
225
+ kind : 'FieldDefinition' ,
226
+ name : { kind : 'Name' , value : '_id' } ,
227
+ arguments : [ ] ,
228
+ type : { kind : 'NonNullType' , type : { kind : 'NamedType' , name : { kind : 'Name' , value : 'ID' } } } ,
229
+ directives : [
230
+ { kind : 'Directive' , name : { kind : 'Name' , value : 'id' } , arguments : [ ] }
231
+ ]
232
+ } ;
233
+ }
234
+
235
+
236
+ function idFieldToInputValue ( { name, type } ) {
237
+ return { kind : 'InputValueDefinition' , name, type } ;
238
+ }
239
+
240
+
241
+ function getInputFields ( objTypeDef ) {
242
+ const inputFieldTypes = [ 'String' , 'Int' , 'Float' , 'Boolean' ] ;
243
+ return objTypeDef . fields . filter (
244
+ field =>
245
+ field . type . kind === 'NamedType' && inputFieldTypes . includes ( field . type . name . value )
246
+ ) ;
247
+ }
248
+
234
249
235
250
function inferGraphDatabaseDirectives ( schemaModel ) {
236
251
@@ -242,21 +257,15 @@ function inferGraphDatabaseDirectives(schemaModel) {
242
257
if ( def . kind == 'ObjectTypeDefinition' ) {
243
258
if ( ! ( def . name . value == 'Query' || def . name . value == 'Mutation' ) ) {
244
259
currentType = def . name . value ;
260
+
261
+ // Only add _id field to the object type if it doesn't have an ID field already
262
+ if ( ! getIdField ( def ) ) {
263
+ def . fields . unshift ( createIdField ( ) ) ;
264
+ }
265
+
245
266
addNode ( def ) ;
246
267
const edgesTypeToAdd = [ ] ;
247
268
248
- // Add _id field to the object type
249
- def . fields . unshift ( {
250
- kind : "FieldDefinition" , name : { kind : "Name" , value : "_id" } ,
251
- arguments : [ ] ,
252
- type : { kind : "NonNullType" , type : { kind : "NamedType" , name : { kind : "Name" , value : "ID" } } } ,
253
- directives : [
254
- { kind : "Directive" , name : { kind : "Name" , value : "id" } ,
255
- arguments : [ ]
256
- }
257
- ]
258
- } ) ;
259
-
260
269
// add relationships
261
270
def . fields . forEach ( field => {
262
271
if ( field . type . type !== undefined ) {
0 commit comments