1
1
import { GraphQLInt , GraphQLString } from 'graphql' ;
2
- import { Neo4jTypeName , buildNeo4jType } from '../types/types' ;
3
- import { buildName , buildField , buildNamedType , buildInputValue } from '../ast' ;
2
+ import { buildNeo4jTypes } from '../types/types' ;
4
3
5
4
/**
6
5
* An enum describing the names of Neo4j Temporal types
6
+ * See: https://neo4j.com/docs/cypher-manual/current/syntax/temporal/#cypher-temporal-instants
7
7
*/
8
8
export const TemporalType = {
9
9
TIME : 'Time' ,
@@ -16,7 +16,7 @@ export const TemporalType = {
16
16
/**
17
17
* An enum describing the property names of the Neo4j Time type
18
18
*/
19
- const Neo4jTimeField = {
19
+ export const Neo4jTimeField = {
20
20
HOUR : 'hour' ,
21
21
MINUTE : 'minute' ,
22
22
SECOND : 'second' ,
@@ -29,26 +29,17 @@ const Neo4jTimeField = {
29
29
/**
30
30
* An enum describing the property names of the Neo4j Date type
31
31
*/
32
- const Neo4jDateField = {
32
+ export const Neo4jDateField = {
33
33
YEAR : 'year' ,
34
34
MONTH : 'month' ,
35
35
DAY : 'day'
36
36
} ;
37
37
38
- /**
39
- * An enum describing the names of fields computed and added to the input
40
- * and output type definitions representing non-scalar Neo4j property types
41
- * TODO support for the Neo4j Point data type should also use this
42
- */
43
- export const Neo4jTypeFormatted = {
44
- FORMATTED : 'formatted'
45
- } ;
46
-
47
38
/**
48
39
* A map of the Neo4j Temporal Time type fields to their respective
49
40
* GraphQL types
50
41
*/
51
- const Neo4jTime = {
42
+ export const Neo4jTime = {
52
43
[ Neo4jTimeField . HOUR ] : GraphQLInt . name ,
53
44
[ Neo4jTimeField . MINUTE ] : GraphQLInt . name ,
54
45
[ Neo4jTimeField . SECOND ] : GraphQLInt . name ,
@@ -62,86 +53,32 @@ const Neo4jTime = {
62
53
* A map of the Neo4j Temporal Date type fields to their respective
63
54
* GraphQL types
64
55
*/
65
- const Neo4jDate = {
56
+ export const Neo4jDate = {
66
57
[ Neo4jDateField . YEAR ] : GraphQLInt . name ,
67
58
[ Neo4jDateField . MONTH ] : GraphQLInt . name ,
68
59
[ Neo4jDateField . DAY ] : GraphQLInt . name
69
60
} ;
70
61
71
62
/**
72
63
* The main export for building the GraphQL input and output type definitions
73
- * for the Neo4j Temporal property types. Each TemporalType can be constructed
74
- * using either or both of the Time and Date type fields.
64
+ * for Neo4j Temporal property types. Each TemporalType can be constructed
65
+ * using either or both of the Time and Date type fields
75
66
*/
76
- export const buildTemporalTypes = ( { typeMap, config = { } } ) => {
77
- config . temporal = decideTemporalConfig ( config ) ;
78
- const temporalConfig = config . temporal ;
79
- Object . values ( TemporalType ) . forEach ( typeName => {
80
- const typeNameLower = typeName . toLowerCase ( ) ;
81
- if ( temporalConfig [ typeNameLower ] === true ) {
82
- const objectTypeName = `${ Neo4jTypeName } ${ typeName } ` ;
83
- const inputTypeName = `${ objectTypeName } Input` ;
84
- let fields = [ ] ;
85
- if ( typeName === TemporalType . DATE ) {
86
- fields = Object . entries ( Neo4jDate ) ;
87
- } else if ( typeName === TemporalType . TIME ) {
88
- fields = Object . entries ( Neo4jTime ) ;
89
- } else if ( typeName === TemporalType . LOCALTIME ) {
90
- fields = Object . entries ( {
91
- ...Neo4jTime
92
- } ) . filter ( ( [ name ] ) => name !== Neo4jTimeField . TIMEZONE ) ;
93
- } else if ( typeName === TemporalType . DATETIME ) {
94
- fields = Object . entries ( {
95
- ...Neo4jDate ,
96
- ...Neo4jTime
97
- } ) ;
98
- } else if ( typeName === TemporalType . LOCALDATETIME ) {
99
- fields = Object . entries ( {
100
- ...Neo4jDate ,
101
- ...Neo4jTime
102
- } ) . filter ( ( [ name ] ) => name !== Neo4jTimeField . TIMEZONE ) ;
103
- }
104
- let inputFields = [ ] ;
105
- let outputFields = [ ] ;
106
- fields . forEach ( ( [ fieldName , fieldType ] ) => {
107
- const fieldNameLower = fieldName . toLowerCase ( ) ;
108
- const fieldConfig = {
109
- name : buildName ( { name : fieldNameLower } ) ,
110
- type : buildNamedType ( {
111
- name : fieldType
112
- } )
113
- } ;
114
- inputFields . push ( buildInputValue ( fieldConfig ) ) ;
115
- outputFields . push ( buildField ( fieldConfig ) ) ;
116
- } ) ;
117
- const formattedFieldConfig = {
118
- name : buildName ( {
119
- name : Neo4jTypeFormatted . FORMATTED
120
- } ) ,
121
- type : buildNamedType ( {
122
- name : GraphQLString . name
123
- } )
124
- } ;
125
- inputFields . push ( buildInputValue ( formattedFieldConfig ) ) ;
126
- outputFields . push ( buildField ( formattedFieldConfig ) ) ;
127
- typeMap = buildNeo4jType ( {
128
- inputTypeName,
129
- inputFields,
130
- objectTypeName,
131
- outputFields,
132
- typeMap
133
- } ) ;
134
- }
67
+ export const augmentTemporalTypes = ( { typeMap, config = { } } ) => {
68
+ config . temporal = decideTemporalConfig ( { config } ) ;
69
+ return buildNeo4jTypes ( {
70
+ typeMap,
71
+ neo4jTypes : TemporalType ,
72
+ config : config . temporal
135
73
} ) ;
136
- return typeMap ;
137
74
} ;
138
75
139
76
/**
140
77
* A helper function for ensuring a fine-grained temporal
141
78
* configmration, used to simplify checking it
142
79
* throughout the augmnetation process
143
80
*/
144
- const decideTemporalConfig = config => {
81
+ const decideTemporalConfig = ( { config } ) => {
145
82
let defaultConfig = {
146
83
time : true ,
147
84
date : true ,
0 commit comments