@commitspark/graphql-api 1.0.0-beta.6 → 1.0.0-beta.8

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.
Files changed (211) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +75 -28
  3. package/dist/cjs/client.d.ts +28 -0
  4. package/dist/cjs/client.js +15 -22
  5. package/dist/cjs/client.js.map +1 -1
  6. package/dist/cjs/graphql/apollo-config-factory.d.ts +3 -0
  7. package/dist/cjs/graphql/apollo-config-factory.js +8 -19
  8. package/dist/cjs/graphql/apollo-config-factory.js.map +1 -1
  9. package/dist/cjs/graphql/errors.d.ts +19 -0
  10. package/dist/cjs/graphql/errors.js +1 -1
  11. package/dist/cjs/graphql/errors.js.map +1 -1
  12. package/dist/cjs/graphql/input-type-generator.d.ts +5 -0
  13. package/dist/cjs/graphql/input-type-generator.js +4 -4
  14. package/dist/cjs/graphql/input-type-generator.js.map +1 -1
  15. package/dist/cjs/graphql/queries-mutations-generator.d.ts +17 -0
  16. package/dist/cjs/graphql/queries-mutations-generator.js +12 -12
  17. package/dist/cjs/graphql/queries-mutations-generator.js.map +1 -1
  18. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +2 -0
  19. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js +15 -16
  20. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  21. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +2 -0
  22. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js +24 -25
  23. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  24. package/dist/cjs/graphql/resolvers/field-resolvers/types.d.ts +11 -0
  25. package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +2 -0
  26. package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.js +9 -15
  27. package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.js.map +1 -1
  28. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +5 -0
  29. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js +25 -5
  30. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  31. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +3 -0
  32. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +26 -29
  33. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  34. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +2 -0
  35. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +24 -24
  36. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  37. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +3 -0
  38. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +41 -33
  39. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  40. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +3 -0
  41. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js +5 -14
  42. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js.map +1 -1
  43. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +3 -0
  44. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js +5 -14
  45. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -1
  46. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +2 -0
  47. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js +4 -13
  48. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js.map +1 -1
  49. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +2 -0
  50. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +14 -16
  51. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  52. package/dist/cjs/graphql/resolvers/types.d.ts +19 -0
  53. package/dist/cjs/graphql/schema-analyzer.d.ts +8 -0
  54. package/dist/cjs/graphql/schema-analyzer.js +1 -2
  55. package/dist/cjs/graphql/schema-analyzer.js.map +1 -1
  56. package/dist/cjs/graphql/schema-generator.d.ts +3 -0
  57. package/dist/cjs/graphql/schema-generator.js +75 -85
  58. package/dist/cjs/graphql/schema-generator.js.map +1 -1
  59. package/dist/cjs/graphql/schema-root-type-generator.d.ts +2 -0
  60. package/dist/cjs/graphql/schema-root-type-generator.js.map +1 -1
  61. package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts +4 -0
  62. package/dist/cjs/graphql/schema-utils/entry-reference-util.js +141 -106
  63. package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
  64. package/dist/cjs/graphql/schema-utils/entry-type-util.d.ts +4 -0
  65. package/dist/cjs/graphql/schema-utils/entry-type-util.js +1 -2
  66. package/dist/cjs/graphql/schema-utils/entry-type-util.js.map +1 -1
  67. package/dist/cjs/graphql/schema-utils/union-type-util.d.ts +3 -0
  68. package/dist/cjs/graphql/schema-utils/union-type-util.js +3 -3
  69. package/dist/cjs/graphql/schema-utils/union-type-util.js.map +1 -1
  70. package/dist/cjs/graphql/schema-validator.d.ts +2 -0
  71. package/dist/cjs/graphql/schema-validator.js +3 -7
  72. package/dist/cjs/graphql/schema-validator.js.map +1 -1
  73. package/dist/cjs/graphql/util.d.ts +1 -0
  74. package/dist/cjs/graphql/util.js +13 -0
  75. package/dist/cjs/graphql/util.js.map +1 -0
  76. package/dist/cjs/index.d.ts +9 -0
  77. package/dist/cjs/index.js +8 -19
  78. package/dist/cjs/index.js.map +1 -1
  79. package/dist/cjs/persistence/cache.d.ts +12 -0
  80. package/dist/cjs/persistence/cache.js +11 -20
  81. package/dist/cjs/persistence/cache.js.map +1 -1
  82. package/dist/cjs/persistence/persistence.d.ts +6 -0
  83. package/dist/cjs/persistence/persistence.js +27 -45
  84. package/dist/cjs/persistence/persistence.js.map +1 -1
  85. package/dist/esm/client.js +2 -2
  86. package/dist/esm/client.js.map +1 -1
  87. package/dist/esm/graphql/apollo-config-factory.js +1 -1
  88. package/dist/esm/graphql/apollo-config-factory.js.map +1 -1
  89. package/dist/esm/graphql/errors.js.map +1 -1
  90. package/dist/esm/graphql/input-type-generator.js +1 -1
  91. package/dist/esm/graphql/input-type-generator.js.map +1 -1
  92. package/dist/esm/graphql/queries-mutations-generator.js +6 -6
  93. package/dist/esm/graphql/queries-mutations-generator.js.map +1 -1
  94. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js +10 -2
  95. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  96. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js +5 -5
  97. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  98. package/dist/esm/graphql/resolvers/field-resolvers/union-value-resolver.js +1 -1
  99. package/dist/esm/graphql/resolvers/field-resolvers/union-value-resolver.js.map +1 -1
  100. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js +25 -8
  101. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  102. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +6 -6
  103. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  104. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +5 -5
  105. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  106. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +10 -9
  107. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  108. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js +2 -2
  109. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js.map +1 -1
  110. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js +2 -2
  111. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -1
  112. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js +1 -1
  113. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js.map +1 -1
  114. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +12 -5
  115. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  116. package/dist/esm/graphql/schema-generator.js +8 -15
  117. package/dist/esm/graphql/schema-generator.js.map +1 -1
  118. package/dist/esm/graphql/schema-root-type-generator.js.map +1 -1
  119. package/dist/esm/graphql/schema-utils/entry-reference-util.js +65 -16
  120. package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
  121. package/dist/esm/graphql/schema-utils/union-type-util.js +1 -1
  122. package/dist/esm/graphql/schema-utils/union-type-util.js.map +1 -1
  123. package/dist/esm/graphql/util.js +10 -0
  124. package/dist/esm/graphql/util.js.map +1 -0
  125. package/dist/esm/index.js +2 -2
  126. package/dist/esm/index.js.map +1 -1
  127. package/dist/esm/package.json +1 -0
  128. package/dist/esm/persistence/cache.js +1 -1
  129. package/dist/esm/persistence/cache.js.map +1 -1
  130. package/dist/esm/persistence/persistence.js +1 -1
  131. package/dist/esm/persistence/persistence.js.map +1 -1
  132. package/dist/types/client.d.ts +1 -1
  133. package/dist/types/client.d.ts.map +1 -1
  134. package/dist/types/graphql/apollo-config-factory.d.ts +1 -1
  135. package/dist/types/graphql/apollo-config-factory.d.ts.map +1 -1
  136. package/dist/types/graphql/errors.d.ts +0 -1
  137. package/dist/types/graphql/errors.d.ts.map +1 -1
  138. package/dist/types/graphql/input-type-generator.d.ts +1 -1
  139. package/dist/types/graphql/input-type-generator.d.ts.map +1 -1
  140. package/dist/types/graphql/queries-mutations-generator.d.ts +10 -10
  141. package/dist/types/graphql/queries-mutations-generator.d.ts.map +1 -1
  142. package/dist/types/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +2 -2
  143. package/dist/types/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -1
  144. package/dist/types/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +2 -2
  145. package/dist/types/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -1
  146. package/dist/types/graphql/resolvers/field-resolvers/types.d.ts +7 -6
  147. package/dist/types/graphql/resolvers/field-resolvers/types.d.ts.map +1 -1
  148. package/dist/types/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +2 -2
  149. package/dist/types/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +1 -1
  150. package/dist/types/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +4 -6
  151. package/dist/types/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +1 -1
  152. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +2 -3
  153. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
  154. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +2 -4
  155. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
  156. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +2 -3
  157. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
  158. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +2 -3
  159. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +1 -1
  160. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +2 -3
  161. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -1
  162. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +2 -3
  163. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +1 -1
  164. package/dist/types/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +2 -3
  165. package/dist/types/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +1 -1
  166. package/dist/types/graphql/resolvers/types.d.ts +16 -4
  167. package/dist/types/graphql/resolvers/types.d.ts.map +1 -1
  168. package/dist/types/graphql/schema-generator.d.ts +1 -1
  169. package/dist/types/graphql/schema-generator.d.ts.map +1 -1
  170. package/dist/types/graphql/schema-root-type-generator.d.ts +2 -2
  171. package/dist/types/graphql/schema-root-type-generator.d.ts.map +1 -1
  172. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts +3 -2
  173. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +1 -1
  174. package/dist/types/graphql/util.d.ts +2 -0
  175. package/dist/types/graphql/util.d.ts.map +1 -0
  176. package/dist/types/index.d.ts +2 -2
  177. package/dist/types/index.d.ts.map +1 -1
  178. package/dist/types/persistence/cache.d.ts +1 -1
  179. package/dist/types/persistence/cache.d.ts.map +1 -1
  180. package/dist/types/persistence/persistence.d.ts +1 -1
  181. package/dist/types/persistence/persistence.d.ts.map +1 -1
  182. package/package.json +7 -5
  183. package/src/client.ts +3 -3
  184. package/src/graphql/apollo-config-factory.ts +2 -2
  185. package/src/graphql/errors.ts +0 -1
  186. package/src/graphql/input-type-generator.ts +2 -2
  187. package/src/graphql/queries-mutations-generator.ts +23 -24
  188. package/src/graphql/resolvers/field-resolvers/entry-reference-resolver.ts +24 -9
  189. package/src/graphql/resolvers/field-resolvers/field-default-value-resolver.ts +12 -14
  190. package/src/graphql/resolvers/field-resolvers/types.ts +9 -8
  191. package/src/graphql/resolvers/field-resolvers/union-value-resolver.ts +3 -5
  192. package/src/graphql/resolvers/object-type-field-default-value-resolver-generator.ts +44 -27
  193. package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +14 -14
  194. package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +14 -14
  195. package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +18 -18
  196. package/src/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.ts +8 -9
  197. package/src/graphql/resolvers/query-mutation-resolvers/query-every-resolver.ts +8 -9
  198. package/src/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.ts +8 -9
  199. package/src/graphql/resolvers/query-mutation-resolvers/union-type-resolver.ts +22 -10
  200. package/src/graphql/resolvers/types.ts +28 -6
  201. package/src/graphql/schema-generator.ts +32 -39
  202. package/src/graphql/schema-root-type-generator.ts +5 -2
  203. package/src/graphql/schema-utils/entry-reference-util.ts +123 -24
  204. package/src/graphql/schema-utils/union-type-util.ts +1 -1
  205. package/src/graphql/util.ts +11 -0
  206. package/src/index.ts +3 -3
  207. package/src/persistence/cache.ts +2 -2
  208. package/src/persistence/persistence.ts +2 -2
  209. package/dist/tsconfig.build.cjs.tsbuildinfo +0 -1
  210. package/dist/tsconfig.build.esm.tsbuildinfo +0 -1
  211. package/dist/tsconfig.build.types.tsbuildinfo +0 -1
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  GraphQLField,
3
- GraphQLFieldResolver,
4
3
  GraphQLObjectType,
