@commitspark/graphql-api 1.0.0-beta.7 → 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 (135) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +75 -28
  3. package/dist/cjs/graphql/errors.d.ts +0 -1
  4. package/dist/cjs/graphql/errors.js.map +1 -1
  5. package/dist/cjs/graphql/queries-mutations-generator.d.ts +10 -10
  6. package/dist/cjs/graphql/queries-mutations-generator.js.map +1 -1
  7. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +1 -1
  8. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js +8 -0
  9. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  10. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +1 -1
  11. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js +1 -1
  12. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  13. package/dist/cjs/graphql/resolvers/field-resolvers/types.d.ts +5 -3
  14. package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +1 -1
  15. package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.js.map +1 -1
  16. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +4 -6
  17. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js +24 -7
  18. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  19. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +2 -3
  20. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +3 -3
  21. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  22. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +2 -4
  23. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +2 -2
  24. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  25. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +2 -3
  26. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +7 -6
  27. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  28. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +2 -3
  29. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js +1 -1
  30. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js.map +1 -1
  31. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +2 -3
  32. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js +1 -1
  33. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -1
  34. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +2 -3
  35. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js.map +1 -1
  36. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +2 -3
  37. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +10 -3
  38. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  39. package/dist/cjs/graphql/resolvers/types.d.ts +15 -2
  40. package/dist/cjs/graphql/schema-generator.js +0 -7
  41. package/dist/cjs/graphql/schema-generator.js.map +1 -1
  42. package/dist/cjs/graphql/schema-root-type-generator.d.ts +1 -1
  43. package/dist/cjs/graphql/schema-root-type-generator.js.map +1 -1
  44. package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts +2 -1
  45. package/dist/cjs/graphql/schema-utils/entry-reference-util.js +60 -11
  46. package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
  47. package/dist/cjs/graphql/util.d.ts +1 -0
  48. package/dist/cjs/graphql/util.js +13 -0
  49. package/dist/cjs/graphql/util.js.map +1 -0
  50. package/dist/esm/graphql/errors.js.map +1 -1
  51. package/dist/esm/graphql/queries-mutations-generator.js.map +1 -1
  52. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js +8 -0
  53. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  54. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js +1 -1
  55. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  56. package/dist/esm/graphql/resolvers/field-resolvers/union-value-resolver.js.map +1 -1
  57. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js +24 -7
  58. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  59. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +3 -3
  60. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  61. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +2 -2
  62. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  63. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +7 -6
  64. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  65. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js +1 -1
  66. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.js.map +1 -1
  67. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js +1 -1
  68. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -1
  69. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.js.map +1 -1
  70. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +10 -3
  71. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  72. package/dist/esm/graphql/schema-generator.js +0 -7
  73. package/dist/esm/graphql/schema-generator.js.map +1 -1
  74. package/dist/esm/graphql/schema-root-type-generator.js.map +1 -1
  75. package/dist/esm/graphql/schema-utils/entry-reference-util.js +61 -12
  76. package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
  77. package/dist/esm/graphql/util.js +10 -0
  78. package/dist/esm/graphql/util.js.map +1 -0
  79. package/dist/types/graphql/errors.d.ts +0 -1
  80. package/dist/types/graphql/errors.d.ts.map +1 -1
  81. package/dist/types/graphql/queries-mutations-generator.d.ts +10 -10
  82. package/dist/types/graphql/queries-mutations-generator.d.ts.map +1 -1
  83. package/dist/types/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +1 -1
  84. package/dist/types/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -1
  85. package/dist/types/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +1 -1
  86. package/dist/types/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -1
  87. package/dist/types/graphql/resolvers/field-resolvers/types.d.ts +5 -3
  88. package/dist/types/graphql/resolvers/field-resolvers/types.d.ts.map +1 -1
  89. package/dist/types/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +1 -1
  90. package/dist/types/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +1 -1
  91. package/dist/types/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +4 -6
  92. package/dist/types/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +1 -1
  93. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +2 -3
  94. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
  95. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +2 -4
  96. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
  97. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +2 -3
  98. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
  99. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +2 -3
  100. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +1 -1
  101. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +2 -3
  102. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -1
  103. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +2 -3
  104. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +1 -1
  105. package/dist/types/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +2 -3
  106. package/dist/types/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +1 -1
  107. package/dist/types/graphql/resolvers/types.d.ts +15 -2
  108. package/dist/types/graphql/resolvers/types.d.ts.map +1 -1
  109. package/dist/types/graphql/schema-generator.d.ts.map +1 -1
  110. package/dist/types/graphql/schema-root-type-generator.d.ts +1 -1
  111. package/dist/types/graphql/schema-root-type-generator.d.ts.map +1 -1
  112. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts +2 -1
  113. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +1 -1
  114. package/dist/types/graphql/util.d.ts +2 -0
  115. package/dist/types/graphql/util.d.ts.map +1 -0
  116. package/package.json +2 -2
  117. package/src/graphql/errors.ts +0 -1
  118. package/src/graphql/queries-mutations-generator.ts +16 -17
  119. package/src/graphql/resolvers/field-resolvers/entry-reference-resolver.ts +22 -7
  120. package/src/graphql/resolvers/field-resolvers/field-default-value-resolver.ts +8 -10
  121. package/src/graphql/resolvers/field-resolvers/types.ts +7 -5
  122. package/src/graphql/resolvers/field-resolvers/union-value-resolver.ts +2 -4
  123. package/src/graphql/resolvers/object-type-field-default-value-resolver-generator.ts +43 -26
  124. package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +11 -11
  125. package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +11 -11
  126. package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +15 -15
  127. package/src/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.ts +7 -8
  128. package/src/graphql/resolvers/query-mutation-resolvers/query-every-resolver.ts +7 -8
  129. package/src/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.ts +7 -8
  130. package/src/graphql/resolvers/query-mutation-resolvers/union-type-resolver.ts +20 -8
  131. package/src/graphql/resolvers/types.ts +27 -4
  132. package/src/graphql/schema-generator.ts +24 -31
  133. package/src/graphql/schema-root-type-generator.ts +5 -2
  134. package/src/graphql/schema-utils/entry-reference-util.ts +118 -19
  135. package/src/graphql/util.ts +11 -0
