@commitspark/graphql-api 1.0.0-beta.1 → 1.0.0-beta.3

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 (103) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +3 -3
  3. package/dist/cjs/client.js +1 -1
  4. package/dist/cjs/client.js.map +1 -1
  5. package/dist/cjs/graphql/errors.js +32 -0
  6. package/dist/cjs/graphql/errors.js.map +1 -0
  7. package/dist/cjs/graphql/queries-mutations-generator.js +10 -8
  8. package/dist/cjs/graphql/queries-mutations-generator.js.map +1 -1
  9. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js +4 -1
  10. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  11. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js +15 -3
  12. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  13. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +10 -13
  14. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  15. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +5 -6
  16. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  17. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +5 -4
  18. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  19. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/{query-all-resolver.js → query-every-resolver.js} +4 -4
  20. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -0
  21. package/dist/cjs/graphql/schema-generator.js +7 -2
  22. package/dist/cjs/graphql/schema-generator.js.map +1 -1
  23. package/dist/cjs/graphql/schema-root-type-generator.js +1 -1
  24. package/dist/cjs/graphql/schema-root-type-generator.js.map +1 -1
  25. package/dist/cjs/graphql/schema-utils/entry-reference-util.js +26 -18
  26. package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
  27. package/dist/cjs/graphql/schema-utils/union-type-util.js +9 -4
  28. package/dist/cjs/graphql/schema-utils/union-type-util.js.map +1 -1
  29. package/dist/cjs/index.js +3 -0
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/persistence/persistence.js +11 -14
  32. package/dist/cjs/persistence/persistence.js.map +1 -1
  33. package/dist/esm/client.js +1 -1
  34. package/dist/esm/client.js.map +1 -1
  35. package/dist/esm/graphql/errors.js +28 -0
  36. package/dist/esm/graphql/errors.js.map +1 -0
  37. package/dist/esm/graphql/queries-mutations-generator.js +10 -8
  38. package/dist/esm/graphql/queries-mutations-generator.js.map +1 -1
  39. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js +4 -1
  40. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  41. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js +15 -3
  42. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  43. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +11 -14
  44. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  45. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +6 -7
  46. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  47. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +5 -4
  48. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  49. package/dist/esm/graphql/resolvers/query-mutation-resolvers/{query-all-resolver.js → query-every-resolver.js} +2 -2
  50. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.js.map +1 -0
  51. package/dist/esm/graphql/schema-generator.js +7 -2
  52. package/dist/esm/graphql/schema-generator.js.map +1 -1
  53. package/dist/esm/graphql/schema-root-type-generator.js +1 -1
  54. package/dist/esm/graphql/schema-root-type-generator.js.map +1 -1
  55. package/dist/esm/graphql/schema-utils/entry-reference-util.js +27 -19
  56. package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
  57. package/dist/esm/graphql/schema-utils/union-type-util.js +9 -4
  58. package/dist/esm/graphql/schema-utils/union-type-util.js.map +1 -1
  59. package/dist/esm/index.js +2 -0
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/persistence/persistence.js +11 -14
  62. package/dist/esm/persistence/persistence.js.map +1 -1
  63. package/dist/tsconfig.build.cjs.tsbuildinfo +1 -1
  64. package/dist/tsconfig.build.esm.tsbuildinfo +1 -1
  65. package/dist/tsconfig.build.types.tsbuildinfo +1 -1
  66. package/dist/types/graphql/errors.d.ts +20 -0
  67. package/dist/types/graphql/errors.d.ts.map +1 -0
  68. package/dist/types/graphql/queries-mutations-generator.d.ts +1 -1
  69. package/dist/types/graphql/queries-mutations-generator.d.ts.map +1 -1
  70. package/dist/types/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -1
  71. package/dist/types/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -1
  72. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
  73. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
  74. package/dist/types/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
  75. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +5 -0
  76. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -0
  77. package/dist/types/graphql/schema-generator.d.ts.map +1 -1
  78. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +1 -1
  79. package/dist/types/graphql/schema-utils/union-type-util.d.ts +2 -2
  80. package/dist/types/graphql/schema-utils/union-type-util.d.ts.map +1 -1
  81. package/dist/types/index.d.ts +2 -1
  82. package/dist/types/index.d.ts.map +1 -1
  83. package/dist/types/persistence/persistence.d.ts.map +1 -1
  84. package/package.json +12 -4
  85. package/src/client.ts +1 -1
  86. package/src/graphql/errors.ts +43 -0
  87. package/src/graphql/queries-mutations-generator.ts +12 -10
  88. package/src/graphql/resolvers/field-resolvers/entry-reference-resolver.ts +8 -1
  89. package/src/graphql/resolvers/field-resolvers/field-default-value-resolver.ts +23 -5
  90. package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +22 -14
  91. package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +12 -8
  92. package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +9 -4
  93. package/src/graphql/resolvers/query-mutation-resolvers/{query-all-resolver.ts → query-every-resolver.ts} +1 -1
  94. package/src/graphql/schema-generator.ts +7 -2
  95. package/src/graphql/schema-root-type-generator.ts +1 -1
  96. package/src/graphql/schema-utils/entry-reference-util.ts +44 -22
  97. package/src/graphql/schema-utils/union-type-util.ts +20 -7
  98. package/src/index.ts +2 -1
  99. package/src/persistence/persistence.ts +13 -15
  100. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-all-resolver.js.map +0 -1
  101. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-all-resolver.js.map +0 -1
  102. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-all-resolver.d.ts +0 -5
  103. package/dist/types/graphql/resolvers/query-mutation-resolvers/query-all-resolver.d.ts.map +0 -1
