@commitspark/graphql-api 0.9.4 → 0.10.0
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.
- package/CHANGELOG.md +13 -0
- package/dist/container.js +21 -13
- package/dist/container.js.map +1 -1
- package/dist/graphql/field-resolver/entry-reference-resolver.d.ts +9 -0
- package/dist/graphql/field-resolver/entry-reference-resolver.js +15 -0
- package/dist/graphql/field-resolver/entry-reference-resolver.js.map +1 -0
- package/dist/graphql/field-resolver/field-default-value-resolver.d.ts +14 -0
- package/dist/graphql/field-resolver/field-default-value-resolver.js +73 -0
- package/dist/graphql/field-resolver/field-default-value-resolver.js.map +1 -0
- package/dist/graphql/field-resolver/fieldResolver.d.ts +11 -0
- package/dist/graphql/field-resolver/fieldResolver.js +3 -0
- package/dist/graphql/field-resolver/fieldResolver.js.map +1 -0
- package/dist/graphql/field-resolver/union-value-resolver.d.ts +10 -0
- package/dist/graphql/field-resolver/union-value-resolver.js +17 -0
- package/dist/graphql/field-resolver/union-value-resolver.js.map +1 -0
- package/dist/graphql/input-type-generator.service.d.ts +3 -3
- package/dist/graphql/input-type-generator.service.js +18 -7
- package/dist/graphql/input-type-generator.service.js.map +1 -1
- package/dist/graphql/queries-mutations-generator.service.d.ts +1 -1
- package/dist/graphql/resolver-generators/mutation-create-resolver-generator.d.ts +3 -1
- package/dist/graphql/resolver-generators/mutation-create-resolver-generator.js +46 -4
- package/dist/graphql/resolver-generators/mutation-create-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/mutation-delete-resolver-generator.d.ts +3 -1
- package/dist/graphql/resolver-generators/mutation-delete-resolver-generator.js +32 -9
- package/dist/graphql/resolver-generators/mutation-delete-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/{mutation-update.resolver-generator.d.ts → mutation-update-resolver-generator.d.ts} +4 -1
- package/dist/graphql/resolver-generators/mutation-update-resolver-generator.js +53 -0
- package/dist/graphql/resolver-generators/mutation-update-resolver-generator.js.map +1 -0
- package/dist/graphql/resolver-generators/object-type-field-default-value-resolver-generator.d.ts +13 -0
- package/dist/graphql/resolver-generators/object-type-field-default-value-resolver-generator.js +58 -0
- package/dist/graphql/resolver-generators/object-type-field-default-value-resolver-generator.js.map +1 -0
- package/dist/graphql/resolver-generators/query-all-resolver-generator.js +4 -1
- package/dist/graphql/resolver-generators/query-all-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/query-by-id-resolver-generator.js +2 -1
- package/dist/graphql/resolver-generators/query-by-id-resolver-generator.js.map +1 -1
- package/dist/graphql/resolver-generators/union-type-resolver-generator.d.ts +4 -4
- package/dist/graphql/resolver-generators/union-type-resolver-generator.js +3 -3
- package/dist/graphql/resolver-generators/union-type-resolver-generator.js.map +1 -1
- package/dist/graphql/schema-analyzer.service.d.ts +1 -9
- package/dist/graphql/schema-analyzer.service.js +6 -17
- package/dist/graphql/schema-analyzer.service.js.map +1 -1
- package/dist/graphql/schema-generator.service.d.ts +3 -5
- package/dist/graphql/schema-generator.service.js +7 -12
- package/dist/graphql/schema-generator.service.js.map +1 -1
- package/dist/graphql/schema-utils/entry-reference-util.d.ts +12 -4
- package/dist/graphql/schema-utils/entry-reference-util.js +105 -21
- package/dist/graphql/schema-utils/entry-reference-util.js.map +1 -1
- package/dist/graphql/schema-utils/entry-type-util.d.ts +6 -0
- package/dist/graphql/schema-utils/entry-type-util.js +34 -0
- package/dist/graphql/schema-utils/entry-type-util.js.map +1 -0
- package/dist/graphql/schema-utils/union-type-util.d.ts +5 -0
- package/dist/graphql/schema-utils/union-type-util.js +21 -0
- package/dist/graphql/schema-utils/union-type-util.js.map +1 -0
- package/dist/persistence/persistence.service.d.ts +4 -7
- package/dist/persistence/persistence.service.js +18 -83
- package/dist/persistence/persistence.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/container.ts +29 -15
- package/src/graphql/field-resolver/entry-reference-resolver.ts +49 -0
- package/src/graphql/field-resolver/field-default-value-resolver.ts +154 -0
- package/src/graphql/field-resolver/fieldResolver.ts +19 -0
- package/src/graphql/field-resolver/union-value-resolver.ts +46 -0
- package/src/graphql/input-type-generator.service.ts +22 -8
- package/src/graphql/queries-mutations-generator.service.ts +1 -1
- package/src/graphql/resolver-generators/mutation-create-resolver-generator.ts +78 -13
- package/src/graphql/resolver-generators/mutation-delete-resolver-generator.ts +69 -21
- package/src/graphql/resolver-generators/mutation-update-resolver-generator.ts +131 -0
- package/src/graphql/resolver-generators/object-type-field-default-value-resolver-generator.ts +119 -0
- package/src/graphql/resolver-generators/query-all-resolver-generator.ts +5 -1
- package/src/graphql/resolver-generators/query-by-id-resolver-generator.ts +3 -1
- package/src/graphql/resolver-generators/union-type-resolver-generator.ts +5 -7
- package/src/graphql/schema-analyzer.service.ts +10 -24
- package/src/graphql/schema-generator.service.ts +11 -20
- package/src/graphql/schema-utils/entry-reference-util.ts +170 -30
- package/src/graphql/schema-utils/entry-type-util.ts +42 -0
- package/src/graphql/schema-utils/union-type-util.ts +23 -0
- package/src/persistence/persistence.service.ts +33 -132
- package/dist/graphql/resolver-generators/entry-reference-resolver.generator.d.ts +0 -12
- package/dist/graphql/resolver-generators/entry-reference-resolver.generator.js +0 -29
- package/dist/graphql/resolver-generators/entry-reference-resolver.generator.js.map +0 -1
- package/dist/graphql/resolver-generators/mutation-update.resolver-generator.js +0 -29
- package/dist/graphql/resolver-generators/mutation-update.resolver-generator.js.map +0 -1
- package/dist/graphql/resolver-generators/union-value-resolver-generator.d.ts +0 -13
- package/dist/graphql/resolver-generators/union-value-resolver-generator.js +0 -80
- package/dist/graphql/resolver-generators/union-value-resolver-generator.js.map +0 -1
- package/src/graphql/resolver-generators/entry-reference-resolver.generator.ts +0 -71
- package/src/graphql/resolver-generators/mutation-update.resolver-generator.ts +0 -59
- package/src/graphql/resolver-generators/union-value-resolver-generator.ts +0 -125
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { GraphQLField, GraphQLObjectType } from 'graphql'
|
|
2
|
-
import {
|
|
3
|
-
Entry,
|
|
4
|
-
PersistenceService,
|
|
5
|
-
} from '../../persistence/persistence.service'
|
|
6
|
-
import { ApolloContext } from '../../app/api.service'
|
|
7
|
-
import { GraphQLFieldResolver } from 'graphql/type/definition'
|
|
8
|
-
|
|
9
|
-
export class EntryReferenceResolverGenerator {
|
|
10
|
-
constructor(private readonly persistence: PersistenceService) {}
|
|
11
|
-
|
|
12
|
-
public createResolver(
|
|
13
|
-
context: ApolloContext,
|
|
14
|
-
obj: {
|
|
15
|
-
type: GraphQLObjectType
|
|
16
|
-
fields: GraphQLField<any, any>[]
|
|
17
|
-
},
|
|
18
|
-
): Record<
|
|
19
|
-
string,
|
|
20
|
-
GraphQLFieldResolver<
|
|
21
|
-
Record<string, any>,
|
|
22
|
-
ApolloContext,
|
|
23
|
-
any,
|
|
24
|
-
Promise<Entry | Entry[] | null>
|
|
25
|
-
>
|
|
26
|
-
> {
|
|
27
|
-
const persistence = this.persistence
|
|
28
|
-
|
|
29
|
-
const fieldResolvers: Record<
|
|
30
|
-
string,
|
|
31
|
-
GraphQLFieldResolver<
|
|
32
|
-
Record<string, any>,
|
|
33
|
-
ApolloContext,
|
|
34
|
-
any,
|
|
35
|
-
Promise<Entry | Entry[] | null>
|
|
36
|
-
>
|
|
37
|
-
> = {}
|
|
38
|
-
|
|
39
|
-
for (const field of obj.fields) {
|
|
40
|
-
const fieldName = field.name
|
|
41
|
-
fieldResolvers[fieldName] = async (
|
|
42
|
-
source,
|
|
43
|
-
args,
|
|
44
|
-
context,
|
|
45
|
-
info,
|
|
46
|
-
): Promise<Entry | Entry[] | null> => {
|
|
47
|
-
if (source[fieldName] === undefined || source[fieldName] === null) {
|
|
48
|
-
return null
|
|
49
|
-
}
|
|
50
|
-
// TODO decide this based on type definition, not data
|
|
51
|
-
if (Array.isArray(source[fieldName])) {
|
|
52
|
-
return source[fieldName].map((el: any) =>
|
|
53
|
-
persistence.findById(
|
|
54
|
-
context.gitAdapter,
|
|
55
|
-
context.getCurrentRef(),
|
|
56
|
-
el.id,
|
|
57
|
-
),
|
|
58
|
-
)
|
|
59
|
-
} else {
|
|
60
|
-
return persistence.findById(
|
|
61
|
-
context.gitAdapter,
|
|
62
|
-
context.getCurrentRef(),
|
|
63
|
-
source[fieldName].id,
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return fieldResolvers
|
|
70
|
-
}
|
|
71
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Entry,
|
|
3
|
-
PersistenceService,
|
|
4
|
-
} from '../../persistence/persistence.service'
|
|
5
|
-
import { GraphQLFieldResolver } from 'graphql/type/definition'
|
|
6
|
-
import { ApolloContext } from '../../app/api.service'
|
|
7
|
-
import { GraphQLError } from 'graphql/error/GraphQLError'
|
|
8
|
-
|
|
9
|
-
export class MutationUpdateResolverGenerator {
|
|
10
|
-
constructor(private readonly persistence: PersistenceService) {}
|
|
11
|
-
|
|
12
|
-
public createResolver(
|
|
13
|
-
typeName: string,
|
|
14
|
-
): GraphQLFieldResolver<any, ApolloContext, any, Promise<Entry>> {
|
|
15
|
-
return async (
|
|
16
|
-
source,
|
|
17
|
-
args,
|
|
18
|
-
context: ApolloContext,
|
|
19
|
-
info,
|
|
20
|
-
): Promise<Entry> => {
|
|
21
|
-
try {
|
|
22
|
-
await this.persistence.findByTypeId(
|
|
23
|
-
context.gitAdapter,
|
|
24
|
-
context.getCurrentRef(),
|
|
25
|
-
typeName,
|
|
26
|
-
args.id,
|
|
27
|
-
)
|
|
28
|
-
} catch (_) {
|
|
29
|
-
throw new GraphQLError(
|
|
30
|
-
`No entry of type "${typeName}" with id "${args.id}" exists`,
|
|
31
|
-
{
|
|
32
|
-
extensions: {
|
|
33
|
-
code: 'BAD_USER_INPUT',
|
|
34
|
-
argumentName: 'id',
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// TODO validate ID references in payload to assert referenced ID exists and points to correct entry type
|
|
41
|
-
const updateResult = await this.persistence.updateByTypeId(
|
|
42
|
-
context.gitAdapter,
|
|
43
|
-
context.branch,
|
|
44
|
-
context.getCurrentRef(),
|
|
45
|
-
typeName,
|
|
46
|
-
args.id,
|
|
47
|
-
args.data,
|
|
48
|
-
args.message,
|
|
49
|
-
)
|
|
50
|
-
context.setCurrentRef(updateResult.ref)
|
|
51
|
-
return this.persistence.findByTypeId(
|
|
52
|
-
context.gitAdapter,
|
|
53
|
-
context.getCurrentRef(),
|
|
54
|
-
typeName,
|
|
55
|
-
args.id,
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { GraphQLFieldResolver } from 'graphql/type/definition'
|
|
2
|
-
import { ApolloContext } from '../../app/api.service'
|
|
3
|
-
import { Entry } from '../../persistence/persistence.service'
|
|
4
|
-
import {
|
|
5
|
-
GraphQLField,
|
|
6
|
-
GraphQLNullableType,
|
|
7
|
-
GraphQLObjectType,
|
|
8
|
-
GraphQLSchema,
|
|
9
|
-
isListType,
|
|
10
|
-
isNonNullType,
|
|
11
|
-
isObjectType,
|
|
12
|
-
isUnionType,
|
|
13
|
-
} from 'graphql'
|
|
14
|
-
import { EntryReferenceUtil } from '../schema-utils/entry-reference-util'
|
|
15
|
-
|
|
16
|
-
export class UnionValueResolverGenerator {
|
|
17
|
-
constructor(private readonly entryReferenceUtil: EntryReferenceUtil) {}
|
|
18
|
-
|
|
19
|
-
public createResolver(
|
|
20
|
-
schema: GraphQLSchema,
|
|
21
|
-
): Record<
|
|
22
|
-
string,
|
|
23
|
-
Record<string, GraphQLFieldResolver<any, ApolloContext, any, Entry | null>>
|
|
24
|
-
> {
|
|
25
|
-
const resolvers: Record<
|
|
26
|
-
string,
|
|
27
|
-
Record<
|
|
28
|
-
string,
|
|
29
|
-
GraphQLFieldResolver<any, ApolloContext, any, Entry | null>
|
|
30
|
-
>
|
|
31
|
-
> = {}
|
|
32
|
-
for (const typeName of Object.keys(schema.getTypeMap())) {
|
|
33
|
-
const type = schema.getType(typeName)
|
|
34
|
-
if (!isObjectType(type)) {
|
|
35
|
-
continue
|
|
36
|
-
}
|
|
37
|
-
const objectType = type as GraphQLObjectType
|
|
38
|
-
const unionFieldsNotUsingEntry =
|
|
39
|
-
this.getFieldsWithUnionTypeNotUsingEntryTypes(objectType)
|
|
40
|
-
|
|
41
|
-
const fieldResolvers: Record<
|
|
42
|
-
string,
|
|
43
|
-
GraphQLFieldResolver<any, ApolloContext, any, Entry | null>
|
|
44
|
-
> = {}
|
|
45
|
-
for (const field of unionFieldsNotUsingEntry) {
|
|
46
|
-
fieldResolvers[field.name] = (
|
|
47
|
-
obj,
|
|
48
|
-
args,
|
|
49
|
-
context,
|
|
50
|
-
info,
|
|
51
|
-
): Entry | null => {
|
|
52
|
-
const fieldValue = obj[info.fieldName]
|
|
53
|
-
return this.collapseTypeField(field.type, fieldValue)
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (Object.keys(fieldResolvers).length > 0) {
|
|
58
|
-
resolvers[typeName] = fieldResolvers
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return resolvers
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
private getFieldsWithUnionTypeNotUsingEntryTypes(
|
|
66
|
-
objectType: GraphQLObjectType,
|
|
67
|
-
): GraphQLField<any, any>[] {
|
|
68
|
-
const fields = []
|
|
69
|
-
for (const fieldsKey in objectType.getFields()) {
|
|
70
|
-
const field: GraphQLField<any, any> = objectType.getFields()[fieldsKey]
|
|
71
|
-
if (
|
|
72
|
-
this.buildsOnUnionType(field.type) &&
|
|
73
|
-
!this.entryReferenceUtil.buildsOnTypeWithEntryDirective(field.type)
|
|
74
|
-
) {
|
|
75
|
-
fields.push(field)
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return fields
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private buildsOnUnionType(type: GraphQLNullableType): boolean {
|
|
82
|
-
if (isNonNullType(type)) {
|
|
83
|
-
return this.buildsOnUnionType(type.ofType)
|
|
84
|
-
} else if (isListType(type)) {
|
|
85
|
-
return this.buildsOnUnionType(type.ofType)
|
|
86
|
-
} else if (isUnionType(type)) {
|
|
87
|
-
return true
|
|
88
|
-
} else if (isObjectType(type)) {
|
|
89
|
-
return false
|
|
90
|
-
}
|
|
91
|
-
return false
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
private collapseTypeField(
|
|
95
|
-
type: GraphQLNullableType,
|
|
96
|
-
fieldValue: Record<string, any> | Record<string, any>[] | null,
|
|
97
|
-
): Record<string, any> | null {
|
|
98
|
-
if (isNonNullType(type)) {
|
|
99
|
-
return this.collapseTypeField(type.ofType, fieldValue)
|
|
100
|
-
} else if (fieldValue === null) {
|
|
101
|
-
return null
|
|
102
|
-
} else if (isListType(type)) {
|
|
103
|
-
if (!Array.isArray(fieldValue)) {
|
|
104
|
-
throw new Error('Expected array value')
|
|
105
|
-
}
|
|
106
|
-
return fieldValue.map((item) => this.collapseTypeField(type.ofType, item))
|
|
107
|
-
} else {
|
|
108
|
-
// Based on our @oneOf directive, we expect only one field whose name
|
|
109
|
-
// corresponds to the concrete type's name.
|
|
110
|
-
const firstKey = Object.keys(fieldValue)[0]
|
|
111
|
-
if (Array.isArray(fieldValue)) {
|
|
112
|
-
throw new Error('Did not expect array value')
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// We replace the above name field that nests our concrete data directly
|
|
116
|
-
// with the data and a `__typename` field, so that our output data
|
|
117
|
-
// corresponds to the output schema provided by the user (i.e. there is
|
|
118
|
-
// no additional nesting level there).
|
|
119
|
-
return {
|
|
120
|
-
...fieldValue[firstKey],
|
|
121
|
-
__typename: firstKey.slice(0, 1).toUpperCase() + firstKey.slice(1),
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|