@@ -1,4 +1,5 @@
1
1
  import { GraphQLNullableType, GraphQLObjectType } from 'graphql';
2
2
  import { ApolloContext } from '../../client.ts';
3
- export declare function getReferencedEntryIds(rootType: GraphQLObjectType, context: ApolloContext, fieldName: string | null, type: GraphQLNullableType, data: any): Promise<string[]>;
3
+ import { EntryData } from '@commitspark/git-adapter';
4
+ export declare function getReferencedEntryIds(rootType: GraphQLObjectType, context: ApolloContext, fieldName: string | null, type: GraphQLNullableType, data: EntryData | EntryData[]): Promise<string[]>;
4
5
  //# sourceMappingURL=entry-reference-util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-reference-util.d.ts","sourceRoot":"","sources":["../../../../src/graphql/schema-utils/entry-reference-util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAKlB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AA+F/C,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,MAAM,EAAE,CAAC,CAqFnB"}
1
+ {"version":3,"file":"entry-reference-util.d.ts","sourceRoot":"","sources":["../../../../src/graphql/schema-utils/entry-reference-util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAOlB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAQ/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AA8FpD,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CA2InB"}
@@ -0,0 +1,2 @@
1
+ export declare function isRecord(obj: unknown): obj is Record<string, unknown>;
2
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/graphql/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUrE"}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "gitops",
10
10
  "api"
11
11
  ],
12
- "version": "1.0.0-beta.7",
12
+ "version": "1.0.0-beta.8",
13
13
  "license": "ISC",
14
14
  "private": false,
15
15
  "files": [
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@apollo/server": "^5.2.0",
47
- "@commitspark/git-adapter": "^0.20.0",
47
+ "@commitspark/git-adapter": "^0.30.0",
48
48
  "@graphql-tools/schema": "^9.0.0",
49
49
  "@graphql-tools/utils": "^9.0.0"
50
50
  },