@@ -1,5 +1,4 @@
1
1
  import {
2
- GraphQLError,
3
2
  GraphQLNullableType,
4
3
  GraphQLObjectType,
5
4
  isListType,
@@ -14,6 +13,7 @@ import {
14
13
  getUnionValue,
15
14
  } from './union-type-util'
16
15
  import { hasEntryDirective, isUnionOfEntryTypes } from './entry-type-util'
16
+ import { createError, ErrorCode } from '../errors'
17
17
 
18
18
  function isPermittedReferenceType(
19
19
  referencedTypeName: string,
@@ -45,7 +45,14 @@ async function validateReference(
45
45
  return
46
46
  } else if (isListType(fieldType)) {
47
47
  if (!Array.isArray(fieldValue)) {
48
- throw new Error(`Expected array value in field "${fieldName}"`)
48
+ throw createError(
49
+ `Expected array while validation references for field "${fieldName}".`,
50
+ ErrorCode.SCHEMA_DATA_MISMATCH,
51
+ {
52
+ fieldName: fieldName,
53
+ fieldValue: fieldValue,
54
+ },
55
+ )
49
56
  }
50
57
  for (const fieldListElement of fieldValue) {
51
58
  await validateReference(
@@ -58,7 +65,14 @@ async function validateReference(
58
65
  return
59
66
  } else if (isUnionType(fieldType) || isObjectType(fieldType)) {
60
67
  if (!('id' in fieldValue)) {
61
- throw new Error('Expected key "id"')
68
+ throw createError(
69
+ `Expected key "id" in data while validating reference for field "${fieldName}".`,
70
+ ErrorCode.SCHEMA_DATA_MISMATCH,
71
+ {
72
+ fieldName: fieldName,
73
+ fieldValue: fieldValue,
74
+ },
75
+ )
62
76
  }
63
77
  const referencedId = fieldValue.id
64
78
  let referencedTypeName
@@ -69,24 +83,22 @@ async function validateReference(
69
83
  referencedId,
70
84
  )
71
85
  } catch (error) {
72
- throw new GraphQLError(
73
- `Reference with id "${referencedId}" points to non-existing entry`,
86
+ throw createError(
87
+ `Failed to resolve entry reference "${referencedId}".`,
88
+ ErrorCode.BAD_USER_INPUT,
74
89
  {
75
- extensions: {
76
- code: 'BAD_USER_INPUT',
77
- fieldName: fieldName,
78
- },
90
+ fieldName: fieldName,
91
+ fieldValue: referencedId,
79
92
  },
80
93
  )
81
94
  }
82
95
  if (!isPermittedReferenceType(referencedTypeName, fieldType)) {
83
- throw new GraphQLError(
84
- `Reference with id "${referencedId}" points to entry of incompatible type`,
96
+ throw createError(
97
+ `Reference with ID "${referencedId}" points to entry of incompatible type "${referencedTypeName}".`,
98
+ ErrorCode.BAD_USER_INPUT,
85
99
  {
86
- extensions: {
87
- code: 'BAD_USER_INPUT',
88
- fieldName: fieldName,
89
- },
100
+ fieldName: fieldName,
101
+ fieldValue: referencedId,
90
102
  },
91
103
  )
92
104
  }
@@ -131,13 +143,23 @@ export async function getReferencedEntryIds(
131
143
  return [data.id]
132
144
  }
133
145
 
134
- const unionTypeName = getUnionTypeNameFromFieldValue(data)
135
- const unionType = type
146
+ const requestedUnionTypeName = getUnionTypeNameFromFieldValue(data)
147
+ const concreteFieldUnionType = type
136
148
  .getTypes()
137
- .find((type) => type.name === unionTypeName)
138
- if (!unionType) {
139
- throw new Error(
140
- `Type "${unionTypeName}" found in field data is not a valid type for union type "${type.name}".`,
149
+ .find(
150
+ (concreteFieldType) =>
151
+ concreteFieldType.name === requestedUnionTypeName,
152
+ )
153
+ if (!concreteFieldUnionType) {
154
+ throw createError(
155
+ `Type "${requestedUnionTypeName}" found in field data is not a valid type for ` +
156
+ `union type "${type.name}".`,
157
+ ErrorCode.BAD_REPOSITORY_DATA,
158
+ {
159
+ typeName: type.name,
160
+ fieldName: fieldName ? fieldName : undefined,
161
+ fieldValue: data,
162
+ },
141
163
  )
142
164
  }
143
165
  const unionValue = getUnionValue(data)
@@ -145,7 +167,7 @@ export async function getReferencedEntryIds(
145
167
  rootType,
146
168
  context,
147
169
  fieldName,
148
- unionType,
170
+ concreteFieldUnionType,
149
171
  unionValue,
150
172
  )
151
173
  } else if (isObjectType(type)) {
@@ -1,8 +1,15 @@
1
1
  import { EntryData } from '@commitspark/git-adapter'
2
+ import { createError, ErrorCode } from '../errors'
2
3
 
3
- export function getUnionTypeNameFromFieldValue(fieldValue: any): string {
4
- if (typeof fieldValue !== 'object') {
5
- throw new Error('Expected object as union value')
4
+ export function getUnionTypeNameFromFieldValue(fieldValue: unknown): string {
5
+ if (typeof fieldValue !== 'object' || fieldValue === null) {
6
+ throw createError(
7
+ `Expected object value in order to determine union type name.`,
8
+ ErrorCode.BAD_REPOSITORY_DATA,
9
+ {
10
+ fieldValue: fieldValue,
11
+ },
12
+ )
6
13
  }
7
14
 
8
15
  // Based on our @oneOf directive, we expect only one field whose name
@@ -10,11 +17,17 @@ export function getUnionTypeNameFromFieldValue(fieldValue: any): string {
10
17
  return Object.keys(fieldValue)[0]
11
18
  }
12
19
 
13
- export function getUnionValue(fieldValue: any): EntryData {
14
- if (typeof fieldValue !== 'object') {
15
- throw new Error('Expected object as union value')
20
+ export function getUnionValue(fieldValue: unknown): EntryData {
21
+ if (typeof fieldValue !== 'object' || fieldValue === null) {
22
+ throw createError(
23
+ `Expected object value in order to determine union value.`,
24
+ ErrorCode.BAD_REPOSITORY_DATA,
25
+ {
26
+ fieldValue: fieldValue,
27
+ },
28
+ )
16
29
  }
17
30
 
18
31
  const firstKey = Object.keys(fieldValue)[0]
19
- return fieldValue[firstKey]
32
+ return (fieldValue as Record<string, EntryData>)[firstKey]
20
33
  }
package/src/index.ts CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  VariableValues,
8
8
  } from './client'
9
9
  import { GitAdapter } from '@commitspark/git-adapter'
10
+ import { ErrorCode, ErrorMetadata } from './graphql/errors'
10
11
 
11
12
  interface Client {
12
13
  postGraphQL<
@@ -19,7 +20,7 @@ interface Client {
19
20
  getSchema(ref: string): Promise<SchemaResponse>
20
21
  }
21
22
 
22
- export { Client, GraphQLResponse, SchemaResponse }
23
+ export { Client, GraphQLResponse, SchemaResponse, ErrorCode, ErrorMetadata }
23
24
 
24
25
  export async function createClient(gitAdapter: GitAdapter): Promise<Client> {
25
26
  return {
@@ -1,5 +1,5 @@
1
1
  import { Entry, GitAdapter } from '@commitspark/git-adapter'
2
- import { GraphQLError } from 'graphql'
2
+ import { createError, ErrorCode } from '../graphql/errors'
3
3
 
4
4
  export async function getTypeById(
5
5
  gitAdapter: GitAdapter,
@@ -9,10 +9,9 @@ export async function getTypeById(
9
9
  const allEntries = await gitAdapter.getEntries(commitHash)
10
10
  const requestedEntry = allEntries.find((entry: Entry) => entry.id === id)
11
11
  if (requestedEntry === undefined) {
12
- throw new GraphQLError(`Not found: ${id}`, {
13
- extensions: {
14
- code: 'NOT_FOUND',
15
- },
12
+ throw createError(`No entry with id "${id}" exists.`, ErrorCode.NOT_FOUND, {
13
+ argumentName: 'id',
14
+ argumentValue: id,
16
15
  })
17
16
  }
18
17
 
@@ -27,10 +26,9 @@ export async function findById(
27
26
  const allEntries = await gitAdapter.getEntries(commitHash)
28
27
  const requestedEntry = allEntries.find((entry: Entry) => entry.id === id)
29
28
  if (requestedEntry === undefined) {
30
- throw new GraphQLError(`Not found: ${id}`, {
31
- extensions: {
32
- code: 'NOT_FOUND',
33
- },
29
+ throw createError(`No entry with id "${id}" exists.`, ErrorCode.NOT_FOUND, {
30
+ argumentName: 'id',
31
+ argumentValue: id,
34
32
  })
35
33
  }
36
34
 
@@ -57,13 +55,13 @@ export async function findByTypeId(
57
55
  (entry: Entry) => entry.id === id && entry.metadata.type === type,
58
56
  )
59
57
  if (requestedEntry === undefined) {
60
- throw new GraphQLError(
61
- `No entry of type "${type}" with id "${id}" exists`,
58
+ throw createError(
59
+ `No entry of type "${type}" with id "${id}" exists.`,
60
+ ErrorCode.NOT_FOUND,
62
61
  {
63
- extensions: {
64
- code: 'BAD_USER_INPUT',
65
- argumentName: 'id',
66
- },
62
+ typeName: type,
63
+ argumentName: 'id',
64
+ argumentValue: id,
67
65
  },
68
66
  )
69
67
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-all-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-all-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,kEAA6D;AAItD,MAAM,gBAAgB,GAKzB,CAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrC,MAAM,OAAO,GAAG,MAAM,IAAA,wBAAU,EAC9B,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,aAAa,EAAE,EACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAClB,CAAA;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,uCAAY,KAAK,CAAC,IAAI,KAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAE;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA,CAAA;AAfY,QAAA,gBAAgB,oBAe5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-all-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-all-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAI7D,MAAM,CAAC,MAAM,gBAAgB,GAKzB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrC,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,aAAa,EAAE,EACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAClB,CAAA;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1,5 +0,0 @@
1
- import { EntryData } from '@commitspark/git-adapter';
2
- import { GraphQLFieldResolver } from 'graphql';
3
- import { QueryMutationResolverContext } from '../types';
4
- export declare const queryAllResolver: GraphQLFieldResolver<any, QueryMutationResolverContext, any, Promise<EntryData[]>>;
5
- //# sourceMappingURL=query-all-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-all-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-all-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAA;AAEvD,eAAO,MAAM,gBAAgB,EAAE,oBAAoB,CACjD,GAAG,EACH,4BAA4B,EAC5B,GAAG,EACH,OAAO,CAAC,SAAS,EAAE,CAAC,CAWrB,CAAA"}