@commitspark/graphql-api 2.0.0-beta.3 → 2.0.0-beta.4
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 +26 -0
- package/README.md +19 -9
- package/dist/cjs/client.d.ts +1 -0
- package/dist/cjs/graphql/apollo-config-factory.d.ts +1 -0
- package/dist/cjs/graphql/errors.d.ts +1 -0
- package/dist/cjs/graphql/input-type-generator.d.ts +1 -0
- package/dist/{types → cjs}/graphql/input-type-generator.d.ts.map +1 -1
- package/dist/cjs/graphql/input-type-generator.js.map +1 -1
- package/dist/cjs/graphql/queries-mutations-generator.d.ts +10 -1
- package/dist/cjs/graphql/queries-mutations-generator.d.ts.map +1 -0
- package/dist/cjs/graphql/queries-mutations-generator.js +14 -0
- package/dist/cjs/graphql/queries-mutations-generator.js.map +1 -1
- package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts +3 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts.map +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.js +7 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.js.map +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/types.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +1 -0
- package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +8 -23
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +1 -0
- package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +4 -21
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +1 -0
- package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +9 -33
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +1 -0
- package/dist/cjs/graphql/resolvers/types.d.ts +5 -1
- package/dist/cjs/graphql/resolvers/types.d.ts.map +1 -0
- package/dist/cjs/graphql/schema-analyzer.d.ts +1 -0
- package/dist/cjs/graphql/schema-generator.d.ts +1 -0
- package/dist/cjs/graphql/schema-generator.d.ts.map +1 -0
- package/dist/cjs/graphql/schema-generator.js +10 -0
- package/dist/cjs/graphql/schema-generator.js.map +1 -1
- package/dist/cjs/graphql/schema-root-type-generator.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/directive-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts +5 -2
- package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts.map +1 -0
- package/dist/cjs/graphql/schema-utils/entry-reference-util.js +93 -120
- package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
- package/dist/cjs/graphql/schema-utils/entry-type-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/searchable-field-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-utils/union-type-util.d.ts +1 -0
- package/dist/cjs/graphql/schema-validator.d.ts +1 -0
- package/dist/cjs/graphql/util.d.ts +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/persistence/cache.d.ts +2 -2
- package/dist/cjs/persistence/cache.d.ts.map +1 -0
- package/dist/cjs/persistence/persistence.d.ts +1 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/graphql/apollo-config-factory.d.ts.map +1 -0
- package/dist/esm/graphql/errors.d.ts.map +1 -0
- package/dist/esm/graphql/input-type-generator.d.ts.map +1 -0
- package/dist/esm/graphql/input-type-generator.js.map +1 -1
- package/dist/{types → esm}/graphql/queries-mutations-generator.d.ts +9 -1
- package/dist/esm/graphql/queries-mutations-generator.d.ts.map +1 -0
- package/dist/esm/graphql/queries-mutations-generator.js +13 -0
- package/dist/esm/graphql/queries-mutations-generator.js.map +1 -1
- package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts +3 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.js +3 -0
- package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.js.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/types.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +10 -25
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +6 -23
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +11 -35
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +1 -0
- package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +1 -0
- package/dist/{types → esm}/graphql/resolvers/types.d.ts +4 -1
- package/dist/esm/graphql/resolvers/types.d.ts.map +1 -0
- package/dist/esm/graphql/schema-analyzer.d.ts.map +1 -0
- package/dist/esm/graphql/schema-generator.d.ts.map +1 -0
- package/dist/esm/graphql/schema-generator.js +11 -1
- package/dist/esm/graphql/schema-generator.js.map +1 -1
- package/dist/esm/graphql/schema-root-type-generator.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/directive-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/entry-reference-util.d.ts +6 -0
- package/dist/esm/graphql/schema-utils/entry-reference-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/entry-reference-util.js +91 -119
- package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
- package/dist/esm/graphql/schema-utils/entry-type-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/searchable-field-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-utils/union-type-util.d.ts.map +1 -0
- package/dist/esm/graphql/schema-validator.d.ts.map +1 -0
- package/dist/esm/graphql/util.d.ts.map +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/{types → esm}/persistence/cache.d.ts +1 -2
- package/dist/esm/persistence/cache.d.ts.map +1 -0
- package/dist/esm/persistence/persistence.d.ts.map +1 -0
- package/package.json +21 -15
- package/src/graphql/input-type-generator.ts +1 -3
- package/src/graphql/queries-mutations-generator.ts +25 -0
- package/src/graphql/resolvers/field-resolvers/referenced-by-resolver.ts +9 -0
- package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +9 -34
- package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +9 -38
- package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +12 -60
- package/src/graphql/resolvers/types.ts +8 -1
- package/src/graphql/schema-generator.ts +15 -0
- package/src/graphql/schema-utils/entry-reference-util.ts +147 -191
- package/src/persistence/cache.ts +1 -1
- package/dist/types/graphql/queries-mutations-generator.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/types.d.ts.map +0 -1
- package/dist/types/graphql/schema-generator.d.ts.map +0 -1
- package/dist/types/graphql/schema-utils/entry-reference-util.d.ts +0 -4
- package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +0 -1
- package/dist/types/persistence/cache.d.ts.map +0 -1
- /package/dist/{types → cjs}/client.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/apollo-config-factory.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/errors.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/types.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-analyzer.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-root-type-generator.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/directive-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/entry-type-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/searchable-field-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-utils/union-type-util.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/schema-validator.d.ts.map +0 -0
- /package/dist/{types → cjs}/graphql/util.d.ts.map +0 -0
- /package/dist/{types → cjs}/index.d.ts.map +0 -0
- /package/dist/{types → cjs}/persistence/persistence.d.ts.map +0 -0
- /package/dist/{types → esm}/client.d.ts +0 -0
- /package/dist/{types → esm}/graphql/apollo-config-factory.d.ts +0 -0
- /package/dist/{types → esm}/graphql/errors.d.ts +0 -0
- /package/dist/{types → esm}/graphql/input-type-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/types.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-analyzer.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-root-type-generator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/directive-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/entry-type-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/searchable-field-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-utils/union-type-util.d.ts +0 -0
- /package/dist/{types → esm}/graphql/schema-validator.d.ts +0 -0
- /package/dist/{types → esm}/graphql/util.d.ts +0 -0
- /package/dist/{types → esm}/index.d.ts +0 -0
- /package/dist/{types → esm}/persistence/persistence.d.ts +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GraphQLNullableType,
|
|
3
3
|
GraphQLObjectType,
|
|
4
|
+
GraphQLSchema,
|
|
4
5
|
GraphQLUnionType,
|
|
5
6
|
isListType,
|
|
6
7
|
isNonNullType,
|
|
@@ -10,6 +11,7 @@ import {
|
|
|
10
11
|
} from 'graphql'
|
|
11
12
|
import { ApolloContext } from '../../client.ts'
|
|
12
13
|
import { getTypeById } from '../../persistence/persistence.ts'
|
|
14
|
+
import { EntriesRecord } from '../../persistence/cache.ts'
|
|
13
15
|
import {
|
|
14
16
|
getUnionTypeNameFromFieldValue,
|
|
15
17
|
getUnionValue,
|
|
@@ -20,173 +22,172 @@ import { createError, ErrorCode } from '../errors.ts'
|
|
|
20
22
|
import { EntryData } from '@commitspark/git-adapter'
|
|
21
23
|
import { isEntryData } from '../util.ts'
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (isNonNullType(fieldType)) {
|
|
28
|
-
return isPermittedReferenceType(referencedTypeName, fieldType.ofType)
|
|
29
|
-
} else if (isListType(fieldType)) {
|
|
30
|
-
return isPermittedReferenceType(referencedTypeName, fieldType.ofType)
|
|
31
|
-
} else if (isUnionType(fieldType)) {
|
|
32
|
-
return fieldType
|
|
33
|
-
.getTypes()
|
|
34
|
-
.map((concreteType) => concreteType.name)
|
|
35
|
-
.includes(referencedTypeName)
|
|
36
|
-
} else if (isObjectType(fieldType)) {
|
|
37
|
-
return fieldType.name === referencedTypeName
|
|
38
|
-
}
|
|
39
|
-
return false
|
|
25
|
+
interface EntryReference {
|
|
26
|
+
id: string
|
|
27
|
+
fieldName: string
|
|
28
|
+
fieldType: GraphQLObjectType | GraphQLUnionType
|
|
40
29
|
}
|
|
41
30
|
|
|
42
|
-
|
|
31
|
+
type ReferencedByIndex = Map<string, string[]>
|
|
32
|
+
|
|
33
|
+
// commits are immutable, so an index built from the cached entries of a commit stays valid for as long as these
|
|
34
|
+
// entries remain cached
|
|
35
|
+
const referencedByIndexes = new WeakMap<EntriesRecord, ReferencedByIndex>()
|
|
36
|
+
|
|
37
|
+
export async function validateEntryReferences(
|
|
38
|
+
entryType: GraphQLObjectType,
|
|
43
39
|
context: ApolloContext,
|
|
44
|
-
|
|
45
|
-
fieldType: GraphQLNullableType,
|
|
46
|
-
fieldValue: EntryData,
|
|
40
|
+
data: EntryData,
|
|
47
41
|
): Promise<void> {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (isListType(fieldType)) {
|
|
54
|
-
if (!Array.isArray(fieldValue)) {
|
|
42
|
+
for (const reference of getEntryReferences(entryType, data)) {
|
|
43
|
+
let referencedTypeName
|
|
44
|
+
try {
|
|
45
|
+
referencedTypeName = await getTypeById(context, reference.id)
|
|
46
|
+
} catch {
|
|
55
47
|
throw createError(
|
|
56
|
-
`
|
|
57
|
-
ErrorCode.
|
|
48
|
+
`Failed to resolve entry reference "${reference.id}".`,
|
|
49
|
+
ErrorCode.BAD_USER_INPUT,
|
|
58
50
|
{
|
|
59
|
-
fieldName: fieldName,
|
|
60
|
-
fieldValue:
|
|
51
|
+
fieldName: reference.fieldName,
|
|
52
|
+
fieldValue: reference.id,
|
|
61
53
|
},
|
|
62
54
|
)
|
|
63
55
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
56
|
+
if (!isPermittedReferenceType(referencedTypeName, reference.fieldType)) {
|
|
57
|
+
throw createError(
|
|
58
|
+
`Reference with ID "${reference.id}" points to entry of incompatible type "${referencedTypeName}".`,
|
|
59
|
+
ErrorCode.BAD_USER_INPUT,
|
|
60
|
+
{
|
|
61
|
+
fieldName: reference.fieldName,
|
|
62
|
+
fieldValue: reference.id,
|
|
63
|
+
},
|
|
70
64
|
)
|
|
71
65
|
}
|
|
72
|
-
return
|
|
73
66
|
}
|
|
67
|
+
}
|
|
74
68
|
|
|
75
|
-
|
|
69
|
+
export async function getReferencingEntryIds(
|
|
70
|
+
context: ApolloContext,
|
|
71
|
+
schema: GraphQLSchema,
|
|
72
|
+
id: string,
|
|
73
|
+
): Promise<string[]> {
|
|
74
|
+
const entriesRecord = await context.repositoryCache.getEntriesRecord(
|
|
75
|
+
context,
|
|
76
|
+
context.getCurrentHash(),
|
|
77
|
+
)
|
|
78
|
+
let referencedByIndex = referencedByIndexes.get(entriesRecord)
|
|
79
|
+
if (referencedByIndex === undefined) {
|
|
80
|
+
referencedByIndex = buildReferencedByIndex(schema, entriesRecord)
|
|
81
|
+
referencedByIndexes.set(entriesRecord, referencedByIndex)
|
|
82
|
+
}
|
|
83
|
+
return referencedByIndex.get(id) ?? []
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function buildReferencedByIndex(
|
|
87
|
+
schema: GraphQLSchema,
|
|
88
|
+
entriesRecord: EntriesRecord,
|
|
89
|
+
): ReferencedByIndex {
|
|
90
|
+
const referencedByIndex: ReferencedByIndex = new Map()
|
|
91
|
+
for (const entry of entriesRecord.byId.values()) {
|
|
92
|
+
const entryType = schema.getType(entry.metadata.type)
|
|
76
93
|
if (
|
|
77
|
-
|
|
78
|
-
!(
|
|
79
|
-
typeof fieldValue.id !== 'string'
|
|
94
|
+
!isObjectType(entryType) ||
|
|
95
|
+
!hasDirective(entryType, ENTRY_DIRECTIVE_NAME)
|
|
80
96
|
) {
|
|
81
97
|
throw createError(
|
|
82
|
-
`
|
|
98
|
+
`Entry "${entry.id}" is of type "${entry.metadata.type}", which is not a type with directive ` +
|
|
99
|
+
`@${ENTRY_DIRECTIVE_NAME} in the schema.`,
|
|
83
100
|
ErrorCode.BAD_REPOSITORY_DATA,
|
|
84
101
|
{
|
|
85
|
-
|
|
86
|
-
fieldValue:
|
|
102
|
+
typeName: entry.metadata.type,
|
|
103
|
+
fieldValue: entry.id,
|
|
87
104
|
},
|
|
88
105
|
)
|
|
89
106
|
}
|
|
90
107
|
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
fieldName: fieldName,
|
|
101
|
-
fieldValue: referencedId,
|
|
102
|
-
},
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
if (!isPermittedReferenceType(referencedTypeName, fieldType)) {
|
|
106
|
-
throw createError(
|
|
107
|
-
`Reference with ID "${referencedId}" points to entry of incompatible type "${referencedTypeName}".`,
|
|
108
|
-
ErrorCode.BAD_USER_INPUT,
|
|
109
|
-
{
|
|
110
|
-
fieldName: fieldName,
|
|
111
|
-
fieldValue: referencedId,
|
|
112
|
-
},
|
|
113
|
-
)
|
|
108
|
+
const referencedIds = new Set(
|
|
109
|
+
getEntryReferences(entryType, entry.data ?? null).map(
|
|
110
|
+
(reference) => reference.id,
|
|
111
|
+
),
|
|
112
|
+
)
|
|
113
|
+
for (const referencedId of referencedIds) {
|
|
114
|
+
const referencingIds = referencedByIndex.get(referencedId) ?? []
|
|
115
|
+
referencingIds.push(entry.id)
|
|
116
|
+
referencedByIndex.set(referencedId, referencingIds)
|
|
114
117
|
}
|
|
115
118
|
}
|
|
119
|
+
|
|
120
|
+
for (const referencingIds of referencedByIndex.values()) {
|
|
121
|
+
referencingIds.sort()
|
|
122
|
+
}
|
|
123
|
+
return referencedByIndex
|
|
116
124
|
}
|
|
117
125
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
126
|
+
function getEntryReferences(
|
|
127
|
+
entryType: GraphQLObjectType,
|
|
128
|
+
data: EntryData,
|
|
129
|
+
): EntryReference[] {
|
|
130
|
+
// the fields of the entry itself are traversed directly, so that any nested @Entry type is treated as reference,
|
|
131
|
+
// including references to entries of the same type
|
|
132
|
+
return getReferencesInObjectFields(entryType, data)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function getReferencesInObjectFields(
|
|
136
|
+
type: GraphQLObjectType,
|
|
137
|
+
data: unknown,
|
|
138
|
+
): EntryReference[] {
|
|
139
|
+
if (data === null || data === undefined) {
|
|
140
|
+
return []
|
|
141
|
+
}
|
|
142
|
+
// expect our object type to hold EntryData (i.e. an object)
|
|
143
|
+
if (!isEntryData(data) || data === null) {
|
|
144
|
+
throw createError(
|
|
145
|
+
`Expected object as data for type "${type.name}".`,
|
|
146
|
+
ErrorCode.BAD_REPOSITORY_DATA,
|
|
147
|
+
{
|
|
148
|
+
typeName: type.name,
|
|
149
|
+
fieldValue: data,
|
|
150
|
+
},
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return Object.entries(type.getFields()).flatMap(([fieldName, field]) =>
|
|
155
|
+
getReferencesInField(fieldName, field.type, data[fieldName]),
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function getReferencesInField(
|
|
160
|
+
fieldName: string,
|
|
122
161
|
type: GraphQLNullableType,
|
|
123
162
|
data: unknown,
|
|
124
|
-
):
|
|
163
|
+
): EntryReference[] {
|
|
125
164
|
if (data === null || data === undefined || isScalarType(type)) {
|
|
126
165
|
return []
|
|
127
166
|
}
|
|
128
167
|
|
|
129
168
|
if (isNonNullType(type)) {
|
|
130
|
-
return
|
|
131
|
-
rootType,
|
|
132
|
-
context,
|
|
133
|
-
fieldName,
|
|
134
|
-
type.ofType,
|
|
135
|
-
data,
|
|
136
|
-
)
|
|
169
|
+
return getReferencesInField(fieldName, type.ofType, data)
|
|
137
170
|
}
|
|
138
171
|
|
|
139
172
|
if (isListType(type)) {
|
|
140
173
|
if (!Array.isArray(data)) {
|
|
141
174
|
throw createError(
|
|
142
|
-
`Expected array as data for field "${fieldName}"
|
|
175
|
+
`Expected array as data for field "${fieldName}".`,
|
|
143
176
|
ErrorCode.BAD_REPOSITORY_DATA,
|
|
144
177
|
{
|
|
145
|
-
fieldName: fieldName
|
|
178
|
+
fieldName: fieldName,
|
|
146
179
|
fieldValue: data,
|
|
147
180
|
},
|
|
148
181
|
)
|
|
149
182
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
referencedEntryIds = [
|
|
154
|
-
...referencedEntryIds,
|
|
155
|
-
...(await getReferencedEntryIds(
|
|
156
|
-
rootType,
|
|
157
|
-
context,
|
|
158
|
-
fieldName,
|
|
159
|
-
type.ofType,
|
|
160
|
-
element,
|
|
161
|
-
)),
|
|
162
|
-
]
|
|
163
|
-
}
|
|
164
|
-
// deduplicate
|
|
165
|
-
referencedEntryIds = [...new Set(referencedEntryIds)]
|
|
166
|
-
return referencedEntryIds
|
|
183
|
+
return data.flatMap((element) =>
|
|
184
|
+
getReferencesInField(fieldName, type.ofType, element),
|
|
185
|
+
)
|
|
167
186
|
}
|
|
168
187
|
|
|
169
188
|
if (isUnionType(type)) {
|
|
170
|
-
if (!isEntryData(data)) {
|
|
171
|
-
throw createError(
|
|
172
|
-
`Expected object as data for type "${type.name}".`,
|
|
173
|
-
ErrorCode.BAD_REPOSITORY_DATA,
|
|
174
|
-
{
|
|
175
|
-
typeName: type.name,
|
|
176
|
-
fieldName: fieldName ? fieldName : undefined,
|
|
177
|
-
fieldValue: data,
|
|
178
|
-
},
|
|
179
|
-
)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
189
|
if (isUnionOfEntryTypes(type)) {
|
|
183
|
-
|
|
184
|
-
context,
|
|
185
|
-
fieldName,
|
|
186
|
-
type,
|
|
187
|
-
data,
|
|
188
|
-
)
|
|
189
|
-
return [referenceId]
|
|
190
|
+
return [createEntryReference(fieldName, type, data)]
|
|
190
191
|
}
|
|
191
192
|
|
|
192
193
|
const requestedUnionTypeName = getUnionTypeNameFromFieldValue(data)
|
|
@@ -203,104 +204,59 @@ export async function getReferencedEntryIds(
|
|
|
203
204
|
ErrorCode.BAD_REPOSITORY_DATA,
|
|
204
205
|
{
|
|
205
206
|
typeName: type.name,
|
|
206
|
-
fieldName: fieldName
|
|
207
|
+
fieldName: fieldName,
|
|
207
208
|
fieldValue: data,
|
|
208
209
|
},
|
|
209
210
|
)
|
|
210
211
|
}
|
|
211
|
-
|
|
212
|
-
return getReferencedEntryIds(
|
|
213
|
-
rootType,
|
|
214
|
-
context,
|
|
215
|
-
fieldName,
|
|
212
|
+
return getReferencesInObjectFields(
|
|
216
213
|
concreteFieldUnionType,
|
|
217
|
-
|
|
214
|
+
getUnionValue(data),
|
|
218
215
|
)
|
|
219
216
|
}
|
|
220
217
|
|
|
221
218
|
if (isObjectType(type)) {
|
|
222
|
-
if (
|
|
223
|
-
|
|
224
|
-
hasDirective(type, ENTRY_DIRECTIVE_NAME)
|
|
225
|
-
) {
|
|
226
|
-
const referenceId = await getValidatedReferenceId(
|
|
227
|
-
context,
|
|
228
|
-
fieldName,
|
|
229
|
-
type,
|
|
230
|
-
data,
|
|
231
|
-
)
|
|
232
|
-
return [referenceId]
|
|
233
|
-
} else {
|
|
234
|
-
let referencedEntryIds: string[] = []
|
|
235
|
-
for (const [fieldsKey, field] of Object.entries(type.getFields())) {
|
|
236
|
-
// expect our object type to hold EntryData (i.e. an object)
|
|
237
|
-
if (Array.isArray(data) || !isEntryData(data)) {
|
|
238
|
-
throw createError(
|
|
239
|
-
`Expected object as data for type "${type.name}".`,
|
|
240
|
-
ErrorCode.BAD_REPOSITORY_DATA,
|
|
241
|
-
{
|
|
242
|
-
typeName: type.name,
|
|
243
|
-
fieldName: field.name ? field.name : undefined,
|
|
244
|
-
},
|
|
245
|
-
)
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
// recursively get referenced IDs in nested data
|
|
249
|
-
const nestedResult = await getReferencedEntryIds(
|
|
250
|
-
rootType,
|
|
251
|
-
context,
|
|
252
|
-
fieldsKey,
|
|
253
|
-
field.type,
|
|
254
|
-
data[fieldsKey],
|
|
255
|
-
)
|
|
256
|
-
referencedEntryIds = [...referencedEntryIds, ...nestedResult]
|
|
257
|
-
}
|
|
258
|
-
// deduplicate
|
|
259
|
-
referencedEntryIds = [...new Set(referencedEntryIds)]
|
|
260
|
-
return referencedEntryIds
|
|
219
|
+
if (hasDirective(type, ENTRY_DIRECTIVE_NAME)) {
|
|
220
|
+
return [createEntryReference(fieldName, type, data)]
|
|
261
221
|
}
|
|
222
|
+
return getReferencesInObjectFields(type, data)
|
|
262
223
|
}
|
|
263
224
|
|
|
264
225
|
return []
|
|
265
226
|
}
|
|
266
227
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
type: GraphQLUnionType | GraphQLObjectType,
|
|
228
|
+
function createEntryReference(
|
|
229
|
+
fieldName: string,
|
|
230
|
+
fieldType: GraphQLObjectType | GraphQLUnionType,
|
|
271
231
|
data: unknown,
|
|
272
|
-
):
|
|
232
|
+
): EntryReference {
|
|
273
233
|
if (
|
|
234
|
+
typeof data !== 'object' ||
|
|
274
235
|
data === null ||
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
Array.isArray(data)
|
|
236
|
+
!('id' in data) ||
|
|
237
|
+
typeof data.id !== 'string'
|
|
278
238
|
) {
|
|
279
239
|
throw createError(
|
|
280
|
-
`Expected
|
|
240
|
+
`Expected key "id" with value of type string in data of field "${fieldName}" of type "${fieldType.name}".`,
|
|
281
241
|
ErrorCode.BAD_REPOSITORY_DATA,
|
|
282
242
|
{
|
|
283
|
-
typeName:
|
|
284
|
-
fieldName: fieldName
|
|
243
|
+
typeName: fieldType.name,
|
|
244
|
+
fieldName: fieldName,
|
|
285
245
|
fieldValue: data,
|
|
286
246
|
},
|
|
287
247
|
)
|
|
288
248
|
}
|
|
289
|
-
|
|
249
|
+
return { id: data.id, fieldName, fieldType }
|
|
250
|
+
}
|
|
290
251
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
fieldName: fieldName ? fieldName : undefined,
|
|
300
|
-
fieldValue: data,
|
|
301
|
-
},
|
|
302
|
-
)
|
|
252
|
+
function isPermittedReferenceType(
|
|
253
|
+
referencedTypeName: string,
|
|
254
|
+
fieldType: GraphQLObjectType | GraphQLUnionType,
|
|
255
|
+
): boolean {
|
|
256
|
+
if (isUnionType(fieldType)) {
|
|
257
|
+
return fieldType
|
|
258
|
+
.getTypes()
|
|
259
|
+
.some((concreteType) => concreteType.name === referencedTypeName)
|
|
303
260
|
}
|
|
304
|
-
|
|
305
|
-
return referencedId
|
|
261
|
+
return fieldType.name === referencedTypeName
|
|
306
262
|
}
|
package/src/persistence/cache.ts
CHANGED
|
@@ -11,7 +11,7 @@ type ContentCache = Map<ContentHash, EntryContent>
|
|
|
11
11
|
type SchemaCache = Map<Ref, string>
|
|
12
12
|
type InflightEntries = Map<Ref, Promise<EntriesRecord>>
|
|
13
13
|
|
|
14
|
-
interface EntriesRecord {
|
|
14
|
+
export interface EntriesRecord {
|
|
15
15
|
byId: Map<string, Entry>
|
|
16
16
|
byType: Map<string, Entry[]>
|
|
17
17
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queries-mutations-generator.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries-mutations-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAQ3C,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,sBAAsB,CAAA;AAE7B,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,iBAAiB,EAAE,GACvC,eAAe,EAAE,CAmGnB;AAED,wBAAgB,qBAAqB,IAAI,cAAc,CAStD;AAED,wBAAgB,mBAAmB,IAAI,oBAAoB,CAiB1D;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,QAAQ,EAAE,mBAAmB,CAAA;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,cAAc,CAAA;IACzB,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,qBAAqB,CAAC,SAAS,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,CAAA;CAClE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/graphql/resolvers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,WAAW,4BAA6B,SAAQ,aAAa;IACjE,IAAI,EAAE,gBAAgB,CAAA;CACvB;AAED,MAAM,MAAM,qBAAqB,CAAC,UAAU,IAAI,oBAAoB,CAClE,OAAO,EACP,4BAA4B,EAC5B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EACvD,OAAO,CAAC,UAAU,CAAC,CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CACjD,2BAA2B,EAC3B,aAAa,CACd,CAAA;AAED,KAAK,2BAA2B,GAAG,SAAS,GAAG;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CACpD,OAAO,EACP,aAAa,EACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjE,OAAO,CAAC,SAAS,EAAE,CAAC,CACrB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,CACzD,SAAS,EACT,aAAa,EACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CACnC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-generator.d.ts","sourceRoot":"","sources":["../../../src/graphql/schema-generator.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,2BAA2B,EAE5B,MAAM,uBAAuB,CAAA;AAU9B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAc5C,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,2BAA2B,CAAC,CAqItC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { GraphQLNullableType, GraphQLObjectType } from 'graphql';
|
|
2
|
-
import { ApolloContext } from '../../client.ts';
|
|
3
|
-
export declare function getReferencedEntryIds(rootType: GraphQLObjectType, context: ApolloContext, fieldName: string | null, type: GraphQLNullableType, data: unknown): Promise<string[]>;
|
|
4
|
-
//# sourceMappingURL=entry-reference-util.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;AA2G/C,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CA6InB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/persistence/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAmB,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAY5C,UAAU,aAAa;IACrB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;CAC7B;AAOD,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,CAChB,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,KACR,OAAO,CAAC,aAAa,CAAC,CAAA;IAC3B,SAAS,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACpE;AA+LD,eAAO,MAAM,kBAAkB,GAC7B,YAAW,MAA0B,KACpC,sBAoBF,CAAA"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{types → cjs}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map
RENAMED
|
File without changes
|
/package/dist/{types → cjs}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map
RENAMED
|
File without changes
|
/package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts
RENAMED
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts
RENAMED
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts
RENAMED
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts
RENAMED
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts
RENAMED
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|