@@ -5,7 +5,6 @@ export const enum ErrorCode {
5
5
  BAD_USER_INPUT = 'BAD_USER_INPUT',
6
6
  NOT_FOUND = 'NOT_FOUND',
7
7
  BAD_REPOSITORY_DATA = 'BAD_REPOSITORY_DATA',
8
- SCHEMA_DATA_MISMATCH = 'SCHEMA_DATA_MISMATCH',
9
8
  BAD_SCHEMA = 'BAD_SCHEMA',
10
9
  INTERNAL_ERROR = 'INTERNAL_ERROR',
11
10
  IN_USE = 'IN_USE',
@@ -1,6 +1,5 @@
1
1
  import { EntryData } from '@commitspark/git-adapter'
2
- import { ApolloContext } from '../client.ts'
3
- import { GraphQLFieldResolver, GraphQLObjectType } from 'graphql'
2
+ import { GraphQLObjectType } from 'graphql'
4
3
  import { queryEveryResolver } from './resolvers/query-mutation-resolvers/query-every-resolver.ts'
5
4
  import { queryByIdResolver } from './resolvers/query-mutation-resolvers/query-by-id-resolver.ts'
6
5
  import { mutationCreateResolver } from './resolvers/query-mutation-resolvers/mutation-create-resolver.ts'
@@ -19,12 +18,12 @@ export function generateQueriesAndMutations(
19
18
  // pluralization of user-provided typeName
20
19
  const queryEveryName = `every${typeName}`
21
20
  const queryEveryString = `${queryEveryName}: [${objectType.name}!]`
22
- const queryEveryResolverFunc: GraphQLFieldResolver<
23
- any,
24
- ApolloContext,
25
- any,
26
- Promise<EntryData[]>
27
- > = (source, args, context, info) =>
21
+ const queryEveryResolverFunc: QueryMutationResolver<EntryData[]> = (
22
+ source,
23
+ args,
24
+ context,
25
+ info,
26
+ ) =>
28
27
  queryEveryResolver(source, args, { ...context, type: objectType }, info)
29
28
 
30
29
  const queryByIdName = typeName
@@ -69,7 +68,7 @@ export function generateQueriesAndMutations(
69
68
 
70
69
  const deleteMutationName = `delete${typeName}`
71
70
  const deleteMutationString = `${deleteMutationName}(id: ID!, commitMessage: String): ID`
72
- const deleteMutationResolver: QueryMutationResolver<EntryData> = (
71
+ const deleteMutationResolver: QueryMutationResolver<string> = (
73
72
  source,
74
73
  args,
75
74
  context,
@@ -112,7 +111,7 @@ export function generateQueriesAndMutations(
112
111
  })
113
112
  }
114
113
 
115
- export function generateTypeNameQuery(): GeneratedQuery<Promise<string>> {
114
+ export function generateTypeNameQuery(): GeneratedQuery {
116
115
  const entryTypeQueryName = '_typeName'
117
116
  const entryTypeQueryString = `${entryTypeQueryName}(id: ID!): String!`
118
117
 
@@ -124,15 +123,15 @@ export function generateTypeNameQuery(): GeneratedQuery<Promise<string>> {
124
123
  }
125
124
 
126
125
  export interface GeneratedSchema {
127
- queryEvery: GeneratedQuery<Promise<EntryData[]>>
128
- queryById: GeneratedQuery<Promise<EntryData>>
129
- createMutation: GeneratedQuery<Promise<EntryData>>
130
- updateMutation: GeneratedQuery<Promise<EntryData>>
131
- deleteMutation: GeneratedQuery<Promise<EntryData>>
126
+ queryEvery: GeneratedQuery
127
+ queryById: GeneratedQuery
128
+ createMutation: GeneratedQuery
129
+ updateMutation: GeneratedQuery
130
+ deleteMutation: GeneratedQuery
132
131
  }
133
132
 
134
- export interface GeneratedQuery<T> {
133
+ export interface GeneratedQuery {
135
134
  name: string
136
135
  schemaString: string
137
- resolver: GraphQLFieldResolver<any, ApolloContext, any, T>
136
+ resolver: QueryMutationResolver<EntryData | EntryData[] | string>
138
137
  }
@@ -1,13 +1,13 @@
1
- import { FieldResolver, FieldResolverContext } from './types.ts'
2
- import { GraphQLResolveInfo, isNamedType } from 'graphql'
1
+ import { FieldResolver } from './types.ts'
2
+ import { isNamedType } from 'graphql'
3
3
  import { findById } from '../../../persistence/persistence.ts'
4
4
  import { createError, ErrorCode } from '../../errors.ts'
5
5
 
6
- export const resolveEntryReference: FieldResolver<any> = async (
7
- fieldValue: any,
8
- args: any,
9
- context: FieldResolverContext,
10
- info: GraphQLResolveInfo,
6
+ export const resolveEntryReference: FieldResolver = async (
7
+ fieldValue,
8
+ args,
9
+ context,
10
+ info,
11
11
  ) => {
12
12
  void info
13
13
  if (!isNamedType(context.currentType)) {
@@ -20,6 +20,21 @@ export const resolveEntryReference: FieldResolver<any> = async (
20
20
  )
21
21
  }
22
22
 
23
+ if (
24
+ fieldValue === null ||
25
+ typeof fieldValue !== 'object' ||
26
+ !('id' in fieldValue) ||
27
+ typeof fieldValue.id !== 'string'
28
+ ) {
29
+ throw createError(
30
+ 'Expected fieldValue.id to be a string.',
31
+ ErrorCode.INTERNAL_ERROR,
32
+ {
33
+ fieldValue: fieldValue,
34
+ },
35
+ )
36
+ }
37
+
23
38
  const entry = await findById(context, fieldValue.id)
24
39
 
25
40
  return { ...entry.data, id: entry.id }
@@ -1,8 +1,6 @@
1
- import { FieldResolver, FieldResolverContext, ResolvedEntryData } from './types.ts'
2
- import { EntryData } from '@commitspark/git-adapter'
1
+ import { FieldResolver } from './types.ts'
3
2
  import {
4
3
  GraphQLNonNull,
5
- GraphQLResolveInfo,
6
4
  GraphQLUnionType,
7
5
  isListType,
8
6
  isNonNullType,
@@ -17,12 +15,12 @@ import { resolveEntryReference } from './entry-reference-resolver.ts'
17
15
  import { resolveUnionValue } from './union-value-resolver.ts'
18
16
  import { createError, ErrorCode } from '../../errors.ts'
19
17
 
20
- export const resolveFieldDefaultValue: FieldResolver<any> = async (
21
- fieldValue: any,
22
- args: any,
23
- context: FieldResolverContext,
24
- info: GraphQLResolveInfo,
25
- ): Promise<ResolvedEntryData<EntryData | EntryData[] | null>> => {
18
+ export const resolveFieldDefaultValue: FieldResolver = async (
19
+ fieldValue,
20
+ args,
21
+ context,
22
+ info,
23
+ ) => {
26
24
  if (isNonNullType(context.currentType)) {
27
25
  return resolveFieldDefaultValue(
28
26
  fieldValue,
@@ -46,7 +44,7 @@ export const resolveFieldDefaultValue: FieldResolver<any> = async (
46
44
  if (!Array.isArray(fieldValue)) {
47
45
  throw createError(
48
46
  `Expected array while resolving value for field "${info.fieldName}".`,
49
- ErrorCode.SCHEMA_DATA_MISMATCH,
47
+ ErrorCode.BAD_REPOSITORY_DATA,
50
48
  {
51
49
  fieldName: info.fieldName,
52
50
  fieldValue: fieldValue,
@@ -2,16 +2,18 @@ import { GraphQLFieldResolver, GraphQLOutputType } from 'graphql'
2
2
  import { EntryData } from '@commitspark/git-adapter'
3
3
  import { ApolloContext } from '../../../client.ts'
4
4
 
5
- export interface FieldResolverContext extends ApolloContext {
5
+ interface FieldResolverContext extends ApolloContext {
6
6
  currentType: GraphQLOutputType
7
7
  hasNonNullParent?: boolean
8
8
  }
9
9
 
10
+ type FieldResolverSource = EntryData | EntryData[]
11
+
10
12
  export type FieldResolver<
11
- TSource,
13
+ TSource = FieldResolverSource,
12
14
  TContext = FieldResolverContext,
13
- TArgs = any,
14
- TResult = Promise<ResolvedEntryData<EntryData | EntryData[] | null>>,
15
+ TArgs = Record<string, unknown>,
16
+ TResult = Promise<RecursiveArray<EntryData>>,
15
17
  > = GraphQLFieldResolver<TSource, TContext, TArgs, TResult>
16
18
 
17
- export type ResolvedEntryData<T> = T | Array<ResolvedEntryData<T>>
19
+ export type RecursiveArray<T> = T | Array<RecursiveArray<T>>
@@ -1,13 +1,11 @@
1
1
  import { EntryData } from '@commitspark/git-adapter'
2
- import { FieldResolver, ResolvedEntryData } from './types.ts'
2
+ import { FieldResolver } from './types.ts'
3
3
  import {
4
4
  getUnionTypeNameFromFieldValue,
5
5
  getUnionValue,
6
6
  } from '../../schema-utils/union-type-util.ts'
7
7
 
8
- export const resolveUnionValue: FieldResolver<any> = async (
9
- fieldValue: any,
10
- ): Promise<ResolvedEntryData<EntryData | EntryData[] | null>> => {
8
+ export const resolveUnionValue: FieldResolver = async (fieldValue) => {
11
9
  const typeName = getUnionTypeNameFromFieldValue(fieldValue)
12
10
  const unionValue = getUnionValue(fieldValue)
13
11
 
@@ -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.ts'
14
11
  import { resolveFieldDefaultValue } from './field-resolvers/field-default-value-resolver.ts'
15
- import { ApolloContext } from '../../client.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
1
  import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
- import { GraphQLFieldResolver, isObjectType } from 'graphql'
2
+ import { isObjectType } from 'graphql'
3
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.ts'
9
+ import { QueryMutationResolver } from '../types.ts'
10
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
1
  import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
- import { Entry, EntryData, EntryDraft } from '@commitspark/git-adapter'
2
+ import { Entry, EntryDraft } from '@commitspark/git-adapter'
3
3
  import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util.ts'
4
- import { GraphQLFieldResolver, isObjectType } from 'graphql'
5
- import { QueryMutationResolverContext } from '../types.ts'
4
+ import { isObjectType } from 'graphql'
5
+ import { QueryMutationResolver } from '../types.ts'
6
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,8 +1,8 @@
1
1
  import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
2
  import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util.ts'
3
- import { GraphQLFieldResolver, isObjectType } from 'graphql'
3
+ import { isObjectType } from 'graphql'
4
4
  import { EntryData, EntryDraft } from '@commitspark/git-adapter'
5
- import { QueryMutationResolverContext } from '../types.ts'
5
+ import { QueryMutationResolver } from '../types.ts'
6
6
  import { createError, ErrorCode } from '../../errors.ts'
7
7
 
8
8
  function mergeData(
@@ -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
2
  import { findByTypeId } from '../../../persistence/persistence.ts'
3
- import { GraphQLFieldResolver } from 'graphql'
4
- import { QueryMutationResolverContext } from '../types.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
2
  import { findByType } from '../../../persistence/persistence.ts'
3
- import { GraphQLFieldResolver } from 'graphql'
4
- import { QueryMutationResolverContext } from '../types.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
1
  import { getTypeById } from '../../../persistence/persistence.ts'
2
- import { GraphQLFieldResolver } from 'graphql'
3
- import { ApolloContext } from '../../../client.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.ts'
2
1
  import { getTypeById } from '../../../persistence/persistence.ts'
3
- import { GraphQLTypeResolver } from 'graphql'
4
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