@@ -6,21 +6,14 @@ import {
6
6
isTypeExtensionNode
7
7
} from 'graphql' ;
8
8
import { makeExecutableSchema } from 'graphql-tools' ;
9
+ import { buildDocument } from './ast' ;
9
10
import {
10
- buildDocument ,
11
- buildOperationType ,
12
- buildSchemaDefinition ,
13
- buildName ,
14
- buildNamedType ,
15
- buildObjectType
16
- } from './ast' ;
17
- import {
18
- OperationType ,
19
- isNodeType ,
11
+ initializeOperationTypes ,
12
+ augmentSchemaType ,
20
13
augmentTypes ,
21
- transformNeo4jTypes
14
+ transformNeo4jTypes ,
15
+ regenerateSchemaType
22
16
} from './types/types' ;
23
- import { unwrapNamedType } from './fields' ;
24
17
import { augmentDirectiveDefinitions } from './directives' ;
25
18
import { extractResolversFromSchema , augmentResolvers } from './resolvers' ;
26
19
import { addAuthDirectiveImplementations } from '../auth' ;
@@ -40,13 +33,15 @@ export const makeAugmentedExecutableSchema = ({
40
33
inheritResolversFromInterfaces,
41
34
config
42
35
} ) => {
36
+ config = setDefaultConfig ( { config } ) ;
43
37
const definitions = parse ( typeDefs ) . definitions ;
44
38
let generatedTypeMap = { } ;
45
39
let [
46
40
typeDefinitionMap ,
47
41
typeExtensionDefinitionMap ,
48
42
directiveDefinitionMap ,
49
- operationTypeMap
43
+ operationTypeMap ,
44
+ schemaTypeDefinition
50
45
] = mapDefinitions ( {
51
46
definitions,
52
47
config
@@ -76,7 +71,8 @@ export const makeAugmentedExecutableSchema = ({
76
71
generatedTypeMap,
77
72
typeExtensionDefinitionMap,
78
73
operationTypeMap,
79
- directiveDefinitionMap
74
+ directiveDefinitionMap,
75
+ schemaTypeDefinition
80
76
} ) ;
81
77
const transformedDefinitions = transformNeo4jTypes ( {
82
78
definitions : mergedDefinitions ,
@@ -109,12 +105,14 @@ export const makeAugmentedExecutableSchema = ({
109
105
* The main export for augmnetation a schema
110
106
*/
111
107
export const augmentedSchema = ( schema , config ) => {
108
+ config = setDefaultConfig ( { config } ) ;
112
109
const definitions = extractSchemaDefinitions ( { schema } ) ;
113
110
let [
114
111
typeDefinitionMap ,
115
112
typeExtensionDefinitionMap ,
116
113
directiveDefinitionMap ,
117
- operationTypeMap
114
+ operationTypeMap ,
115
+ schemaTypeDefinition
118
116
] = mapDefinitions ( {
119
117
definitions,
120
118
config
@@ -146,7 +144,8 @@ export const augmentedSchema = (schema, config) => {
146
144
generatedTypeMap,
147
145
typeExtensionDefinitionMap,
148
146
operationTypeMap,
149
- directiveDefinitionMap
147
+ directiveDefinitionMap,
148
+ schemaTypeDefinition
150
149
} ) ;
151
150
const transformedDefinitions = transformNeo4jTypes ( {
152
151
definitions : mergedDefinitions ,
@@ -179,11 +178,10 @@ export const mapDefinitions = ({ definitions = [], config = {} }) => {
179
178
const typeExtensionDefinitionMap = { } ;
180
179
const directiveDefinitionMap = { } ;
181
180
let typeDefinitionMap = { } ;
182
- let schemaDefinitionNode = undefined ;
181
+ let schemaTypeDefinition = undefined ;
183
182
definitions . forEach ( def => {
184
183
if ( def . kind === Kind . SCHEMA_DEFINITION ) {
185
- schemaDefinitionNode = def ;
186
- typeDefinitionMap [ `schema` ] = def ;
184
+ schemaTypeDefinition = def ;
187
185
} else if ( isTypeDefinitionNode ( def ) ) {
188
186
const name = def . name . value ;
189
187
typeDefinitionMap [ name ] = def ;
@@ -200,14 +198,15 @@ export const mapDefinitions = ({ definitions = [], config = {} }) => {
200
198
} ) ;
201
199
const [ typeMap , operationTypeMap ] = initializeOperationTypes ( {
202
200
typeDefinitionMap,
203
- schemaDefinitionNode ,
201
+ schemaTypeDefinition ,
204
202
config
205
203
} ) ;
206
204
return [
207
205
typeMap ,
208
206
typeExtensionDefinitionMap ,
209
207
directiveDefinitionMap ,
210
- operationTypeMap
208
+ operationTypeMap ,
209
+ schemaTypeDefinition
211
210
] ;
212
211
} ;
213
212
@@ -218,7 +217,8 @@ export const mergeDefinitionMaps = ({
218
217
generatedTypeMap = { } ,
219
218
typeExtensionDefinitionMap = { } ,
220
219
operationTypeMap = { } ,
221
- directiveDefinitionMap = { }
220
+ directiveDefinitionMap = { } ,
221
+ schemaTypeDefinition
222
222
} ) => {
223
223
const typeExtensions = Object . values ( typeExtensionDefinitionMap ) ;
224
224
if ( typeExtensions ) {
@@ -230,12 +230,17 @@ export const mergeDefinitionMaps = ({
230
230
[ ]
231
231
) ;
232
232
}
233
- return Object . values ( {
233
+ let definitions = Object . values ( {
234
234
...generatedTypeMap ,
235
235
...typeExtensionDefinitionMap ,
236
- ...operationTypeMap ,
237
236
...directiveDefinitionMap
238
237
} ) ;
238
+ definitions = augmentSchemaType ( {
239
+ definitions,
240
+ schemaTypeDefinition,
241
+ operationTypeMap
242
+ } ) ;
243
+ return definitions ;
239
244
} ;
240
245
241
246
/**
@@ -271,132 +276,37 @@ export const shouldAugmentRelationshipField = (
271
276
) ;
272
277
} ;
273
278
274
- /**
275
- * Prints the AST of a GraphQL SDL Document containing definitions
276
- * extracted from a given schema, along with no loss of directives and a
277
- * regenerated schema type
278
- */
279
- export const printSchemaDocument = ( { schema } ) => {
280
- return print (
281
- buildDocument ( {
282
- definitions : extractSchemaDefinitions ( { schema } )
283
- } )
284
- ) ;
279
+ // An enum containing the names of the augmentation config keys
280
+ const APIConfiguration = {
281
+ QUERY : 'query' ,
282
+ MUTATION : 'mutation' ,
283
+ TEMPORAL : 'temporal' ,
284
+ SPATIAL : 'spatial'
285
285
} ;
286
286
287
287
/**
288
- * Builds any operation types that do not exist but should
288
+ * Builds the default values in a given configuration object
289
289
*/
290
- const initializeOperationTypes = ( {
291
- typeDefinitionMap,
292
- schemaDefinitionNode,
293
- config = { }
294
- } ) => {
295
- let queryTypeName = OperationType . QUERY ;
296
- let mutationTypeName = OperationType . MUTATION ;
297
- let subscriptionTypeName = OperationType . SUBSCRIPTION ;
298
- if ( schemaDefinitionNode ) {
299
- const operationTypes = schemaDefinitionNode . operationTypes ;
300
- operationTypes . forEach ( definition => {
301
- const operation = definition . operation ;
302
- const unwrappedType = unwrapNamedType ( { type : definition . type } ) ;
303
- if ( operation === queryTypeName . toLowerCase ( ) ) {
304
- queryTypeName = unwrappedType . name ;
305
- } else if ( operation === mutationTypeName . toLowerCase ( ) ) {
306
- mutationTypeName = unwrappedType . name ;
307
- } else if ( operation === subscriptionTypeName . toLowerCase ( ) ) {
308
- subscriptionTypeName = unwrappedType . name ;
309
- }
310
- } ) ;
311
- }
312
- typeDefinitionMap = initializeOperationType ( {
313
- typeName : queryTypeName ,
314
- typeDefinitionMap,
315
- config
316
- } ) ;
317
- typeDefinitionMap = initializeOperationType ( {
318
- typeName : mutationTypeName ,
319
- typeDefinitionMap,
320
- config
321
- } ) ;
322
- typeDefinitionMap = initializeOperationType ( {
323
- typeName : subscriptionTypeName ,
324
- typeDefinitionMap,
325
- config
326
- } ) ;
327
- return buildAugmentationTypeMaps ( {
328
- typeDefinitionMap,
329
- queryTypeName,
330
- mutationTypeName,
331
- subscriptionTypeName
332
- } ) ;
333
- } ;
334
-
335
- /**
336
- * Builds an operation type if it does not exist but should
337
- */
338
- const initializeOperationType = ( {
339
- typeName = '' ,
340
- typeDefinitionMap = { } ,
341
- config = { }
342
- } ) => {
343
- const typeNameLower = typeName . toLowerCase ( ) ;
344
- const types = Object . keys ( typeDefinitionMap ) ;
345
- let operationType = typeDefinitionMap [ typeName ] ;
346
- if (
347
- hasNonExcludedNodeType ( types , typeDefinitionMap , typeNameLower , config ) &&
348
- ! operationType &&
349
- config [ typeNameLower ]
350
- ) {
351
- operationType = buildObjectType ( {
352
- name : buildName ( { name : typeName } )
353
- } ) ;
354
- }
355
- if ( operationType ) typeDefinitionMap [ typeName ] = operationType ;
356
- return typeDefinitionMap ;
357
- } ;
358
-
359
- /**
360
- * Ensures that an operation type is only generated if an operation
361
- * field would be generated - should be able to factor out
362
- */
363
- const hasNonExcludedNodeType = ( types , typeMap , rootType , config ) => {
364
- return types . find ( e => {
365
- const type = typeMap [ e ] ;
366
- const typeName = type . name ? type . name . value : '' ;
367
- if ( typeName ) {
368
- return (
369
- isNodeType ( { definition : type } ) &&
370
- shouldAugmentType ( config , rootType , typeName )
371
- ) ;
290
+ const setDefaultConfig = ( { config = { } } ) => {
291
+ const configKeys = Object . keys ( config ) ;
292
+ Object . values ( APIConfiguration ) . forEach ( configKey => {
293
+ if ( ! configKeys . find ( providedKey => providedKey === configKey ) ) {
294
+ config [ configKey ] = true ;
372
295
}
373
296
} ) ;
297
+ return config ;
374
298
} ;
375
299
376
300
/**
377
- * Builds a typeDefinitionMap that excludes operation types, instead placing them
378
- * within an operationTypeMap
301
+ * Prints the AST of a GraphQL SDL Document containing definitions
302
+ * extracted from a given schema, along with no loss of directives and a
303
+ * regenerated schema type
379
304
*/
380
- const buildAugmentationTypeMaps = ( {
381
- typeDefinitionMap = { } ,
382
- queryTypeName,
383
- mutationTypeName,
384
- subscriptionTypeName
385
- } ) => {
386
- return Object . entries ( typeDefinitionMap ) . reduce (
387
- ( [ augmentationTypeMap , operationTypeMap ] , [ typeName , definition ] ) => {
388
- if ( typeName === queryTypeName ) {
389
- operationTypeMap [ OperationType . QUERY ] = definition ;
390
- } else if ( typeName === mutationTypeName ) {
391
- operationTypeMap [ OperationType . MUTATION ] = definition ;
392
- } else if ( typeName === subscriptionTypeName ) {
393
- operationTypeMap [ OperationType . SUBSCRIPTION ] = definition ;
394
- } else {
395
- augmentationTypeMap [ typeName ] = definition ;
396
- }
397
- return [ augmentationTypeMap , operationTypeMap ] ;
398
- } ,
399
- [ { } , { } ]
305
+ export const printSchemaDocument = ( { schema } ) => {
306
+ return print (
307
+ buildDocument ( {
308
+ definitions : extractSchemaDefinitions ( { schema } )
309
+ } )
400
310
) ;
401
311
} ;
402
312
@@ -411,6 +321,7 @@ const extractSchemaDefinitions = ({ schema = {} }) => {
411
321
const astNode = definition . astNode ;
412
322
if ( astNode ) {
413
323
astNodes . push ( astNode ) ;
324
+ // Extract embedded type extensions
414
325
const extensionASTNodes = definition . extensionASTNodes ;
415
326
if ( extensionASTNodes ) {
416
327
astNodes . push ( ...extensionASTNodes ) ;
@@ -422,37 +333,6 @@ const extractSchemaDefinitions = ({ schema = {} }) => {
422
333
return definitions ;
423
334
} ;
424
335
425
- /**
426
- * Regenerates the schema type definition using any existing operation types
427
- */
428
- const regenerateSchemaType = ( { schema = { } , definitions = [ ] } ) => {
429
- const operationTypes = [ ] ;
430
- Object . values ( OperationType ) . forEach ( name => {
431
- let operationType = undefined ;
432
- if ( name === OperationType . QUERY ) operationType = schema . getQueryType ( ) ;
433
- else if ( name === OperationType . MUTATION )
434
- operationType = schema . getMutationType ( ) ;
435
- else if ( name === OperationType . SUBSCRIPTION )
436
- operationType = schema . getSubscriptionType ( ) ;
437
- if ( operationType ) {
438
- operationTypes . push (
439
- buildOperationType ( {
440
- operation : name . toLowerCase ( ) ,
441
- type : buildNamedType ( { name : operationType . name } )
442
- } )
443
- ) ;
444
- }
445
- } ) ;
446
- if ( operationTypes . length ) {
447
- definitions . push (
448
- buildSchemaDefinition ( {
449
- operationTypes
450
- } )
451
- ) ;
452
- }
453
- return definitions ;
454
- } ;
455
-
456
336
/**
457
337
* Getter for an array of type names excludes from an operation type
458
338
*/
0 commit comments