5
4
  GraphQLOutputType,
6
5
  GraphQLSchema,
@@ -9,10 +8,10 @@ import {
9
8
  isObjectType,
10
9
  isUnionType,
11
10
  } from 'graphql'
12
- import { EntryData } from '@commitspark/git-adapter'
13
- import { ResolvedEntryData } from './field-resolvers/types'
14
- import { resolveFieldDefaultValue } from './field-resolvers/field-default-value-resolver'
15
- import { ApolloContext } from '../../client'
11
+ import { resolveFieldDefaultValue } from './field-resolvers/field-default-value-resolver.ts'
12
+ import { createError, ErrorCode } from '../errors.ts'
13
+ import { isRecord } from '../util.ts'
14
+ import { ContextInjectionResolver } from './types.ts'
16
15
 
17
16
  function requiresCustomDefaultValueResolver(type: GraphQLOutputType): boolean {
18
17
  if (isNonNullType(type)) {
@@ -29,10 +28,11 @@ function requiresCustomDefaultValueResolver(type: GraphQLOutputType): boolean {
29
28
 
30
29
  function getFieldsForCustomDefaultValueResolver(
31
30
  objectType: GraphQLObjectType,
32
- ): GraphQLField<any, any>[] {
31
+ ): GraphQLField<unknown, unknown>[] {
33
32
  const fields = []
34
33
  for (const fieldsKey in objectType.getFields()) {
35
- const field: GraphQLField<any, any> = objectType.getFields()[fieldsKey]
34
+ const field: GraphQLField<unknown, unknown> =
35
+ objectType.getFields()[fieldsKey]
36
36
  if (requiresCustomDefaultValueResolver(field.type)) {
37
37
  fields.push(field)
38
38
  }
@@ -40,38 +40,54 @@ function getFieldsForCustomDefaultValueResolver(
40
40
  return fields
41
41
  }
42
42
 
43
- type FieldResolversRecord = Record<
43
+ type RecordOfContextInjectionResolvers = Record<
44
44
  string,
45
- GraphQLFieldResolver<
46
- any,
47
- ApolloContext,
48
- any,
49
- Promise<ResolvedEntryData<EntryData | EntryData[] | null>>
50
- >
45
+ ContextInjectionResolver
51
46
  >
52
47
 
53
48
  export function createObjectTypeFieldResolvers(
54
49
  schema: GraphQLSchema,
55
- ): Record<string, FieldResolversRecord> {
56
- const fieldResolversByType: Record<string, FieldResolversRecord> = {}
50
+ ): Record<string, RecordOfContextInjectionResolvers> {
51
+ const adapterResolversByType: Record<
52
+ string,
53
+ RecordOfContextInjectionResolvers
54
+ > = {}
55
+
57
56
  for (const typeName of Object.keys(schema.getTypeMap())) {
58
57
  const type = schema.getType(typeName)
59
58
  if (!isObjectType(type) || type.name.startsWith('__')) {
60
59
  continue
61
60
  }
61
+
62
+ // only some fields need a custom resolver that generates a default result value on missing source data
62
63
  const fieldsForCustomDefaultValueResolver =
63
64
  getFieldsForCustomDefaultValueResolver(type)
64
65
 
65
- const fieldResolversByFieldName: FieldResolversRecord = {}
66
+ const fieldResolversByFieldName: Record<string, ContextInjectionResolver> =
67
+ {}
66
68
  for (const field of fieldsForCustomDefaultValueResolver) {
67
- fieldResolversByFieldName[field.name] = (
68
- obj,
69
- args,
70
- context,
71
- info,
72
- ): Promise<ResolvedEntryData<EntryData | EntryData[] | null>> =>
73
- resolveFieldDefaultValue(
74
- field.name in obj ? obj[field.name] : undefined,
69
+ // the resolvers created here serve as adapters to inject additional context information needed by actual field resolvers
70
+ fieldResolversByFieldName[field.name] = (obj, args, context, info) => {
71
+ let fieldSourceData = null
72
+ if (obj) {
73
+ fieldSourceData = obj[field.name] ?? null
74
+ if (
75
+ fieldSourceData !== null &&
76
+ !(isRecord(fieldSourceData) || Array.isArray(fieldSourceData))
77
+ ) {
78
+ throw createError(
79
+ `Expected an object or array as data for passing to resolver of field "${field.name}" in type "${typeName}".`,
80
+ ErrorCode.BAD_REPOSITORY_DATA,
81
+ {
82
+ fieldName: field.name,
83
+ typeName: typeName,
84
+ },
85
+ )
86
+ }
87
+ }
88
+
89
+ return resolveFieldDefaultValue(
90
+ fieldSourceData,
75
91
  args,
76
92
  {
77
93
  ...context,
@@ -79,12 +95,13 @@ export function createObjectTypeFieldResolvers(
79
95
  },
80
96
  info,
81
97
  )
98
+ }
82
99
  }
83
100
 
84
101
  if (Object.keys(fieldResolversByFieldName).length > 0) {
85
- fieldResolversByType[typeName] = fieldResolversByFieldName
102
+ adapterResolversByType[typeName] = fieldResolversByFieldName
86
103
  }
87
104
  }
88
105
 
89
- return fieldResolversByType
106
+ return adapterResolversByType
90
107
  }
@@ -1,20 +1,20 @@
1
- import { findById, findByTypeId } from '../../../persistence/persistence'
2
- import { GraphQLFieldResolver, isObjectType } from 'graphql'
3
- import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util'
1
+ import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
+ import { isObjectType } from 'graphql'
3
+ import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util.ts'
4
4
  import {
5
5
  ENTRY_ID_INVALID_CHARACTERS,
6
6
  EntryData,
7
7
  EntryDraft,
8
8
  } from '@commitspark/git-adapter'
9
- import { QueryMutationResolverContext } from '../types'
10
- import { createError, ErrorCode } from '../../errors'
9
+ import { QueryMutationResolver } from '../types.ts'
10
+ import { createError, ErrorCode } from '../../errors.ts'
11
11
 
12
- export const mutationCreateResolver: GraphQLFieldResolver<
13
- any,
14
- QueryMutationResolverContext,
15
- any,
16
- Promise<EntryData>
17
- > = async (source, args, context, info) => {
12
+ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
13
+ source,
14
+ args,
15
+ context,
16
+ info,
17
+ ) => {
18
18
  if (!isObjectType(context.type)) {
19
19
  throw createError(
20
20
  `Entry of type "${context.type.name}" cannot be created as is not an ObjectType.`,
@@ -57,7 +57,7 @@ export const mutationCreateResolver: GraphQLFieldResolver<
57
57
  context,
58
58
  null,
59
59
  info.returnType,
60
- args.data,
60
+ args.data ?? null,
61
61
  )
62
62
 
63
63
  const referencedEntryUpdates: EntryDraft[] = []
@@ -84,7 +84,7 @@ export const mutationCreateResolver: GraphQLFieldResolver<
84
84
  type: context.type.name,
85
85
  referencedBy: [],
86
86
  },
87
- data: args.data,
87
+ data: args.data ?? null,
88
88
  deletion: false,
89
89
  }
90
90
 
@@ -94,7 +94,7 @@ export const mutationCreateResolver: GraphQLFieldResolver<
94
94
  entries: [newEntryDraft, ...referencedEntryUpdates],
95
95
  message: args.commitMessage,
96
96
  })
97
- context.setCurrentHash(commit.ref)
97
+ context.setCurrentHash(commit.commitHash)
98
98
 
99
99
  const newEntry = await findByTypeId(context, context.type.name, args.id)
100
100
  return { ...newEntry.data, id: newEntry.id }
@@ -1,16 +1,16 @@
1
- import { findById, findByTypeId } from '../../../persistence/persistence'
2
- import { Entry, EntryData, EntryDraft } from '@commitspark/git-adapter'
3
- import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util'
4
- import { GraphQLFieldResolver, isObjectType } from 'graphql'
5
- import { QueryMutationResolverContext } from '../types'
6
- import { createError, ErrorCode } from '../../errors'
1
+ import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
+ import { Entry, EntryDraft } from '@commitspark/git-adapter'
3
+ import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util.ts'
4
+ import { isObjectType } from 'graphql'
5
+ import { QueryMutationResolver } from '../types.ts'
6
+ import { createError, ErrorCode } from '../../errors.ts'
7
7
 
8
- export const mutationDeleteResolver: GraphQLFieldResolver<
9
- any,
10
- QueryMutationResolverContext,
11
- any,
12
- Promise<EntryData>
13
- > = async (source, args, context, info) => {
8
+ export const mutationDeleteResolver: QueryMutationResolver<string> = async (
9
+ source,
10
+ args,
11
+ context,
12
+ info,
13
+ ) => {
14
14
  const entry: Entry = await findByTypeId(context, context.type.name, args.id)
15
15
 
16
16
  if (entry.metadata.referencedBy && entry.metadata.referencedBy.length > 0) {
@@ -41,7 +41,7 @@ export const mutationDeleteResolver: GraphQLFieldResolver<
41
41
  context,
42
42
  null,
43
43
  entryType,
44
- entry.data,
44
+ entry.data ?? null,
45
45
  )
46
46
  const referencedEntryUpdates: EntryDraft[] = []
47
47
  for (const referencedEntryId of referencedEntryIds) {
@@ -70,7 +70,7 @@ export const mutationDeleteResolver: GraphQLFieldResolver<
70
70
  ],
71
71
  message: args.commitMessage,
72
72
  })
73
- context.setCurrentHash(commit.ref)
73
+ context.setCurrentHash(commit.commitHash)
74
74
 
75
75
  return args.id
76
76
  }
@@ -1,9 +1,9 @@
1
- import { findById, findByTypeId } from '../../../persistence/persistence'
2
- import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util'
3
- import { GraphQLFieldResolver, isObjectType } from 'graphql'
1
+ import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
+ import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util.ts'
3
+ import { isObjectType } from 'graphql'
4
4
  import { EntryData, EntryDraft } from '@commitspark/git-adapter'
5
- import { QueryMutationResolverContext } from '../types'
6
- import { createError, ErrorCode } from '../../errors'
5
+ import { QueryMutationResolver } from '../types.ts'
6
+ import { createError, ErrorCode } from '../../errors.ts'
7
7
 
8
8
  function mergeData(
9
9
  existingEntryData: EntryData,
@@ -15,12 +15,12 @@ function mergeData(
15
15
  }
16
16
  }
17
17
 
18
- export const mutationUpdateResolver: GraphQLFieldResolver<
19
- any,
20
- QueryMutationResolverContext,
21
- any,
22
- Promise<EntryData>
23
- > = async (source, args, context, info) => {
18
+ export const mutationUpdateResolver: QueryMutationResolver<EntryData> = async (
19
+ source,
20
+ args,
21
+ context,
22
+ info,
23
+ ) => {
24
24
  if (!isObjectType(context.type)) {
25
25
  throw createError(
26
26
  `Type "${context.type.name}" cannot be mutated as is not an ObjectType.`,
@@ -36,10 +36,10 @@ export const mutationUpdateResolver: GraphQLFieldResolver<
36
36
  context,
37
37
  null,
38
38
  info.returnType,
39
- existingEntry.data,
39
+ existingEntry.data ?? null,
40
40
  )
41
41
 
42
- const mergedData = mergeData(existingEntry.data ?? null, args.data)
42
+ const mergedData = mergeData(existingEntry.data ?? null, args.data ?? null)
43
43
  const updatedReferencedEntryIds = await getReferencedEntryIds(
44
44
  context.type,
45
45
  context,
@@ -74,10 +74,10 @@ export const mutationUpdateResolver: GraphQLFieldResolver<
74
74
  }
75
75
  for (const newlyReferencedEntryId of newlyReferencedIds) {
76
76
  const newlyReferencedEntry = await findById(context, newlyReferencedEntryId)
77
- const updatedReferenceList: string[] =
78
- newlyReferencedEntry.metadata.referencedBy ?? []
79
- updatedReferenceList.push(args.id)
80
- updatedReferenceList.sort()
77
+ const updatedReferenceList: string[] = [
78
+ ...(newlyReferencedEntry.metadata.referencedBy ?? []),
79
+ args.id,
80
+ ].sort()
81
81
  referencedEntryUpdates.push({
82
82
  ...newlyReferencedEntry,
83
83
  metadata: {
@@ -97,7 +97,7 @@ export const mutationUpdateResolver: GraphQLFieldResolver<
97
97
  ],
98
98
  message: args.commitMessage,
99
99
  })
100
- context.setCurrentHash(commit.ref)
100
+ context.setCurrentHash(commit.commitHash)
101
101
 
102
102
  const updatedEntry = await findByTypeId(context, context.type.name, args.id)
103
103
  return { ...updatedEntry.data, id: updatedEntry.id }
@@ -1,14 +1,13 @@
1
1
  import { EntryData } from '@commitspark/git-adapter'
2
- import { findByTypeId } from '../../../persistence/persistence'
3
- import { GraphQLFieldResolver } from 'graphql'
4
- import { QueryMutationResolverContext } from '../types'
2
+ import { findByTypeId } from '../../../persistence/persistence.ts'
3
+ import { QueryMutationResolver } from '../types.ts'
5
4
 
6
- export const queryByIdResolver: GraphQLFieldResolver<
7
- any,
8
- QueryMutationResolverContext,
9
- any,
10
- Promise<EntryData>
11
- > = async (_obj, args, context, info) => {
5
+ export const queryByIdResolver: QueryMutationResolver<EntryData> = async (
6
+ _source,
7
+ args,
8
+ context,
9
+ info,
10
+ ) => {
12
11
  void info
13
12
  const entry = await findByTypeId(context, context.type.name, args.id)
14
13
 
@@ -1,14 +1,13 @@
1
1
  import { EntryData } from '@commitspark/git-adapter'
2
- import { findByType } from '../../../persistence/persistence'
3
- import { GraphQLFieldResolver } from 'graphql'
4
- import { QueryMutationResolverContext } from '../types'
2
+ import { findByType } from '../../../persistence/persistence.ts'
3
+ import { QueryMutationResolver } from '../types.ts'
5
4
 
6
- export const queryEveryResolver: GraphQLFieldResolver<
7
- any,
8
- QueryMutationResolverContext,
9
- any,
10
- Promise<EntryData[]>
11
- > = async (_obj, _args, context, info) => {
5
+ export const queryEveryResolver: QueryMutationResolver<EntryData[]> = async (
6
+ _source,
7
+ _args,
8
+ context,
9
+ info,
10
+ ) => {
12
11
  void info
13
12
  const entries = await findByType(context, context.type.name)
14
13
 
@@ -1,13 +1,12 @@
1
- import { getTypeById } from '../../../persistence/persistence'
2
- import { GraphQLFieldResolver } from 'graphql'
3
- import { ApolloContext } from '../../../client'
1
+ import { getTypeById } from '../../../persistence/persistence.ts'
2
+ import { QueryMutationResolver } from '../types.ts'
4
3
 
5
- export const queryTypeByIdResolver: GraphQLFieldResolver<
6
- any,
7
- ApolloContext,
8
- any,
9
- Promise<string>
10
- > = async (_source, args, context, info) => {
4
+ export const queryTypeByIdResolver: QueryMutationResolver<string> = async (
5
+ _source,
6
+ args,
7
+ context,
8
+ info,
9
+ ) => {
11
10
  void info
12
11
  return getTypeById(context, args.id)
13
12
  }
@@ -1,18 +1,30 @@
1
- import { ApolloContext } from '../../../client'
2
- import { getTypeById } from '../../../persistence/persistence'
3
- import { GraphQLTypeResolver } from 'graphql'
4
- import { buildsOnTypeWithEntryDirective } from '../../schema-utils/entry-type-util'
1
+ import { getTypeById } from '../../../persistence/persistence.ts'
2
+ import { buildsOnTypeWithEntryDirective } from '../../schema-utils/entry-type-util.ts'
3
+ import { UnionTypeResolver } from '../types.ts'
4
+ import { createError, ErrorCode } from '../../errors.ts'
5
5
 
6
- export const unionTypeResolver: GraphQLTypeResolver<
7
- any,
8
- ApolloContext
9
- > = async (obj, context, info, abstractType) => {
6
+ export const unionTypeResolver: UnionTypeResolver = async (
7
+ source,
8
+ context,
9
+ info,
10
+ abstractType,
11
+ ) => {
10
12
  if (buildsOnTypeWithEntryDirective(abstractType)) {
11
- return getTypeById(context, obj.id)
13
+ if (!('id' in source) || typeof source.id !== 'string') {
14
+ throw createError(
15
+ `Expected key "id" of type string in data while resolving reference-based union type for field "${info.fieldName}".`,
16
+ ErrorCode.BAD_REPOSITORY_DATA,
17
+ {
18
+ typeName: abstractType.name,
19
+ fieldName: info.fieldName,
20
+ },
21
+ )
22
+ }
23
+ return getTypeById(context, source.id)
12
24
  } else {
13
25
  // We have injected an internal `__typename` field into the data of fields pointing to a non-entry union
14
26
  // in UnionValueResolver. This artificial field holds the type information we need here.
15
- return obj.__typename
27
+ return source.__typename
16
28
  }
17
29
 
18
30
  // TODO same for interface type: https://www.apollographql.com/docs/apollo-server/data/resolvers/#resolving-unions-and-interfaces
@@ -1,14 +1,36 @@
1
- import { ApolloContext } from '../../client'
2
- import { GraphQLNamedType } from 'graphql/type'
3
- import { GraphQLFieldResolver } from 'graphql'
1
+ import { ApolloContext } from '../../client.ts'
2
+ import {
3
+ GraphQLFieldResolver,
4
+ GraphQLNamedType,
5
+ GraphQLTypeResolver,
6
+ } from 'graphql'
7
+ import { EntryData } from '@commitspark/git-adapter'
8
+ import { RecursiveArray } from './field-resolvers/types.ts'
4
9
 
5
10
  export interface QueryMutationResolverContext extends ApolloContext {
6
11
  type: GraphQLNamedType
7
12
  }
8
13
 
9
14
  export type QueryMutationResolver<ResultType> = GraphQLFieldResolver<
10
- any,
11
- ApolloContext,
12
- any,
15
+ unknown,
16
+ QueryMutationResolverContext,
17
+ { id: string; data?: EntryData; commitMessage: string },
13
18
  Promise<ResultType>
14
19
  >
20
+
21
+ export type UnionTypeResolver = GraphQLTypeResolver<
22
+ UnionTypeResolverSourceData,
23
+ ApolloContext
24
+ >
25
+
26
+ type UnionTypeResolverSourceData = EntryData & {
27
+ id?: string
28
+ __typename: string
29
+ }
30
+
31
+ export type ContextInjectionResolver = GraphQLFieldResolver<
32
+ EntryData,
33
+ ApolloContext,
34
+ Record<string, unknown>,
35
+ Promise<RecursiveArray<EntryData>>
36
+ >
@@ -1,26 +1,32 @@
1
1
  import {
2
2
  generateQueriesAndMutations,
3
3
  generateTypeNameQuery,
4
- } from './queries-mutations-generator'
4
+ } from './queries-mutations-generator.ts'
5
5
  import {
6
6
  IExecutableSchemaDefinition,
7
7
  makeExecutableSchema,
8
8
  } from '@graphql-tools/schema'
9
- import { analyzeSchema } from './schema-analyzer'
9
+ import { analyzeSchema } from './schema-analyzer.ts'
10
10
  import {
11
11
  generateIdInputTypeStrings,
12
12
  generateObjectInputTypeStrings,
13
13
  generateUnionInputTypeStrings,
14
- } from './input-type-generator'
15
- import { generateSchemaRootTypeStrings } from './schema-root-type-generator'
14
+ } from './input-type-generator.ts'
15
+ import { generateSchemaRootTypeStrings } from './schema-root-type-generator.ts'
16
16
  import { printSchemaWithDirectives } from '@graphql-tools/utils'
17
- import { unionTypeResolver } from './resolvers/query-mutation-resolvers/union-type-resolver'
18
- import { ApolloContext } from '../client'
19
- import { GraphQLFieldResolver, GraphQLTypeResolver } from 'graphql'
20
- import { getValidationResult } from './schema-validator'
17
+ import { unionTypeResolver } from './resolvers/query-mutation-resolvers/union-type-resolver.ts'
18
+ import { ApolloContext } from '../client.ts'
19
+ import { GraphQLTypeResolver } from 'graphql'
20
+ import { getValidationResult } from './schema-validator.ts'
21
+ import { createObjectTypeFieldResolvers } from './resolvers/object-type-field-default-value-resolver-generator.ts'
22
+ import { createError, ErrorCode } from './errors.ts'
23
+ import { FieldResolver } from './resolvers/field-resolvers/types.ts'
24
+ import {
25
+ ContextInjectionResolver,
26
+ QueryMutationResolver,
27
+ UnionTypeResolver,
28
+ } from './resolvers/types.ts'
21
29
  import { EntryData } from '@commitspark/git-adapter'
22
- import { createObjectTypeFieldResolvers } from './resolvers/object-type-field-default-value-resolver-generator'
23
- import { createError, ErrorCode } from './errors'
24
30
 
25
31
  export async function generateSchema(
26
32
  context: ApolloContext,
@@ -52,19 +58,6 @@ export async function generateSchema(
52
58
  )
53
59
  const generatedTypeNameQuery = generateTypeNameQuery()
54
60
 
55
- const generatedEntryReferenceResolvers: Record<
56
- string,
57
- Record<
58
- string,
59
- GraphQLFieldResolver<
60
- Record<string, any>,
61
- ApolloContext,
62
- any,
63
- Promise<EntryData | EntryData[] | null>
64
- >
65
- >
66
- > = {}
67
-
68
61
  const generatedObjectInputTypeStrings = generateObjectInputTypeStrings(
69
62
  schemaAnalyzerResult.objectTypes,
70
63
  )
@@ -85,7 +78,10 @@ export async function generateSchema(
85
78
 
86
79
  ${generatedSchemaRootTypeStrings}`
87
80
 
88
- const generatedUnionTypeResolvers: Record<string, UnionTypeResolver> = {}
81
+ const generatedUnionTypeResolvers: Record<
82
+ string,
83
+ { __resolveType: UnionTypeResolver }
84
+ > = {}
89
85
  for (const unionType of schemaAnalyzerResult.unionTypes) {
90
86
  generatedUnionTypeResolvers[unionType.name] = {
91
87
  __resolveType: unionTypeResolver,
@@ -96,11 +92,11 @@ ${generatedSchemaRootTypeStrings}`
96
92
 
97
93
  const generatedQueryResolvers: Record<
98
94
  string,
99
- GraphQLFieldResolver<any, ApolloContext>
95
+ QueryMutationResolver<EntryData | EntryData[] | string>
100
96
  > = {}
101
97
  const generatedMutationResolvers: Record<
102
98
  string,
103
- GraphQLFieldResolver<any, ApolloContext>
99
+ QueryMutationResolver<EntryData | EntryData[] | string>
104
100
  > = {}
105
101
 
106
102
  for (const element of generatedQueriesMutations) {
@@ -119,11 +115,14 @@ ${generatedSchemaRootTypeStrings}`
119
115
 
120
116
  const allGeneratedResolvers: Record<
121
117
  string,
122
- Record<
123
- string,
124
- | GraphQLFieldResolver<any, ApolloContext>
125
- | GraphQLTypeResolver<any, ApolloContext>
126
- >
118
+ | Record<
119
+ string,
120
+ | QueryMutationResolver<EntryData | EntryData[] | string>
121
+ | GraphQLTypeResolver<unknown, ApolloContext>
122
+ | ContextInjectionResolver
123
+ | FieldResolver
124
+ >
125
+ | UnionTypeResolverRecord
127
126
  > = {
128
127
  Query: generatedQueryResolvers,
129
128
  Mutation: generatedMutationResolvers,
@@ -141,12 +140,6 @@ ${generatedSchemaRootTypeStrings}`
141
140
  ...generatedObjectTypeFieldResolvers[typeName],
142
141
  }
143
142
  }
144
- for (const typeName of Object.keys(generatedEntryReferenceResolvers)) {
145
- allGeneratedResolvers[typeName] = {
146
- ...(allGeneratedResolvers[typeName] ?? {}),
147
- ...generatedEntryReferenceResolvers[typeName],
148
- }
149
- }
150
143
 
151
144
  const typeDefs = [
152
145
  filteredOriginalSchemaString,
@@ -162,6 +155,6 @@ ${generatedSchemaRootTypeStrings}`
162
155
  }
163
156
  }
164
157
 
165
- interface UnionTypeResolver {
166
- __resolveType: GraphQLTypeResolver<any, ApolloContext>
158
+ interface UnionTypeResolverRecord {
159
+ __resolveType: UnionTypeResolver
167
160
  }
@@ -1,8 +1,11 @@
1
- import { GeneratedQuery, GeneratedSchema } from './queries-mutations-generator'
1
+ import {
2
+ GeneratedQuery,
3
+ GeneratedSchema,
4
+ } from './queries-mutations-generator.ts'
2
5
 
3
6
  export function generateSchemaRootTypeStrings(
4
7
  generatedSchemas: GeneratedSchema[],
5
- typeQuery: GeneratedQuery<Promise<string>>,
8
+ typeQuery: GeneratedQuery,
6
9
  ): string {
7
10
  return (
8
11
  `type Query {\n` +