@commitspark/graphql-api 2.0.0-beta.2 → 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 +30 -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 +25 -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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-create-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,EAGV,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAGnD,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,CAAC,SAAS,CAgEnE,CAAA"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { findById, findByTypeId } from "../../../persistence/persistence.js";
|
|
2
2
|
import { isObjectType } from 'graphql';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { validateEntryReferences } from "../../schema-utils/entry-reference-util.js";
|
|
4
|
+
import { validateEntryId, } from '@commitspark/git-adapter';
|
|
5
5
|
import { createError } from "../../errors.js";
|
|
6
6
|
export const mutationCreateResolver = async (source, args, context, info) => {
|
|
7
|
+
void info;
|
|
7
8
|
if (!isObjectType(context.type)) {
|
|
8
9
|
throw createError(`Entry of type "${context.type.name}" cannot be created as is not an ObjectType.`, "INTERNAL_ERROR" /* ErrorCode.INTERNAL_ERROR */, {});
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
try {
|
|
12
|
+
validateEntryId(args.id);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
throw createError(err instanceof Error ? err.message : String(err), "BAD_USER_INPUT" /* ErrorCode.BAD_USER_INPUT */, {
|
|
13
16
|
argumentName: 'id',
|
|
14
17
|
argumentValue: args.id,
|
|
15
18
|
});
|
|
@@ -25,29 +28,11 @@ export const mutationCreateResolver = async (source, args, context, info) => {
|
|
|
25
28
|
argumentValue: args.id,
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
|
-
|
|
29
|
-
const referencedEntryUpdates = [];
|
|
30
|
-
for (const referencedEntryId of referencedEntryIds) {
|
|
31
|
-
const referencedEntry = await findById(context, referencedEntryId);
|
|
32
|
-
const newReferencedEntryIds = [
|
|
33
|
-
...(referencedEntry.metadata.referencedBy ?? []),
|
|
34
|
-
args.id,
|
|
35
|
-
].sort();
|
|
36
|
-
const newReferencedEntryDraft = {
|
|
37
|
-
...referencedEntry,
|
|
38
|
-
metadata: {
|
|
39
|
-
...referencedEntry.metadata,
|
|
40
|
-
referencedBy: newReferencedEntryIds,
|
|
41
|
-
},
|
|
42
|
-
deletion: false,
|
|
43
|
-
};
|
|
44
|
-
referencedEntryUpdates.push(newReferencedEntryDraft);
|
|
45
|
-
}
|
|
31
|
+
await validateEntryReferences(context.type, context, args.data ?? null);
|
|
46
32
|
const newEntryDraft = {
|
|
47
33
|
id: args.id,
|
|
48
34
|
metadata: {
|
|
49
35
|
type: context.type.name,
|
|
50
|
-
referencedBy: [],
|
|
51
36
|
},
|
|
52
37
|
data: args.data ?? null,
|
|
53
38
|
deletion: false,
|
|
@@ -55,7 +40,7 @@ export const mutationCreateResolver = async (source, args, context, info) => {
|
|
|
55
40
|
const commit = await context.gitAdapter.createCommit({
|
|
56
41
|
ref: context.branch,
|
|
57
42
|
parentSha: context.getCurrentHash(),
|
|
58
|
-
entries: [newEntryDraft
|
|
43
|
+
entries: [newEntryDraft],
|
|
59
44
|
message: args.commitMessage,
|
|
60
45
|
});
|
|
61
46
|
context.setCurrentHash(commit.commitHash);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation-create-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mutation-create-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAA;AACpF,OAAO,EAGL,eAAe,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAa,MAAM,iBAAiB,CAAA;AAExD,MAAM,CAAC,MAAM,sBAAsB,GAAqC,KAAK,EAC3E,MAAM,EACN,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,EAAE;IACF,KAAK,IAAI,CAAA;IACT,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,WAAW,CACf,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,8CAA8C,mDAEjF,EAAE,CACH,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,WAAW,CACf,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,mDAEhD;YACE,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI,CAAC,EAAE;SACvB,CACF,CAAA;IACH,CAAC;IAED,IAAI,aAAa,CAAA;IACjB,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IAClD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,WAAW,CACf,qBAAqB,IAAI,CAAC,EAAE,mBAAmB,mDAE/C;YACE,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI,CAAC,EAAE;SACvB,CACF,CAAA;IACH,CAAC;IAED,MAAM,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;IAEvE,MAAM,aAAa,GAAe;QAChC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE;YACR,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;SACxB;QACD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,QAAQ,EAAE,KAAK;KAChB,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;QACnD,GAAG,EAAE,OAAO,CAAC,MAAM;QACnB,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE;QACnC,OAAO,EAAE,CAAC,aAAa,CAAC;QACxB,OAAO,EAAE,IAAI,CAAC,aAAa;KAC5B,CAAC,CAAA;IACF,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEzC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IACxE,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAA;AAC9C,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-delete-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAGnD,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,CAAC,MAAM,CAwChE,CAAA"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { isObjectType } from 'graphql';
|
|
1
|
+
import { findByTypeId } from "../../../persistence/persistence.js";
|
|
2
|
+
import { getReferencingEntryIds } from "../../schema-utils/entry-reference-util.js";
|
|
4
3
|
import { createError } from "../../errors.js";
|
|
5
4
|
export const mutationDeleteResolver = async (source, args, context, info) => {
|
|
6
5
|
const entry = await findByTypeId(context, context.type.name, args.id);
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
// references held by the entry itself are deleted together with the entry
|
|
7
|
+
const otherReferencingIds = (await getReferencingEntryIds(context, info.schema, args.id)).filter((referencingId) => referencingId !== args.id);
|
|
8
|
+
if (otherReferencingIds.length > 0) {
|
|
9
|
+
const otherIds = otherReferencingIds
|
|
9
10
|
.map((referenceId) => `"${referenceId}"`)
|
|
10
11
|
.join(', ');
|
|
11
12
|
throw createError(`Entry with ID "${args.id}" is still referenced by entries [${otherIds}].`, "IN_USE" /* ErrorCode.IN_USE */, {
|
|
@@ -13,23 +14,6 @@ export const mutationDeleteResolver = async (source, args, context, info) => {
|
|
|
13
14
|
argumentValue: args.id,
|
|
14
15
|
});
|
|
15
16
|
}
|
|
16
|
-
const entryType = info.schema.getType(context.type.name);
|
|
17
|
-
if (!isObjectType(entryType)) {
|
|
18
|
-
throw createError(`Type "${context.type.name}" is not an ObjectType.`, "INTERNAL_ERROR" /* ErrorCode.INTERNAL_ERROR */, {});
|
|
19
|
-
}
|
|
20
|
-
const referencedEntryIds = await getReferencedEntryIds(entryType, context, null, entryType, entry.data ?? null);
|
|
21
|
-
const referencedEntryUpdates = [];
|
|
22
|
-
for (const referencedEntryId of referencedEntryIds) {
|
|
23
|
-
const noLongerReferencedEntry = await findById(context, referencedEntryId);
|
|
24
|
-
referencedEntryUpdates.push({
|
|
25
|
-
...noLongerReferencedEntry,
|
|
26
|
-
metadata: {
|
|
27
|
-
...noLongerReferencedEntry.metadata,
|
|
28
|
-
referencedBy: noLongerReferencedEntry.metadata.referencedBy?.filter((entryId) => entryId !== args.id),
|
|
29
|
-
},
|
|
30
|
-
deletion: false,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
17
|
const commit = await context.gitAdapter.createCommit({
|
|
34
18
|
ref: context.branch,
|
|
35
19
|
parentSha: context.getCurrentHash(),
|
|
@@ -38,7 +22,6 @@ export const mutationDeleteResolver = async (source, args, context, info) => {
|
|
|
38
22
|
...entry,
|
|
39
23
|
deletion: true,
|
|
40
24
|
},
|
|
41
|
-
...referencedEntryUpdates,
|
|
42
25
|
],
|
|
43
26
|
message: args.commitMessage,
|
|
44
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation-delete-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mutation-delete-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAElE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAA;AAEnF,OAAO,EAAE,WAAW,EAAa,MAAM,iBAAiB,CAAA;AAExD,MAAM,CAAC,MAAM,sBAAsB,GAAkC,KAAK,EACxE,MAAM,EACN,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,EAAE;IACF,MAAM,KAAK,GAAU,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IAE5E,0EAA0E;IAC1E,MAAM,mBAAmB,GAAG,CAC1B,MAAM,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAC5D,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;IACtD,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,mBAAmB;aACjC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,WAAW,GAAG,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,WAAW,CACf,kBAAkB,IAAI,CAAC,EAAE,qCAAqC,QAAQ,IAAI,mCAE1E;YACE,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI,CAAC,EAAE;SACvB,CACF,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;QACnD,GAAG,EAAE,OAAO,CAAC,MAAM;QACnB,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE;QACnC,OAAO,EAAE;YACP;gBACE,GAAG,KAAK;gBACR,QAAQ,EAAE,IAAI;aACf;SACF;QACD,OAAO,EAAE,IAAI,CAAC,aAAa;KAC5B,CAAC,CAAA;IACF,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEzC,OAAO,IAAI,CAAC,EAAE,CAAA;AAChB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-update-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAanD,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,CAAC,SAAS,CAsCnE,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { findByTypeId } from "../../../persistence/persistence.js";
|
|
2
|
+
import { validateEntryReferences } from "../../schema-utils/entry-reference-util.js";
|
|
3
3
|
import { isObjectType } from 'graphql';
|
|
4
4
|
import { createError } from "../../errors.js";
|
|
5
5
|
function mergeData(existingEntryData, updateData) {
|
|
@@ -9,48 +9,24 @@ function mergeData(existingEntryData, updateData) {
|
|
|
9
9
|
};
|
|
10
10
|
}
|
|
11
11
|
export const mutationUpdateResolver = async (source, args, context, info) => {
|
|
12
|
+
void info;
|
|
12
13
|
if (!isObjectType(context.type)) {
|
|
13
14
|
throw createError(`Type "${context.type.name}" cannot be mutated as is not an ObjectType.`, "INTERNAL_ERROR" /* ErrorCode.INTERNAL_ERROR */, {});
|
|
14
15
|
}
|
|
15
16
|
const existingEntry = await findByTypeId(context, context.type.name, args.id);
|
|
16
|
-
const existingReferencedEntryIds = await getReferencedEntryIds(context.type, context, null, info.returnType, existingEntry.data ?? null);
|
|
17
17
|
const mergedData = mergeData(existingEntry.data ?? null, args.data ?? null);
|
|
18
|
-
|
|
19
|
-
const noLongerReferencedIds = existingReferencedEntryIds.filter((entryId) => !updatedReferencedEntryIds.includes(entryId));
|
|
20
|
-
const newlyReferencedIds = updatedReferencedEntryIds.filter((entryId) => !existingReferencedEntryIds.includes(entryId));
|
|
21
|
-
const referencedEntryUpdates = [];
|
|
22
|
-
for (const noLongerReferencedEntryId of noLongerReferencedIds) {
|
|
23
|
-
const noLongerReferencedEntry = await findById(context, noLongerReferencedEntryId);
|
|
24
|
-
referencedEntryUpdates.push({
|
|
25
|
-
...noLongerReferencedEntry,
|
|
26
|
-
metadata: {
|
|
27
|
-
...noLongerReferencedEntry.metadata,
|
|
28
|
-
referencedBy: noLongerReferencedEntry.metadata.referencedBy?.filter((entryId) => entryId !== args.id),
|
|
29
|
-
},
|
|
30
|
-
deletion: false,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
for (const newlyReferencedEntryId of newlyReferencedIds) {
|
|
34
|
-
const newlyReferencedEntry = await findById(context, newlyReferencedEntryId);
|
|
35
|
-
const updatedReferenceList = [
|
|
36
|
-
...(newlyReferencedEntry.metadata.referencedBy ?? []),
|
|
37
|
-
args.id,
|
|
38
|
-
].sort();
|
|
39
|
-
referencedEntryUpdates.push({
|
|
40
|
-
...newlyReferencedEntry,
|
|
41
|
-
metadata: {
|
|
42
|
-
...newlyReferencedEntry.metadata,
|
|
43
|
-
referencedBy: updatedReferenceList,
|
|
44
|
-
},
|
|
45
|
-
deletion: false,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
18
|
+
await validateEntryReferences(context.type, context, mergedData);
|
|
48
19
|
const commit = await context.gitAdapter.createCommit({
|
|
49
20
|
ref: context.branch,
|
|
50
21
|
parentSha: context.getCurrentHash(),
|
|
51
22
|
entries: [
|
|
52
|
-
{
|
|
53
|
-
|
|
23
|
+
{
|
|
24
|
+
id: existingEntry.id,
|
|
25
|
+
// only the type is written, which removes metadata no longer in use from existing entries
|
|
26
|
+
metadata: { type: existingEntry.metadata.type },
|
|
27
|
+
data: mergedData,
|
|
28
|
+
deletion: false,
|
|
29
|
+
},
|
|
54
30
|
],
|
|
55
31
|
message: args.commitMessage,
|
|
56
32
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation-update-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mutation-update-resolver.js","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,EAAE,WAAW,EAAa,MAAM,iBAAiB,CAAA;AAExD,SAAS,SAAS,CAChB,iBAA4B,EAC5B,UAAqB;IAErB,OAAO;QACL,GAAG,iBAAiB;QACpB,GAAG,UAAU;KACd,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAqC,KAAK,EAC3E,MAAM,EACN,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,EAAE;IACF,KAAK,IAAI,CAAA;IACT,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,WAAW,CACf,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,8CAA8C,mDAExE,EAAE,CACH,CAAA;IACH,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IAE7E,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;IAC3E,MAAM,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;IAEhE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;QACnD,GAAG,EAAE,OAAO,CAAC,MAAM;QACnB,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE;QACnC,OAAO,EAAE;YACP;gBACE,EAAE,EAAE,aAAa,CAAC,EAAE;gBACpB,0FAA0F;gBAC1F,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC/C,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,KAAK;aAChB;SACF;QACD,OAAO,EAAE,IAAI,CAAC,aAAa;KAC5B,CAAC,CAAA;IACF,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEzC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5E,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAA;AACtD,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-by-id-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,iBAAiB,EAAE,qBAAqB,CAAC,SAAS,CAU9D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-every-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-every-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,kBAAkB,EAAE,qBAAqB,CAAC,SAAS,EAAE,CAYjE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-search-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-search-resolver.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKjD,eAAO,MAAM,mBAAmB,EAAE,mBA6EjC,CAAA"}
|
package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-type-by-id-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,qBAAqB,EAAE,qBAAqB,CAAC,MAAM,CAQ/D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"union-type-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/graphql/resolvers/query-mutation-resolvers/union-type-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAG/C,eAAO,MAAM,iBAAiB,EAAE,iBAyB/B,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { GraphQLFieldResolver, GraphQLNamedType, GraphQLTypeResolver } from 'gra
|
|
|
3
3
|
import { EntryData } from '@commitspark/git-adapter';
|
|
4
4
|
import { SearchHit } from '@commitspark/search-adapter';
|
|
5
5
|
import { RecursiveArray } from './field-resolvers/types.ts';
|
|
6
|
-
|
|
6
|
+
interface QueryMutationResolverContext extends ApolloContext {
|
|
7
7
|
type: GraphQLNamedType;
|
|
8
8
|
}
|
|
9
9
|
export type QueryMutationResolver<ResultType> = GraphQLFieldResolver<unknown, QueryMutationResolverContext, {
|
|
@@ -22,5 +22,8 @@ export type SearchQueryResolver = GraphQLFieldResolver<unknown, ApolloContext, {
|
|
|
22
22
|
first?: number | null;
|
|
23
23
|
}, Promise<SearchHit[]>>;
|
|
24
24
|
export type ContextInjectionResolver = GraphQLFieldResolver<EntryData, ApolloContext, Record<string, unknown>, Promise<RecursiveArray<EntryData>>>;
|
|
25
|
+
export type ReferencedByResolver = GraphQLFieldResolver<EntryData & {
|
|
26
|
+
id: string;
|
|
27
|
+
}, ApolloContext, Record<string, never>, Promise<string[]>>;
|
|
25
28
|
export {};
|
|
26
29
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,UAAU,4BAA6B,SAAQ,aAAa;IAC1D,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;AAED,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CACrD,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC1B,aAAa,EACb,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAClB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-analyzer.d.ts","sourceRoot":"","sources":["../../../src/graphql/schema-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAIjB,MAAM,SAAS,CAAA;AAIhB,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,CAwCzE;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,iBAAiB,EAAE,CAAA;IACxC,WAAW,EAAE,iBAAiB,EAAE,CAAA;IAChC,cAAc,EAAE,oBAAoB,EAAE,CAAA;IACtC,UAAU,EAAE,gBAAgB,EAAE,CAAA;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.d.ts","sourceRoot":"","sources":["../../../src/graphql/schema-generator.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,2BAA2B,EAE5B,MAAM,uBAAuB,CAAA;AAU9B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAe5C,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,2BAA2B,CAAC,CAkJtC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { generateQueriesAndMutations, generateSearchQuery, generateTypeNameQuery, } from "./queries-mutations-generator.js";
|
|
1
|
+
import { generateQueriesAndMutations, generateReferencedByFields, generateSearchQuery, generateTypeNameQuery, } from "./queries-mutations-generator.js";
|
|
2
2
|
import { makeExecutableSchema, } from '@graphql-tools/schema';
|
|
3
3
|
import { analyzeSchema } from "./schema-analyzer.js";
|
|
4
4
|
import { generateIdInputTypeStrings, generateObjectInputTypeStrings, generateUnionInputTypeStrings, } from "./input-type-generator.js";
|
|
@@ -26,6 +26,7 @@ export async function generateSchema(context) {
|
|
|
26
26
|
const generatedQueriesMutations = generateQueriesAndMutations(schemaAnalyzerResult.entryDirectiveTypes);
|
|
27
27
|
const generatedTypeNameQuery = generateTypeNameQuery();
|
|
28
28
|
const generatedSearchQuery = context.searchAdapter !== undefined ? generateSearchQuery() : undefined;
|
|
29
|
+
const generatedReferencedByFields = generateReferencedByFields(schemaAnalyzerResult.entryDirectiveTypes);
|
|
29
30
|
const generatedObjectInputTypeStrings = generateObjectInputTypeStrings(schemaAnalyzerResult.objectTypes);
|
|
30
31
|
const generatedUnionInputTypeStrings = generateUnionInputTypeStrings(schemaAnalyzerResult.unionTypes);
|
|
31
32
|
const generatedSchemaRootTypeStrings = generateSchemaRootTypeStrings(generatedQueriesMutations, generatedTypeNameQuery, generatedSearchQuery);
|
|
@@ -77,12 +78,21 @@ ${generatedSchemaRootTypeStrings}`;
|
|
|
77
78
|
...generatedObjectTypeFieldResolvers[typeName],
|
|
78
79
|
};
|
|
79
80
|
}
|
|
81
|
+
for (const field of generatedReferencedByFields) {
|
|
82
|
+
allGeneratedResolvers[field.typeName] = {
|
|
83
|
+
...(allGeneratedResolvers[field.typeName] ?? {}),
|
|
84
|
+
[field.name]: field.resolver,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
80
87
|
const typeDefs = [
|
|
81
88
|
filteredOriginalSchemaString,
|
|
82
89
|
generatedSchemaString,
|
|
83
90
|
generatedIdInputTypeStrings.join('\n'),
|
|
84
91
|
generatedObjectInputTypeStrings.join('\n'),
|
|
85
92
|
generatedUnionInputTypeStrings.join('\n'),
|
|
93
|
+
generatedReferencedByFields
|
|
94
|
+
.map((field) => field.typeExtensionString)
|
|
95
|
+
.join('\n'),
|
|
86
96
|
generatedSearchQuery?.typeDefinitionString ?? '',
|
|
87
97
|
].filter((typeDef) => typeDef.length > 0);
|
|
88
98
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-generator.js","sourceRoot":"","sources":["../../../src/graphql/schema-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAEL,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6DAA6D,CAAA;AAG/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,mEAAmE,CAAA;AAClH,OAAO,EAAE,WAAW,EAAa,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"schema-generator.js","sourceRoot":"","sources":["../../../src/graphql/schema-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-root-type-generator.d.ts","sourceRoot":"","sources":["../../../src/graphql/schema-root-type-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACrB,MAAM,kCAAkC,CAAA;AAEzC,wBAAgB,6BAA6B,CAC3C,gBAAgB,EAAE,eAAe,EAAE,EACnC,SAAS,EAAE,cAAc,EACzB,WAAW,EAAE,oBAAoB,GAAG,SAAS,GAC5C,MAAM,CA8BR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-util.d.ts","sourceRoot":"","sources":["../../../../src/graphql/schema-utils/directive-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAExD,eAAO,MAAM,oBAAoB,UAAU,CAAA;AAC3C,eAAO,MAAM,yBAAyB,eAAe,CAAA;AAErD,wBAAgB,YAAY,CAC1B,WAAW,EAAE,gBAAgB,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAC9D,aAAa,EAAE,MAAM,GACpB,OAAO,CAMT"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { GraphQLObjectType, GraphQLSchema } from 'graphql';
|
|
2
|
+
import { ApolloContext } from '../../client.ts';
|
|
3
|
+
import { EntryData } from '@commitspark/git-adapter';
|
|
4
|
+
export declare function validateEntryReferences(entryType: GraphQLObjectType, context: ApolloContext, data: EntryData): Promise<void>;
|
|
5
|
+
export declare function getReferencingEntryIds(context: ApolloContext, schema: GraphQLSchema, id: string): Promise<string[]>;
|
|
6
|
+
//# sourceMappingURL=entry-reference-util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-reference-util.d.ts","sourceRoot":"","sources":["../../../../src/graphql/schema-utils/entry-reference-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EAOd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAU/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAepD,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB"}
|
|
@@ -5,105 +5,99 @@ import { ENTRY_DIRECTIVE_NAME, hasDirective } from "./directive-util.js";
|
|
|
5
5
|
import { isUnionOfEntryTypes } from "./entry-type-util.js";
|
|
6
6
|
import { createError } from "../errors.js";
|
|
7
7
|
import { isEntryData } from "../util.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return isPermittedReferenceType(referencedTypeName, fieldType.ofType);
|
|
14
|
-
}
|
|
15
|
-
else if (isUnionType(fieldType)) {
|
|
16
|
-
return fieldType
|
|
17
|
-
.getTypes()
|
|
18
|
-
.map((concreteType) => concreteType.name)
|
|
19
|
-
.includes(referencedTypeName);
|
|
20
|
-
}
|
|
21
|
-
else if (isObjectType(fieldType)) {
|
|
22
|
-
return fieldType.name === referencedTypeName;
|
|
23
|
-
}
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
async function validateReference(context, fieldName, fieldType, fieldValue) {
|
|
27
|
-
if (isNonNullType(fieldType)) {
|
|
28
|
-
await validateReference(context, fieldName, fieldType.ofType, fieldValue);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
if (isListType(fieldType)) {
|
|
32
|
-
if (!Array.isArray(fieldValue)) {
|
|
33
|
-
throw createError(`Expected array while validation references for field "${fieldName}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
34
|
-
fieldName: fieldName,
|
|
35
|
-
fieldValue: fieldValue,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
for (const fieldListElement of fieldValue) {
|
|
39
|
-
await validateReference(context, fieldName, fieldType.ofType, fieldListElement);
|
|
40
|
-
}
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
if (isUnionType(fieldType) || isObjectType(fieldType)) {
|
|
44
|
-
if (fieldValue === null ||
|
|
45
|
-
!('id' in fieldValue) ||
|
|
46
|
-
typeof fieldValue.id !== 'string') {
|
|
47
|
-
throw createError(`Expected key "id" with value of type string in data while validating reference for field "${fieldName}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
48
|
-
fieldName: fieldName,
|
|
49
|
-
fieldValue: fieldValue,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
const referencedId = fieldValue.id;
|
|
8
|
+
// commits are immutable, so an index built from the cached entries of a commit stays valid for as long as these
|
|
9
|
+
// entries remain cached
|
|
10
|
+
const referencedByIndexes = new WeakMap();
|
|
11
|
+
export async function validateEntryReferences(entryType, context, data) {
|
|
12
|
+
for (const reference of getEntryReferences(entryType, data)) {
|
|
53
13
|
let referencedTypeName;
|
|
54
14
|
try {
|
|
55
|
-
referencedTypeName = await getTypeById(context,
|
|
15
|
+
referencedTypeName = await getTypeById(context, reference.id);
|
|
56
16
|
}
|
|
57
17
|
catch {
|
|
58
|
-
throw createError(`Failed to resolve entry reference "${
|
|
59
|
-
fieldName: fieldName,
|
|
60
|
-
fieldValue:
|
|
18
|
+
throw createError(`Failed to resolve entry reference "${reference.id}".`, "BAD_USER_INPUT" /* ErrorCode.BAD_USER_INPUT */, {
|
|
19
|
+
fieldName: reference.fieldName,
|
|
20
|
+
fieldValue: reference.id,
|
|
61
21
|
});
|
|
62
22
|
}
|
|
63
|
-
if (!isPermittedReferenceType(referencedTypeName, fieldType)) {
|
|
64
|
-
throw createError(`Reference with ID "${
|
|
65
|
-
fieldName: fieldName,
|
|
66
|
-
fieldValue:
|
|
23
|
+
if (!isPermittedReferenceType(referencedTypeName, reference.fieldType)) {
|
|
24
|
+
throw createError(`Reference with ID "${reference.id}" points to entry of incompatible type "${referencedTypeName}".`, "BAD_USER_INPUT" /* ErrorCode.BAD_USER_INPUT */, {
|
|
25
|
+
fieldName: reference.fieldName,
|
|
26
|
+
fieldValue: reference.id,
|
|
67
27
|
});
|
|
68
28
|
}
|
|
69
29
|
}
|
|
70
30
|
}
|
|
71
|
-
export async function
|
|
31
|
+
export async function getReferencingEntryIds(context, schema, id) {
|
|
32
|
+
const entriesRecord = await context.repositoryCache.getEntriesRecord(context, context.getCurrentHash());
|
|
33
|
+
let referencedByIndex = referencedByIndexes.get(entriesRecord);
|
|
34
|
+
if (referencedByIndex === undefined) {
|
|
35
|
+
referencedByIndex = buildReferencedByIndex(schema, entriesRecord);
|
|
36
|
+
referencedByIndexes.set(entriesRecord, referencedByIndex);
|
|
37
|
+
}
|
|
38
|
+
return referencedByIndex.get(id) ?? [];
|
|
39
|
+
}
|
|
40
|
+
function buildReferencedByIndex(schema, entriesRecord) {
|
|
41
|
+
const referencedByIndex = new Map();
|
|
42
|
+
for (const entry of entriesRecord.byId.values()) {
|
|
43
|
+
const entryType = schema.getType(entry.metadata.type);
|
|
44
|
+
if (!isObjectType(entryType) ||
|
|
45
|
+
!hasDirective(entryType, ENTRY_DIRECTIVE_NAME)) {
|
|
46
|
+
throw createError(`Entry "${entry.id}" is of type "${entry.metadata.type}", which is not a type with directive ` +
|
|
47
|
+
`@${ENTRY_DIRECTIVE_NAME} in the schema.`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
48
|
+
typeName: entry.metadata.type,
|
|
49
|
+
fieldValue: entry.id,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const referencedIds = new Set(getEntryReferences(entryType, entry.data ?? null).map((reference) => reference.id));
|
|
53
|
+
for (const referencedId of referencedIds) {
|
|
54
|
+
const referencingIds = referencedByIndex.get(referencedId) ?? [];
|
|
55
|
+
referencingIds.push(entry.id);
|
|
56
|
+
referencedByIndex.set(referencedId, referencingIds);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const referencingIds of referencedByIndex.values()) {
|
|
60
|
+
referencingIds.sort();
|
|
61
|
+
}
|
|
62
|
+
return referencedByIndex;
|
|
63
|
+
}
|
|
64
|
+
function getEntryReferences(entryType, data) {
|
|
65
|
+
// the fields of the entry itself are traversed directly, so that any nested @Entry type is treated as reference,
|
|
66
|
+
// including references to entries of the same type
|
|
67
|
+
return getReferencesInObjectFields(entryType, data);
|
|
68
|
+
}
|
|
69
|
+
function getReferencesInObjectFields(type, data) {
|
|
70
|
+
if (data === null || data === undefined) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
// expect our object type to hold EntryData (i.e. an object)
|
|
74
|
+
if (!isEntryData(data) || data === null) {
|
|
75
|
+
throw createError(`Expected object as data for type "${type.name}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
76
|
+
typeName: type.name,
|
|
77
|
+
fieldValue: data,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return Object.entries(type.getFields()).flatMap(([fieldName, field]) => getReferencesInField(fieldName, field.type, data[fieldName]));
|
|
81
|
+
}
|
|
82
|
+
function getReferencesInField(fieldName, type, data) {
|
|
72
83
|
if (data === null || data === undefined || isScalarType(type)) {
|
|
73
84
|
return [];
|
|
74
85
|
}
|
|
75
86
|
if (isNonNullType(type)) {
|
|
76
|
-
return
|
|
87
|
+
return getReferencesInField(fieldName, type.ofType, data);
|
|
77
88
|
}
|
|
78
89
|
if (isListType(type)) {
|
|
79
90
|
if (!Array.isArray(data)) {
|
|
80
|
-
throw createError(`Expected array as data for field "${fieldName}"
|
|
81
|
-
fieldName: fieldName
|
|
91
|
+
throw createError(`Expected array as data for field "${fieldName}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
92
|
+
fieldName: fieldName,
|
|
82
93
|
fieldValue: data,
|
|
83
94
|
});
|
|
84
95
|
}
|
|
85
|
-
|
|
86
|
-
for (const element of data) {
|
|
87
|
-
referencedEntryIds = [
|
|
88
|
-
...referencedEntryIds,
|
|
89
|
-
...(await getReferencedEntryIds(rootType, context, fieldName, type.ofType, element)),
|
|
90
|
-
];
|
|
91
|
-
}
|
|
92
|
-
// deduplicate
|
|
93
|
-
referencedEntryIds = [...new Set(referencedEntryIds)];
|
|
94
|
-
return referencedEntryIds;
|
|
96
|
+
return data.flatMap((element) => getReferencesInField(fieldName, type.ofType, element));
|
|
95
97
|
}
|
|
96
98
|
if (isUnionType(type)) {
|
|
97
|
-
if (!isEntryData(data)) {
|
|
98
|
-
throw createError(`Expected object as data for type "${type.name}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
99
|
-
typeName: type.name,
|
|
100
|
-
fieldName: fieldName ? fieldName : undefined,
|
|
101
|
-
fieldValue: data,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
99
|
if (isUnionOfEntryTypes(type)) {
|
|
105
|
-
|
|
106
|
-
return [referenceId];
|
|
100
|
+
return [createEntryReference(fieldName, type, data)];
|
|
107
101
|
}
|
|
108
102
|
const requestedUnionTypeName = getUnionTypeNameFromFieldValue(data);
|
|
109
103
|
const concreteFieldUnionType = type
|
|
@@ -113,61 +107,39 @@ export async function getReferencedEntryIds(rootType, context, fieldName, type,
|
|
|
113
107
|
throw createError(`Type "${requestedUnionTypeName}" found in field data is not a valid type for ` +
|
|
114
108
|
`union type "${type.name}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
115
109
|
typeName: type.name,
|
|
116
|
-
fieldName: fieldName
|
|
110
|
+
fieldName: fieldName,
|
|
117
111
|
fieldValue: data,
|
|
118
112
|
});
|
|
119
113
|
}
|
|
120
|
-
|
|
121
|
-
return getReferencedEntryIds(rootType, context, fieldName, concreteFieldUnionType, unionValue);
|
|
114
|
+
return getReferencesInObjectFields(concreteFieldUnionType, getUnionValue(data));
|
|
122
115
|
}
|
|
123
116
|
if (isObjectType(type)) {
|
|
124
|
-
if (type
|
|
125
|
-
|
|
126
|
-
const referenceId = await getValidatedReferenceId(context, fieldName, type, data);
|
|
127
|
-
return [referenceId];
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
let referencedEntryIds = [];
|
|
131
|
-
for (const [fieldsKey, field] of Object.entries(type.getFields())) {
|
|
132
|
-
// expect our object type to hold EntryData (i.e. an object)
|
|
133
|
-
if (Array.isArray(data) || !isEntryData(data)) {
|
|
134
|
-
throw createError(`Expected object as data for type "${type.name}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
135
|
-
typeName: type.name,
|
|
136
|
-
fieldName: field.name ? field.name : undefined,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
// recursively get referenced IDs in nested data
|
|
140
|
-
const nestedResult = await getReferencedEntryIds(rootType, context, fieldsKey, field.type, data[fieldsKey]);
|
|
141
|
-
referencedEntryIds = [...referencedEntryIds, ...nestedResult];
|
|
142
|
-
}
|
|
143
|
-
// deduplicate
|
|
144
|
-
referencedEntryIds = [...new Set(referencedEntryIds)];
|
|
145
|
-
return referencedEntryIds;
|
|
117
|
+
if (hasDirective(type, ENTRY_DIRECTIVE_NAME)) {
|
|
118
|
+
return [createEntryReference(fieldName, type, data)];
|
|
146
119
|
}
|
|
120
|
+
return getReferencesInObjectFields(type, data);
|
|
147
121
|
}
|
|
148
122
|
return [];
|
|
149
123
|
}
|
|
150
|
-
|
|
151
|
-
if (data
|
|
152
|
-
data ===
|
|
153
|
-
!
|
|
154
|
-
|
|
155
|
-
throw createError(`Expected
|
|
156
|
-
typeName:
|
|
157
|
-
fieldName: fieldName
|
|
124
|
+
function createEntryReference(fieldName, fieldType, data) {
|
|
125
|
+
if (typeof data !== 'object' ||
|
|
126
|
+
data === null ||
|
|
127
|
+
!('id' in data) ||
|
|
128
|
+
typeof data.id !== 'string') {
|
|
129
|
+
throw createError(`Expected key "id" with value of type string in data of field "${fieldName}" of type "${fieldType.name}".`, "BAD_REPOSITORY_DATA" /* ErrorCode.BAD_REPOSITORY_DATA */, {
|
|
130
|
+
typeName: fieldType.name,
|
|
131
|
+
fieldName: fieldName,
|
|
158
132
|
fieldValue: data,
|
|
159
133
|
});
|
|
160
134
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
fieldValue: data,
|
|
169
|
-
});
|
|
135
|
+
return { id: data.id, fieldName, fieldType };
|
|
136
|
+
}
|
|
137
|
+
function isPermittedReferenceType(referencedTypeName, fieldType) {
|
|
138
|
+
if (isUnionType(fieldType)) {
|
|
139
|
+
return fieldType
|
|
140
|
+
.getTypes()
|
|
141
|
+
.some((concreteType) => concreteType.name === referencedTypeName);
|
|
170
142
|
}
|
|
171
|
-
return
|
|
143
|
+
return fieldType.name === referencedTypeName;
|
|
172
144
|
}
|
|
173
145
|
//# sourceMappingURL=entry-reference-util.js.map
|