@graphitation/supermassive 2.5.0 → 3.0.0-alpha.1
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/.eslintcache +1 -1
- package/CHANGELOG.md +18 -2
- package/lib/benchmarks/index.js +2 -2
- package/lib/benchmarks/index.js.map +2 -2
- package/lib/benchmarks/index.mjs +2 -2
- package/lib/benchmarks/index.mjs.map +2 -2
- package/lib/benchmarks/swapi-schema/index.d.ts +4 -2
- package/lib/benchmarks/swapi-schema/index.d.ts.map +1 -1
- package/lib/benchmarks/swapi-schema/index.js +8 -2
- package/lib/benchmarks/swapi-schema/index.js.map +2 -2
- package/lib/benchmarks/swapi-schema/index.mjs +8 -2
- package/lib/benchmarks/swapi-schema/index.mjs.map +2 -2
- package/lib/benchmarks/swapi-schema/makeExecutableSchema.d.ts +7 -0
- package/lib/benchmarks/swapi-schema/makeExecutableSchema.d.ts.map +1 -0
- package/lib/benchmarks/swapi-schema/makeExecutableSchema.js +916 -0
- package/lib/benchmarks/swapi-schema/makeExecutableSchema.js.map +7 -0
- package/lib/benchmarks/swapi-schema/makeExecutableSchema.mjs +903 -0
- package/lib/benchmarks/swapi-schema/makeExecutableSchema.mjs.map +7 -0
- package/lib/benchmarks/swapi-schema/resolvers.d.ts.map +1 -1
- package/lib/benchmarks/swapi-schema/resolvers.js +53 -17
- package/lib/benchmarks/swapi-schema/resolvers.js.map +2 -2
- package/lib/benchmarks/swapi-schema/resolvers.mjs +54 -18
- package/lib/benchmarks/swapi-schema/resolvers.mjs.map +2 -2
- package/lib/collectFields.d.ts +28 -6
- package/lib/collectFields.d.ts.map +1 -1
- package/lib/collectFields.js +155 -28
- package/lib/collectFields.js.map +3 -3
- package/lib/collectFields.mjs +150 -29
- package/lib/collectFields.mjs.map +2 -2
- package/lib/definition.js +1 -1
- package/lib/definition.js.map +2 -2
- package/lib/definition.mjs +1 -1
- package/lib/definition.mjs.map +2 -2
- package/lib/directives.d.ts +2 -73
- package/lib/directives.d.ts.map +1 -1
- package/lib/directives.js +10 -123
- package/lib/directives.js.map +2 -2
- package/lib/directives.mjs +13 -122
- package/lib/directives.mjs.map +2 -2
- package/lib/executeWithoutSchema.d.ts +50 -13
- package/lib/executeWithoutSchema.d.ts.map +1 -1
- package/lib/executeWithoutSchema.js +1038 -184
- package/lib/executeWithoutSchema.js.map +3 -3
- package/lib/executeWithoutSchema.mjs +1049 -186
- package/lib/executeWithoutSchema.mjs.map +3 -3
- package/lib/extractImplicitTypesRuntime.js +2 -2
- package/lib/extractImplicitTypesRuntime.js.map +2 -2
- package/lib/extractImplicitTypesRuntime.mjs +2 -2
- package/lib/extractImplicitTypesRuntime.mjs.map +2 -2
- package/lib/hooks/types.d.ts +1 -1
- package/lib/hooks/types.d.ts.map +1 -1
- package/lib/index.d.ts +4 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -1
- package/lib/index.js.map +2 -2
- package/lib/index.mjs +4 -1
- package/lib/index.mjs.map +2 -2
- package/lib/jsutils/AccumulatorMap.d.ts +8 -0
- package/lib/jsutils/AccumulatorMap.d.ts.map +1 -0
- package/lib/jsutils/AccumulatorMap.js +36 -0
- package/lib/jsutils/AccumulatorMap.js.map +7 -0
- package/lib/jsutils/AccumulatorMap.mjs +17 -0
- package/lib/jsutils/AccumulatorMap.mjs.map +7 -0
- package/lib/jsutils/Maybe.d.ts +1 -1
- package/lib/jsutils/Maybe.d.ts.map +1 -1
- package/lib/jsutils/ObjMap.d.ts +2 -2
- package/lib/jsutils/ObjMap.d.ts.map +1 -1
- package/lib/jsutils/PromiseOrValue.d.ts +1 -1
- package/lib/jsutils/PromiseOrValue.d.ts.map +1 -1
- package/lib/jsutils/didYouMean.d.ts +1 -2
- package/lib/jsutils/didYouMean.d.ts.map +1 -1
- package/lib/jsutils/didYouMean.js.map +2 -2
- package/lib/jsutils/didYouMean.mjs.map +2 -2
- package/lib/jsutils/instanceOf.js.map +2 -2
- package/lib/jsutils/instanceOf.mjs.map +2 -2
- package/lib/subscribeWithSchema.d.ts +3 -2
- package/lib/subscribeWithSchema.d.ts.map +1 -1
- package/lib/subscribeWithSchema.js.map +2 -2
- package/lib/subscribeWithSchema.mjs.map +2 -2
- package/lib/subscribeWithoutSchema.d.ts +3 -35
- package/lib/subscribeWithoutSchema.d.ts.map +1 -1
- package/lib/subscribeWithoutSchema.js +1 -163
- package/lib/subscribeWithoutSchema.js.map +2 -2
- package/lib/subscribeWithoutSchema.mjs +2 -175
- package/lib/subscribeWithoutSchema.mjs.map +2 -2
- package/lib/supermassive-ast/TypedAST.d.ts +370 -0
- package/lib/supermassive-ast/TypedAST.d.ts.map +1 -0
- package/lib/supermassive-ast/TypedAST.js +29 -0
- package/lib/supermassive-ast/TypedAST.js.map +7 -0
- package/lib/supermassive-ast/TypedAST.mjs +10 -0
- package/lib/supermassive-ast/TypedAST.mjs.map +7 -0
- package/lib/supermassive-ast/addTypesToRequestDocument.d.ts +56 -0
- package/lib/supermassive-ast/addTypesToRequestDocument.d.ts.map +1 -0
- package/lib/supermassive-ast/addTypesToRequestDocument.js +473 -0
- package/lib/supermassive-ast/addTypesToRequestDocument.js.map +7 -0
- package/lib/supermassive-ast/addTypesToRequestDocument.mjs +463 -0
- package/lib/supermassive-ast/addTypesToRequestDocument.mjs.map +7 -0
- package/lib/supermassive-ast/annotateDocumentGraphQLTransform.d.ts +3 -0
- package/lib/supermassive-ast/annotateDocumentGraphQLTransform.d.ts.map +1 -0
- package/lib/supermassive-ast/annotateDocumentGraphQLTransform.js +34 -0
- package/lib/supermassive-ast/annotateDocumentGraphQLTransform.js.map +7 -0
- package/lib/supermassive-ast/annotateDocumentGraphQLTransform.mjs +17 -0
- package/lib/supermassive-ast/annotateDocumentGraphQLTransform.mjs.map +7 -0
- package/lib/supermassive-ast/directives.d.ts +36 -0
- package/lib/supermassive-ast/directives.d.ts.map +1 -0
- package/lib/supermassive-ast/directives.js +165 -0
- package/lib/supermassive-ast/directives.js.map +7 -0
- package/lib/supermassive-ast/directives.mjs +153 -0
- package/lib/supermassive-ast/directives.mjs.map +7 -0
- package/lib/supermassive-ast/index.d.ts +6 -0
- package/lib/supermassive-ast/index.d.ts.map +1 -0
- package/lib/supermassive-ast/index.js +37 -0
- package/lib/supermassive-ast/index.js.map +7 -0
- package/lib/supermassive-ast/index.mjs +27 -0
- package/lib/supermassive-ast/index.mjs.map +7 -0
- package/lib/types.d.ts +80 -24
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +14 -0
- package/lib/types.js.map +2 -2
- package/lib/types.mjs +11 -0
- package/lib/types.mjs.map +3 -3
- package/lib/utilities/mergeResolvers.d.ts +1 -1
- package/lib/utilities/mergeResolvers.d.ts.map +1 -1
- package/lib/utilities/mergeResolvers.js.map +2 -2
- package/lib/utilities/mergeResolvers.mjs.map +2 -2
- package/lib/utilities/typeNameFromAST.d.ts +1 -1
- package/lib/utilities/typeNameFromAST.d.ts.map +1 -1
- package/lib/utilities/typeNameFromAST.js.map +1 -1
- package/lib/utilities/typeNameFromAST.mjs.map +1 -1
- package/lib/values.d.ts +3 -4
- package/lib/values.d.ts.map +1 -1
- package/lib/values.js +10 -14
- package/lib/values.js.map +2 -2
- package/lib/values.mjs +10 -14
- package/lib/values.mjs.map +2 -2
- package/package.json +4 -9
package/lib/collectFields.d.ts
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
|
-
import { FieldNode, FragmentDefinitionNode,
|
|
1
|
+
import { FieldNode, FragmentDefinitionNode, OperationDefinitionNode } from "./supermassive-ast";
|
|
2
2
|
import type { ObjMap } from "./jsutils/ObjMap";
|
|
3
3
|
import { Resolvers } from "./types";
|
|
4
|
+
export type FieldGroup = ReadonlyArray<FieldNode>;
|
|
5
|
+
export type GroupedFieldSet = Map<string, FieldGroup>;
|
|
6
|
+
export interface PatchFields {
|
|
7
|
+
label: string | undefined;
|
|
8
|
+
groupedFieldSet: GroupedFieldSet;
|
|
9
|
+
}
|
|
10
|
+
export interface FieldsAndPatches {
|
|
11
|
+
groupedFieldSet: GroupedFieldSet;
|
|
12
|
+
patches: Array<PatchFields>;
|
|
13
|
+
}
|
|
4
14
|
/**
|
|
5
|
-
* Given a selectionSet,
|
|
6
|
-
* the passed in map of fields, and returns it at the end.
|
|
15
|
+
* Given a selectionSet, collects all of the fields and returns them.
|
|
7
16
|
*
|
|
8
|
-
* CollectFields requires the "runtime type" of an object. For a field
|
|
17
|
+
* CollectFields requires the "runtime type" of an object. For a field that
|
|
9
18
|
* returns an Interface or Union type, the "runtime type" will be the actual
|
|
10
|
-
*
|
|
19
|
+
* object type returned by that field.
|
|
11
20
|
*
|
|
12
21
|
* @internal
|
|
13
22
|
*/
|
|
14
23
|
export declare function collectFields(resolvers: Resolvers, fragments: ObjMap<FragmentDefinitionNode>, variableValues: {
|
|
15
24
|
[variable: string]: unknown;
|
|
16
|
-
}, runtimeTypeName: string,
|
|
25
|
+
}, runtimeTypeName: string, operation: OperationDefinitionNode): FieldsAndPatches;
|
|
26
|
+
/**
|
|
27
|
+
* Given an array of field nodes, collects all of the subfields of the passed
|
|
28
|
+
* in fields, and returns them at the end.
|
|
29
|
+
*
|
|
30
|
+
* CollectSubFields requires the "return type" of an object. For a field that
|
|
31
|
+
* returns an Interface or Union type, the "return type" will be the actual
|
|
32
|
+
* object type returned by that field.
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare function collectSubfields(resolvers: Resolvers, fragments: ObjMap<FragmentDefinitionNode>, variableValues: {
|
|
37
|
+
[variable: string]: unknown;
|
|
38
|
+
}, operation: OperationDefinitionNode, returnTypeName: string, fieldGroup: FieldGroup): FieldsAndPatches;
|
|
17
39
|
//# sourceMappingURL=collectFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectFields.d.ts","sourceRoot":"","sources":["../src/collectFields.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,sBAAsB,EAGtB,
|
|
1
|
+
{"version":3,"file":"collectFields.d.ts","sourceRoot":"","sources":["../src/collectFields.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,sBAAsB,EAGtB,uBAAuB,EAGxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAU/C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKpC,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,CAAC,sBAAsB,CAAC,EACzC,cAAc,EAAE;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC/C,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,uBAAuB,GACjC,gBAAgB,CAelB;AAED;;;;;;;;;GASG;AAEH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,CAAC,sBAAsB,CAAC,EACzC,cAAc,EAAE;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC/C,SAAS,EAAE,uBAAuB,EAClC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,UAAU,GACrB,gBAAgB,CA0BlB"}
|
package/lib/collectFields.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,10 +17,19 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
var collectFields_exports = {};
|
|
20
30
|
__export(collectFields_exports, {
|
|
21
|
-
collectFields: () => collectFields
|
|
31
|
+
collectFields: () => collectFields,
|
|
32
|
+
collectSubfields: () => collectSubfields
|
|
22
33
|
});
|
|
23
34
|
module.exports = __toCommonJS(collectFields_exports);
|
|
24
35
|
var import_graphql = require("graphql");
|
|
@@ -26,61 +37,156 @@ var import_values = require("./values");
|
|
|
26
37
|
var import_directives = require("./directives");
|
|
27
38
|
var import_typeNameFromAST = require("./utilities/typeNameFromAST");
|
|
28
39
|
var import_definition = require("./definition");
|
|
29
|
-
|
|
40
|
+
var import_AccumulatorMap = require("./jsutils/AccumulatorMap");
|
|
41
|
+
var import_invariant = __toESM(require("invariant"));
|
|
42
|
+
function collectFields(resolvers, fragments, variableValues, runtimeTypeName, operation) {
|
|
43
|
+
const groupedFieldSet = new import_AccumulatorMap.AccumulatorMap();
|
|
44
|
+
const patches = [];
|
|
45
|
+
collectFieldsImpl(
|
|
46
|
+
resolvers,
|
|
47
|
+
fragments,
|
|
48
|
+
variableValues,
|
|
49
|
+
operation,
|
|
50
|
+
runtimeTypeName,
|
|
51
|
+
operation.selectionSet,
|
|
52
|
+
groupedFieldSet,
|
|
53
|
+
patches,
|
|
54
|
+
/* @__PURE__ */ new Set()
|
|
55
|
+
);
|
|
56
|
+
return { groupedFieldSet, patches };
|
|
57
|
+
}
|
|
58
|
+
function collectSubfields(resolvers, fragments, variableValues, operation, returnTypeName, fieldGroup) {
|
|
59
|
+
const subGroupedFieldSet = new import_AccumulatorMap.AccumulatorMap();
|
|
60
|
+
const visitedFragmentNames = /* @__PURE__ */ new Set();
|
|
61
|
+
const subPatches = [];
|
|
62
|
+
const subFieldsAndPatches = {
|
|
63
|
+
groupedFieldSet: subGroupedFieldSet,
|
|
64
|
+
patches: subPatches
|
|
65
|
+
};
|
|
66
|
+
for (const node of fieldGroup) {
|
|
67
|
+
if (node.selectionSet) {
|
|
68
|
+
collectFieldsImpl(
|
|
69
|
+
resolvers,
|
|
70
|
+
fragments,
|
|
71
|
+
variableValues,
|
|
72
|
+
operation,
|
|
73
|
+
returnTypeName,
|
|
74
|
+
node.selectionSet,
|
|
75
|
+
subGroupedFieldSet,
|
|
76
|
+
subPatches,
|
|
77
|
+
visitedFragmentNames
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return subFieldsAndPatches;
|
|
82
|
+
}
|
|
83
|
+
function collectFieldsImpl(resolvers, fragments, variableValues, operation, runtimeTypeName, selectionSet, groupedFieldSet, patches, visitedFragmentNames) {
|
|
30
84
|
for (const selection of selectionSet.selections) {
|
|
31
85
|
switch (selection.kind) {
|
|
32
86
|
case import_graphql.Kind.FIELD: {
|
|
33
87
|
if (!shouldIncludeNode(resolvers, variableValues, selection)) {
|
|
34
88
|
continue;
|
|
35
89
|
}
|
|
36
|
-
|
|
37
|
-
const fieldList = fields.get(name);
|
|
38
|
-
if (fieldList !== void 0) {
|
|
39
|
-
fieldList.push(selection);
|
|
40
|
-
} else {
|
|
41
|
-
fields.set(name, [selection]);
|
|
42
|
-
}
|
|
90
|
+
groupedFieldSet.add(getFieldEntryKey(selection), selection);
|
|
43
91
|
break;
|
|
44
92
|
}
|
|
45
93
|
case import_graphql.Kind.INLINE_FRAGMENT: {
|
|
46
94
|
if (!shouldIncludeNode(resolvers, variableValues, selection) || !doesFragmentConditionMatch(selection, runtimeTypeName, resolvers)) {
|
|
47
95
|
continue;
|
|
48
96
|
}
|
|
49
|
-
|
|
97
|
+
const defer = getDeferValues(
|
|
50
98
|
resolvers,
|
|
51
|
-
|
|
99
|
+
operation,
|
|
52
100
|
variableValues,
|
|
53
|
-
|
|
54
|
-
selection.selectionSet,
|
|
55
|
-
fields,
|
|
56
|
-
visitedFragmentNames
|
|
101
|
+
selection
|
|
57
102
|
);
|
|
103
|
+
if (defer) {
|
|
104
|
+
const patchFields = new import_AccumulatorMap.AccumulatorMap();
|
|
105
|
+
collectFieldsImpl(
|
|
106
|
+
resolvers,
|
|
107
|
+
fragments,
|
|
108
|
+
variableValues,
|
|
109
|
+
operation,
|
|
110
|
+
runtimeTypeName,
|
|
111
|
+
selection.selectionSet,
|
|
112
|
+
patchFields,
|
|
113
|
+
patches,
|
|
114
|
+
visitedFragmentNames
|
|
115
|
+
);
|
|
116
|
+
patches.push({
|
|
117
|
+
label: defer.label,
|
|
118
|
+
groupedFieldSet: patchFields
|
|
119
|
+
});
|
|
120
|
+
} else {
|
|
121
|
+
collectFieldsImpl(
|
|
122
|
+
resolvers,
|
|
123
|
+
fragments,
|
|
124
|
+
variableValues,
|
|
125
|
+
operation,
|
|
126
|
+
runtimeTypeName,
|
|
127
|
+
selection.selectionSet,
|
|
128
|
+
groupedFieldSet,
|
|
129
|
+
patches,
|
|
130
|
+
visitedFragmentNames
|
|
131
|
+
);
|
|
132
|
+
}
|
|
58
133
|
break;
|
|
59
134
|
}
|
|
60
135
|
case import_graphql.Kind.FRAGMENT_SPREAD: {
|
|
61
136
|
const fragName = selection.name.value;
|
|
62
|
-
if (
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
visitedFragmentNames.add(fragName);
|
|
66
|
-
const fragment = fragments[fragName];
|
|
67
|
-
if (!fragment || !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)) {
|
|
137
|
+
if (!shouldIncludeNode(resolvers, variableValues, selection)) {
|
|
68
138
|
continue;
|
|
69
139
|
}
|
|
70
|
-
|
|
140
|
+
const defer = getDeferValues(
|
|
71
141
|
resolvers,
|
|
72
|
-
|
|
142
|
+
operation,
|
|
73
143
|
variableValues,
|
|
74
|
-
|
|
75
|
-
fragment.selectionSet,
|
|
76
|
-
fields,
|
|
77
|
-
visitedFragmentNames
|
|
144
|
+
selection
|
|
78
145
|
);
|
|
146
|
+
if (visitedFragmentNames.has(fragName) && !defer) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const fragment = fragments[fragName];
|
|
150
|
+
if (fragment == null || !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (!defer) {
|
|
154
|
+
visitedFragmentNames.add(fragName);
|
|
155
|
+
}
|
|
156
|
+
if (defer) {
|
|
157
|
+
const patchFields = new import_AccumulatorMap.AccumulatorMap();
|
|
158
|
+
collectFieldsImpl(
|
|
159
|
+
resolvers,
|
|
160
|
+
fragments,
|
|
161
|
+
variableValues,
|
|
162
|
+
operation,
|
|
163
|
+
runtimeTypeName,
|
|
164
|
+
fragment.selectionSet,
|
|
165
|
+
patchFields,
|
|
166
|
+
patches,
|
|
167
|
+
visitedFragmentNames
|
|
168
|
+
);
|
|
169
|
+
patches.push({
|
|
170
|
+
label: defer.label,
|
|
171
|
+
groupedFieldSet: patchFields
|
|
172
|
+
});
|
|
173
|
+
} else {
|
|
174
|
+
collectFieldsImpl(
|
|
175
|
+
resolvers,
|
|
176
|
+
fragments,
|
|
177
|
+
variableValues,
|
|
178
|
+
operation,
|
|
179
|
+
runtimeTypeName,
|
|
180
|
+
fragment.selectionSet,
|
|
181
|
+
groupedFieldSet,
|
|
182
|
+
patches,
|
|
183
|
+
visitedFragmentNames
|
|
184
|
+
);
|
|
185
|
+
}
|
|
79
186
|
break;
|
|
80
187
|
}
|
|
81
188
|
}
|
|
82
189
|
}
|
|
83
|
-
return fields;
|
|
84
190
|
}
|
|
85
191
|
function shouldIncludeNode(resolvers, variableValues, node) {
|
|
86
192
|
var _a;
|
|
@@ -149,3 +255,24 @@ function getSubTypes(resolvers, abstractTypes, conditionalType) {
|
|
|
149
255
|
function getFieldEntryKey(node) {
|
|
150
256
|
return node.alias ? node.alias.value : node.name.value;
|
|
151
257
|
}
|
|
258
|
+
function getDeferValues(resolvers, operation, variableValues, node) {
|
|
259
|
+
const defer = (0, import_values.getDirectiveValues)(
|
|
260
|
+
import_directives.GraphQLDeferDirective,
|
|
261
|
+
node,
|
|
262
|
+
resolvers,
|
|
263
|
+
variableValues
|
|
264
|
+
);
|
|
265
|
+
if (!defer) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (defer.if === false) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
(0, import_invariant.default)(
|
|
272
|
+
operation.operation !== "subscription",
|
|
273
|
+
"`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`."
|
|
274
|
+
);
|
|
275
|
+
return {
|
|
276
|
+
label: typeof defer.label === "string" ? defer.label : void 0
|
|
277
|
+
};
|
|
278
|
+
}
|
package/lib/collectFields.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/collectFields.ts"],
|
|
4
|
-
"sourcesContent": ["import { Kind } from \"graphql\";\nimport {\n FieldNode,\n FragmentDefinitionNode,\n InlineFragmentNode,\n SelectionNode,\n SelectionSetNode,\n} from \"@graphitation/supermassive-ast\";\nimport type { ObjMap } from \"./jsutils/ObjMap\";\nimport { getDirectiveValues } from \"./values\";\nimport { GraphQLSkipDirective, GraphQLIncludeDirective } from \"./directives\";\nimport { typeNameFromAST } from \"./utilities/typeNameFromAST\";\nimport { isUnionResolverType, isInterfaceResolverType } from \"./definition\";\n\nimport { Resolvers } from \"./types\";\n\n/**\n * Given a selectionSet, adds all of the fields in that selection to\n * the passed in map of fields, and returns it at the end.\n *\n * CollectFields requires the \"runtime type\" of an object. For a field which\n * returns an Interface or Union type, the \"runtime type\" will be the actual\n * Object type returned by that field.\n *\n * @internal\n */\nexport function collectFields(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n runtimeTypeName: string,\n selectionSet: SelectionSetNode,\n fields: Map<string, Array<FieldNode>>,\n visitedFragmentNames: Set<string>,\n): Map<string, Array<FieldNode>> {\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD: {\n if (!shouldIncludeNode(resolvers, variableValues, selection)) {\n continue;\n }\n const name = getFieldEntryKey(selection);\n const fieldList = fields.get(name);\n if (fieldList !== undefined) {\n fieldList.push(selection);\n } else {\n fields.set(name, [selection]);\n }\n break;\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n !shouldIncludeNode(resolvers, variableValues, selection) ||\n !doesFragmentConditionMatch(selection, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n collectFields(\n resolvers,\n fragments,\n variableValues,\n runtimeTypeName,\n selection.selectionSet,\n fields,\n visitedFragmentNames,\n );\n break;\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragName = selection.name.value;\n if (\n visitedFragmentNames.has(fragName) ||\n !shouldIncludeNode(resolvers, variableValues, selection)\n ) {\n continue;\n }\n visitedFragmentNames.add(fragName);\n const fragment = fragments[fragName];\n if (\n !fragment ||\n !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n collectFields(\n resolvers,\n fragments,\n variableValues,\n runtimeTypeName,\n fragment.selectionSet,\n fields,\n visitedFragmentNames,\n );\n break;\n }\n }\n }\n return fields;\n}\n\n/**\n * Determines if a field should be included based on the @include and @skip\n * directives, where @skip has higher precedence than @include.\n */\nfunction shouldIncludeNode(\n resolvers: Resolvers,\n variableValues: { [variable: string]: unknown },\n node: SelectionNode,\n): boolean {\n if (!node.directives?.length) {\n return true;\n }\n\n const skip = getDirectiveValues(\n GraphQLSkipDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n if (skip?.if === true) {\n return false;\n }\n\n const include = getDirectiveValues(\n GraphQLIncludeDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n\n if (include?.if === false) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Determines if a fragment is applicable to the given type.\n */\nfunction doesFragmentConditionMatch(\n fragment: FragmentDefinitionNode | InlineFragmentNode,\n typeName: string,\n resolvers: Resolvers,\n): boolean {\n const typeConditionNode = fragment.typeCondition;\n if (!typeConditionNode) {\n return true;\n }\n\n const conditionalType = typeNameFromAST(typeConditionNode);\n\n if (conditionalType === typeName) {\n return true;\n }\n\n const subTypes = getSubTypes(resolvers, new Set(), conditionalType);\n\n return subTypes.has(typeName);\n}\n\nfunction getSubTypes(\n resolvers: Resolvers,\n abstractTypes: Set<string>,\n conditionalType: string,\n): Set<string> {\n const resolver = resolvers[conditionalType];\n if (isInterfaceResolverType(resolver)) {\n const result = resolver.__implementedBy.reduce(\n (acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n },\n [],\n );\n\n return new Set([...result]);\n }\n\n if (isUnionResolverType(resolver)) {\n const result = resolver.__types.reduce((acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n }, []);\n\n return new Set([...result]);\n }\n\n return abstractTypes;\n}\n\n/**\n * Implements the logic to compute the key of a given field's entry\n */\nfunction getFieldEntryKey(node: FieldNode): string {\n return node.alias ? node.alias.value : node.name.value;\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import { Kind } from \"graphql\";\nimport {\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n OperationDefinitionNode,\n SelectionNode,\n SelectionSetNode,\n} from \"./supermassive-ast\";\nimport type { ObjMap } from \"./jsutils/ObjMap\";\nimport { getDirectiveValues } from \"./values\";\nimport {\n GraphQLSkipDirective,\n GraphQLIncludeDirective,\n GraphQLDeferDirective,\n} from \"./directives\";\nimport { typeNameFromAST } from \"./utilities/typeNameFromAST\";\nimport { isUnionResolverType, isInterfaceResolverType } from \"./definition\";\n\nimport { Resolvers } from \"./types\";\n\nimport { AccumulatorMap } from \"./jsutils/AccumulatorMap\";\nimport invariant from \"invariant\";\n\nexport type FieldGroup = ReadonlyArray<FieldNode>;\n\nexport type GroupedFieldSet = Map<string, FieldGroup>;\n\nexport interface PatchFields {\n label: string | undefined;\n groupedFieldSet: GroupedFieldSet;\n}\n\nexport interface FieldsAndPatches {\n groupedFieldSet: GroupedFieldSet;\n patches: Array<PatchFields>;\n}\n\n/**\n * Given a selectionSet, collects all of the fields and returns them.\n *\n * CollectFields requires the \"runtime type\" of an object. For a field that\n * returns an Interface or Union type, the \"runtime type\" will be the actual\n * object type returned by that field.\n *\n * @internal\n */\nexport function collectFields(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n runtimeTypeName: string,\n operation: OperationDefinitionNode,\n): FieldsAndPatches {\n const groupedFieldSet = new AccumulatorMap<string, FieldNode>();\n const patches: Array<PatchFields> = [];\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n operation.selectionSet,\n groupedFieldSet,\n patches,\n new Set(),\n );\n return { groupedFieldSet, patches };\n}\n\n/**\n * Given an array of field nodes, collects all of the subfields of the passed\n * in fields, and returns them at the end.\n *\n * CollectSubFields requires the \"return type\" of an object. For a field that\n * returns an Interface or Union type, the \"return type\" will be the actual\n * object type returned by that field.\n *\n * @internal\n */\n// eslint-disable-next-line max-params\nexport function collectSubfields(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n operation: OperationDefinitionNode,\n returnTypeName: string,\n fieldGroup: FieldGroup,\n): FieldsAndPatches {\n const subGroupedFieldSet = new AccumulatorMap<string, FieldNode>();\n const visitedFragmentNames = new Set<string>();\n\n const subPatches: Array<PatchFields> = [];\n const subFieldsAndPatches = {\n groupedFieldSet: subGroupedFieldSet,\n patches: subPatches,\n };\n\n for (const node of fieldGroup) {\n if (node.selectionSet) {\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n returnTypeName,\n node.selectionSet,\n subGroupedFieldSet,\n subPatches,\n visitedFragmentNames,\n );\n }\n }\n return subFieldsAndPatches;\n}\n\n// eslint-disable-next-line max-params\nfunction collectFieldsImpl(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n operation: OperationDefinitionNode,\n runtimeTypeName: string,\n selectionSet: SelectionSetNode,\n groupedFieldSet: AccumulatorMap<string, FieldNode>,\n patches: Array<PatchFields>,\n visitedFragmentNames: Set<string>,\n): void {\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD: {\n if (!shouldIncludeNode(resolvers, variableValues, selection)) {\n continue;\n }\n groupedFieldSet.add(getFieldEntryKey(selection), selection);\n break;\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n !shouldIncludeNode(resolvers, variableValues, selection) ||\n !doesFragmentConditionMatch(selection, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n\n const defer = getDeferValues(\n resolvers,\n operation,\n variableValues,\n selection,\n );\n\n if (defer) {\n const patchFields = new AccumulatorMap<string, FieldNode>();\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n selection.selectionSet,\n patchFields,\n patches,\n visitedFragmentNames,\n );\n patches.push({\n label: defer.label,\n groupedFieldSet: patchFields,\n });\n } else {\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n selection.selectionSet,\n groupedFieldSet,\n patches,\n visitedFragmentNames,\n );\n }\n break;\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragName = selection.name.value;\n\n if (!shouldIncludeNode(resolvers, variableValues, selection)) {\n continue;\n }\n\n const defer = getDeferValues(\n resolvers,\n operation,\n variableValues,\n selection,\n );\n if (visitedFragmentNames.has(fragName) && !defer) {\n continue;\n }\n\n const fragment = fragments[fragName];\n if (\n fragment == null ||\n !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n\n if (!defer) {\n visitedFragmentNames.add(fragName);\n }\n\n if (defer) {\n const patchFields = new AccumulatorMap<string, FieldNode>();\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n fragment.selectionSet,\n patchFields,\n patches,\n visitedFragmentNames,\n );\n patches.push({\n label: defer.label,\n groupedFieldSet: patchFields,\n });\n } else {\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n fragment.selectionSet,\n groupedFieldSet,\n patches,\n visitedFragmentNames,\n );\n }\n break;\n }\n }\n }\n}\n\n/**\n * Determines if a field should be included based on the @include and @skip\n * directives, where @skip has higher precedence than @include.\n */\nfunction shouldIncludeNode(\n resolvers: Resolvers,\n variableValues: { [variable: string]: unknown },\n node: SelectionNode,\n): boolean {\n if (!node.directives?.length) {\n return true;\n }\n\n const skip = getDirectiveValues(\n GraphQLSkipDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n if (skip?.if === true) {\n return false;\n }\n\n const include = getDirectiveValues(\n GraphQLIncludeDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n\n if (include?.if === false) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Determines if a fragment is applicable to the given type.\n */\nfunction doesFragmentConditionMatch(\n fragment: FragmentDefinitionNode | InlineFragmentNode,\n typeName: string,\n resolvers: Resolvers,\n): boolean {\n const typeConditionNode = fragment.typeCondition;\n if (!typeConditionNode) {\n return true;\n }\n\n const conditionalType = typeNameFromAST(typeConditionNode);\n\n if (conditionalType === typeName) {\n return true;\n }\n\n const subTypes = getSubTypes(resolvers, new Set(), conditionalType);\n\n return subTypes.has(typeName);\n}\n\nfunction getSubTypes(\n resolvers: Resolvers,\n abstractTypes: Set<string>,\n conditionalType: string,\n): Set<string> {\n const resolver = resolvers[conditionalType];\n if (isInterfaceResolverType(resolver)) {\n const result = resolver.__implementedBy.reduce(\n (acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n },\n [],\n );\n\n return new Set([...result]);\n }\n\n if (isUnionResolverType(resolver)) {\n const result = resolver.__types.reduce((acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n }, []);\n\n return new Set([...result]);\n }\n\n return abstractTypes;\n}\n\n/**\n * Implements the logic to compute the key of a given field's entry\n */\nfunction getFieldEntryKey(node: FieldNode): string {\n return node.alias ? node.alias.value : node.name.value;\n}\n\n/**\n * Returns an object containing the `@defer` arguments if a field should be\n * deferred based on the experimental flag, defer directive present and\n * not disabled by the \"if\" argument.\n */\nfunction getDeferValues(\n resolvers: Resolvers,\n operation: OperationDefinitionNode,\n variableValues: { [variable: string]: unknown },\n node: FragmentSpreadNode | InlineFragmentNode,\n): undefined | { label: string | undefined } {\n const defer = getDirectiveValues(\n GraphQLDeferDirective,\n node,\n resolvers,\n variableValues,\n );\n\n if (!defer) {\n return;\n }\n\n if (defer.if === false) {\n return;\n }\n\n invariant(\n operation.operation !== \"subscription\",\n \"`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.\",\n );\n\n return {\n label: typeof defer.label === \"string\" ? defer.label : undefined,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["invariant"]
|
|
7
7
|
}
|
package/lib/collectFields.mjs
CHANGED
|
@@ -1,64 +1,163 @@
|
|
|
1
1
|
// src/collectFields.ts
|
|
2
2
|
import { Kind } from "graphql";
|
|
3
3
|
import { getDirectiveValues } from "./values.mjs";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
GraphQLSkipDirective,
|
|
6
|
+
GraphQLIncludeDirective,
|
|
7
|
+
GraphQLDeferDirective
|
|
8
|
+
} from "./directives.mjs";
|
|
5
9
|
import { typeNameFromAST } from "./utilities/typeNameFromAST.mjs";
|
|
6
10
|
import { isUnionResolverType, isInterfaceResolverType } from "./definition.mjs";
|
|
7
|
-
|
|
11
|
+
import { AccumulatorMap } from "./jsutils/AccumulatorMap.mjs";
|
|
12
|
+
import invariant from "invariant";
|
|
13
|
+
function collectFields(resolvers, fragments, variableValues, runtimeTypeName, operation) {
|
|
14
|
+
const groupedFieldSet = new AccumulatorMap();
|
|
15
|
+
const patches = [];
|
|
16
|
+
collectFieldsImpl(
|
|
17
|
+
resolvers,
|
|
18
|
+
fragments,
|
|
19
|
+
variableValues,
|
|
20
|
+
operation,
|
|
21
|
+
runtimeTypeName,
|
|
22
|
+
operation.selectionSet,
|
|
23
|
+
groupedFieldSet,
|
|
24
|
+
patches,
|
|
25
|
+
/* @__PURE__ */ new Set()
|
|
26
|
+
);
|
|
27
|
+
return { groupedFieldSet, patches };
|
|
28
|
+
}
|
|
29
|
+
function collectSubfields(resolvers, fragments, variableValues, operation, returnTypeName, fieldGroup) {
|
|
30
|
+
const subGroupedFieldSet = new AccumulatorMap();
|
|
31
|
+
const visitedFragmentNames = /* @__PURE__ */ new Set();
|
|
32
|
+
const subPatches = [];
|
|
33
|
+
const subFieldsAndPatches = {
|
|
34
|
+
groupedFieldSet: subGroupedFieldSet,
|
|
35
|
+
patches: subPatches
|
|
36
|
+
};
|
|
37
|
+
for (const node of fieldGroup) {
|
|
38
|
+
if (node.selectionSet) {
|
|
39
|
+
collectFieldsImpl(
|
|
40
|
+
resolvers,
|
|
41
|
+
fragments,
|
|
42
|
+
variableValues,
|
|
43
|
+
operation,
|
|
44
|
+
returnTypeName,
|
|
45
|
+
node.selectionSet,
|
|
46
|
+
subGroupedFieldSet,
|
|
47
|
+
subPatches,
|
|
48
|
+
visitedFragmentNames
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return subFieldsAndPatches;
|
|
53
|
+
}
|
|
54
|
+
function collectFieldsImpl(resolvers, fragments, variableValues, operation, runtimeTypeName, selectionSet, groupedFieldSet, patches, visitedFragmentNames) {
|
|
8
55
|
for (const selection of selectionSet.selections) {
|
|
9
56
|
switch (selection.kind) {
|
|
10
57
|
case Kind.FIELD: {
|
|
11
58
|
if (!shouldIncludeNode(resolvers, variableValues, selection)) {
|
|
12
59
|
continue;
|
|
13
60
|
}
|
|
14
|
-
|
|
15
|
-
const fieldList = fields.get(name);
|
|
16
|
-
if (fieldList !== void 0) {
|
|
17
|
-
fieldList.push(selection);
|
|
18
|
-
} else {
|
|
19
|
-
fields.set(name, [selection]);
|
|
20
|
-
}
|
|
61
|
+
groupedFieldSet.add(getFieldEntryKey(selection), selection);
|
|
21
62
|
break;
|
|
22
63
|
}
|
|
23
64
|
case Kind.INLINE_FRAGMENT: {
|
|
24
65
|
if (!shouldIncludeNode(resolvers, variableValues, selection) || !doesFragmentConditionMatch(selection, runtimeTypeName, resolvers)) {
|
|
25
66
|
continue;
|
|
26
67
|
}
|
|
27
|
-
|
|
68
|
+
const defer = getDeferValues(
|
|
28
69
|
resolvers,
|
|
29
|
-
|
|
70
|
+
operation,
|
|
30
71
|
variableValues,
|
|
31
|
-
|
|
32
|
-
selection.selectionSet,
|
|
33
|
-
fields,
|
|
34
|
-
visitedFragmentNames
|
|
72
|
+
selection
|
|
35
73
|
);
|
|
74
|
+
if (defer) {
|
|
75
|
+
const patchFields = new AccumulatorMap();
|
|
76
|
+
collectFieldsImpl(
|
|
77
|
+
resolvers,
|
|
78
|
+
fragments,
|
|
79
|
+
variableValues,
|
|
80
|
+
operation,
|
|
81
|
+
runtimeTypeName,
|
|
82
|
+
selection.selectionSet,
|
|
83
|
+
patchFields,
|
|
84
|
+
patches,
|
|
85
|
+
visitedFragmentNames
|
|
86
|
+
);
|
|
87
|
+
patches.push({
|
|
88
|
+
label: defer.label,
|
|
89
|
+
groupedFieldSet: patchFields
|
|
90
|
+
});
|
|
91
|
+
} else {
|
|
92
|
+
collectFieldsImpl(
|
|
93
|
+
resolvers,
|
|
94
|
+
fragments,
|
|
95
|
+
variableValues,
|
|
96
|
+
operation,
|
|
97
|
+
runtimeTypeName,
|
|
98
|
+
selection.selectionSet,
|
|
99
|
+
groupedFieldSet,
|
|
100
|
+
patches,
|
|
101
|
+
visitedFragmentNames
|
|
102
|
+
);
|
|
103
|
+
}
|
|
36
104
|
break;
|
|
37
105
|
}
|
|
38
106
|
case Kind.FRAGMENT_SPREAD: {
|
|
39
107
|
const fragName = selection.name.value;
|
|
40
|
-
if (
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
visitedFragmentNames.add(fragName);
|
|
44
|
-
const fragment = fragments[fragName];
|
|
45
|
-
if (!fragment || !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)) {
|
|
108
|
+
if (!shouldIncludeNode(resolvers, variableValues, selection)) {
|
|
46
109
|
continue;
|
|
47
110
|
}
|
|
48
|
-
|
|
111
|
+
const defer = getDeferValues(
|
|
49
112
|
resolvers,
|
|
50
|
-
|
|
113
|
+
operation,
|
|
51
114
|
variableValues,
|
|
52
|
-
|
|
53
|
-
fragment.selectionSet,
|
|
54
|
-
fields,
|
|
55
|
-
visitedFragmentNames
|
|
115
|
+
selection
|
|
56
116
|
);
|
|
117
|
+
if (visitedFragmentNames.has(fragName) && !defer) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const fragment = fragments[fragName];
|
|
121
|
+
if (fragment == null || !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!defer) {
|
|
125
|
+
visitedFragmentNames.add(fragName);
|
|
126
|
+
}
|
|
127
|
+
if (defer) {
|
|
128
|
+
const patchFields = new AccumulatorMap();
|
|
129
|
+
collectFieldsImpl(
|
|
130
|
+
resolvers,
|
|
131
|
+
fragments,
|
|
132
|
+
variableValues,
|
|
133
|
+
operation,
|
|
134
|
+
runtimeTypeName,
|
|
135
|
+
fragment.selectionSet,
|
|
136
|
+
patchFields,
|
|
137
|
+
patches,
|
|
138
|
+
visitedFragmentNames
|
|
139
|
+
);
|
|
140
|
+
patches.push({
|
|
141
|
+
label: defer.label,
|
|
142
|
+
groupedFieldSet: patchFields
|
|
143
|
+
});
|
|
144
|
+
} else {
|
|
145
|
+
collectFieldsImpl(
|
|
146
|
+
resolvers,
|
|
147
|
+
fragments,
|
|
148
|
+
variableValues,
|
|
149
|
+
operation,
|
|
150
|
+
runtimeTypeName,
|
|
151
|
+
fragment.selectionSet,
|
|
152
|
+
groupedFieldSet,
|
|
153
|
+
patches,
|
|
154
|
+
visitedFragmentNames
|
|
155
|
+
);
|
|
156
|
+
}
|
|
57
157
|
break;
|
|
58
158
|
}
|
|
59
159
|
}
|
|
60
160
|
}
|
|
61
|
-
return fields;
|
|
62
161
|
}
|
|
63
162
|
function shouldIncludeNode(resolvers, variableValues, node) {
|
|
64
163
|
var _a;
|
|
@@ -127,6 +226,28 @@ function getSubTypes(resolvers, abstractTypes, conditionalType) {
|
|
|
127
226
|
function getFieldEntryKey(node) {
|
|
128
227
|
return node.alias ? node.alias.value : node.name.value;
|
|
129
228
|
}
|
|
229
|
+
function getDeferValues(resolvers, operation, variableValues, node) {
|
|
230
|
+
const defer = getDirectiveValues(
|
|
231
|
+
GraphQLDeferDirective,
|
|
232
|
+
node,
|
|
233
|
+
resolvers,
|
|
234
|
+
variableValues
|
|
235
|
+
);
|
|
236
|
+
if (!defer) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (defer.if === false) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
invariant(
|
|
243
|
+
operation.operation !== "subscription",
|
|
244
|
+
"`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`."
|
|
245
|
+
);
|
|
246
|
+
return {
|
|
247
|
+
label: typeof defer.label === "string" ? defer.label : void 0
|
|
248
|
+
};
|
|
249
|
+
}
|
|
130
250
|
export {
|
|
131
|
-
collectFields
|
|
251
|
+
collectFields,
|
|
252
|
+
collectSubfields
|
|
132
253
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/collectFields.ts"],
|
|
4
|
-
"sourcesContent": ["import { Kind } from \"graphql\";\nimport {\n FieldNode,\n FragmentDefinitionNode,\n InlineFragmentNode,\n SelectionNode,\n SelectionSetNode,\n} from \"@graphitation/supermassive-ast\";\nimport type { ObjMap } from \"./jsutils/ObjMap\";\nimport { getDirectiveValues } from \"./values\";\nimport { GraphQLSkipDirective, GraphQLIncludeDirective } from \"./directives\";\nimport { typeNameFromAST } from \"./utilities/typeNameFromAST\";\nimport { isUnionResolverType, isInterfaceResolverType } from \"./definition\";\n\nimport { Resolvers } from \"./types\";\n\n/**\n * Given a selectionSet, adds all of the fields in that selection to\n * the passed in map of fields, and returns it at the end.\n *\n * CollectFields requires the \"runtime type\" of an object. For a field which\n * returns an Interface or Union type, the \"runtime type\" will be the actual\n * Object type returned by that field.\n *\n * @internal\n */\nexport function collectFields(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n runtimeTypeName: string,\n selectionSet: SelectionSetNode,\n fields: Map<string, Array<FieldNode>>,\n visitedFragmentNames: Set<string>,\n): Map<string, Array<FieldNode>> {\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD: {\n if (!shouldIncludeNode(resolvers, variableValues, selection)) {\n continue;\n }\n const name = getFieldEntryKey(selection);\n const fieldList = fields.get(name);\n if (fieldList !== undefined) {\n fieldList.push(selection);\n } else {\n fields.set(name, [selection]);\n }\n break;\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n !shouldIncludeNode(resolvers, variableValues, selection) ||\n !doesFragmentConditionMatch(selection, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n collectFields(\n resolvers,\n fragments,\n variableValues,\n runtimeTypeName,\n selection.selectionSet,\n fields,\n visitedFragmentNames,\n );\n break;\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragName = selection.name.value;\n if (\n visitedFragmentNames.has(fragName) ||\n !shouldIncludeNode(resolvers, variableValues, selection)\n ) {\n continue;\n }\n visitedFragmentNames.add(fragName);\n const fragment = fragments[fragName];\n if (\n !fragment ||\n !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n collectFields(\n resolvers,\n fragments,\n variableValues,\n runtimeTypeName,\n fragment.selectionSet,\n fields,\n visitedFragmentNames,\n );\n break;\n }\n }\n }\n return fields;\n}\n\n/**\n * Determines if a field should be included based on the @include and @skip\n * directives, where @skip has higher precedence than @include.\n */\nfunction shouldIncludeNode(\n resolvers: Resolvers,\n variableValues: { [variable: string]: unknown },\n node: SelectionNode,\n): boolean {\n if (!node.directives?.length) {\n return true;\n }\n\n const skip = getDirectiveValues(\n GraphQLSkipDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n if (skip?.if === true) {\n return false;\n }\n\n const include = getDirectiveValues(\n GraphQLIncludeDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n\n if (include?.if === false) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Determines if a fragment is applicable to the given type.\n */\nfunction doesFragmentConditionMatch(\n fragment: FragmentDefinitionNode | InlineFragmentNode,\n typeName: string,\n resolvers: Resolvers,\n): boolean {\n const typeConditionNode = fragment.typeCondition;\n if (!typeConditionNode) {\n return true;\n }\n\n const conditionalType = typeNameFromAST(typeConditionNode);\n\n if (conditionalType === typeName) {\n return true;\n }\n\n const subTypes = getSubTypes(resolvers, new Set(), conditionalType);\n\n return subTypes.has(typeName);\n}\n\nfunction getSubTypes(\n resolvers: Resolvers,\n abstractTypes: Set<string>,\n conditionalType: string,\n): Set<string> {\n const resolver = resolvers[conditionalType];\n if (isInterfaceResolverType(resolver)) {\n const result = resolver.__implementedBy.reduce(\n (acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n },\n [],\n );\n\n return new Set([...result]);\n }\n\n if (isUnionResolverType(resolver)) {\n const result = resolver.__types.reduce((acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n }, []);\n\n return new Set([...result]);\n }\n\n return abstractTypes;\n}\n\n/**\n * Implements the logic to compute the key of a given field's entry\n */\nfunction getFieldEntryKey(node: FieldNode): string {\n return node.alias ? node.alias.value : node.name.value;\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,YAAY;
|
|
4
|
+
"sourcesContent": ["import { Kind } from \"graphql\";\nimport {\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n OperationDefinitionNode,\n SelectionNode,\n SelectionSetNode,\n} from \"./supermassive-ast\";\nimport type { ObjMap } from \"./jsutils/ObjMap\";\nimport { getDirectiveValues } from \"./values\";\nimport {\n GraphQLSkipDirective,\n GraphQLIncludeDirective,\n GraphQLDeferDirective,\n} from \"./directives\";\nimport { typeNameFromAST } from \"./utilities/typeNameFromAST\";\nimport { isUnionResolverType, isInterfaceResolverType } from \"./definition\";\n\nimport { Resolvers } from \"./types\";\n\nimport { AccumulatorMap } from \"./jsutils/AccumulatorMap\";\nimport invariant from \"invariant\";\n\nexport type FieldGroup = ReadonlyArray<FieldNode>;\n\nexport type GroupedFieldSet = Map<string, FieldGroup>;\n\nexport interface PatchFields {\n label: string | undefined;\n groupedFieldSet: GroupedFieldSet;\n}\n\nexport interface FieldsAndPatches {\n groupedFieldSet: GroupedFieldSet;\n patches: Array<PatchFields>;\n}\n\n/**\n * Given a selectionSet, collects all of the fields and returns them.\n *\n * CollectFields requires the \"runtime type\" of an object. For a field that\n * returns an Interface or Union type, the \"runtime type\" will be the actual\n * object type returned by that field.\n *\n * @internal\n */\nexport function collectFields(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n runtimeTypeName: string,\n operation: OperationDefinitionNode,\n): FieldsAndPatches {\n const groupedFieldSet = new AccumulatorMap<string, FieldNode>();\n const patches: Array<PatchFields> = [];\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n operation.selectionSet,\n groupedFieldSet,\n patches,\n new Set(),\n );\n return { groupedFieldSet, patches };\n}\n\n/**\n * Given an array of field nodes, collects all of the subfields of the passed\n * in fields, and returns them at the end.\n *\n * CollectSubFields requires the \"return type\" of an object. For a field that\n * returns an Interface or Union type, the \"return type\" will be the actual\n * object type returned by that field.\n *\n * @internal\n */\n// eslint-disable-next-line max-params\nexport function collectSubfields(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n operation: OperationDefinitionNode,\n returnTypeName: string,\n fieldGroup: FieldGroup,\n): FieldsAndPatches {\n const subGroupedFieldSet = new AccumulatorMap<string, FieldNode>();\n const visitedFragmentNames = new Set<string>();\n\n const subPatches: Array<PatchFields> = [];\n const subFieldsAndPatches = {\n groupedFieldSet: subGroupedFieldSet,\n patches: subPatches,\n };\n\n for (const node of fieldGroup) {\n if (node.selectionSet) {\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n returnTypeName,\n node.selectionSet,\n subGroupedFieldSet,\n subPatches,\n visitedFragmentNames,\n );\n }\n }\n return subFieldsAndPatches;\n}\n\n// eslint-disable-next-line max-params\nfunction collectFieldsImpl(\n resolvers: Resolvers,\n fragments: ObjMap<FragmentDefinitionNode>,\n variableValues: { [variable: string]: unknown },\n operation: OperationDefinitionNode,\n runtimeTypeName: string,\n selectionSet: SelectionSetNode,\n groupedFieldSet: AccumulatorMap<string, FieldNode>,\n patches: Array<PatchFields>,\n visitedFragmentNames: Set<string>,\n): void {\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD: {\n if (!shouldIncludeNode(resolvers, variableValues, selection)) {\n continue;\n }\n groupedFieldSet.add(getFieldEntryKey(selection), selection);\n break;\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n !shouldIncludeNode(resolvers, variableValues, selection) ||\n !doesFragmentConditionMatch(selection, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n\n const defer = getDeferValues(\n resolvers,\n operation,\n variableValues,\n selection,\n );\n\n if (defer) {\n const patchFields = new AccumulatorMap<string, FieldNode>();\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n selection.selectionSet,\n patchFields,\n patches,\n visitedFragmentNames,\n );\n patches.push({\n label: defer.label,\n groupedFieldSet: patchFields,\n });\n } else {\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n selection.selectionSet,\n groupedFieldSet,\n patches,\n visitedFragmentNames,\n );\n }\n break;\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragName = selection.name.value;\n\n if (!shouldIncludeNode(resolvers, variableValues, selection)) {\n continue;\n }\n\n const defer = getDeferValues(\n resolvers,\n operation,\n variableValues,\n selection,\n );\n if (visitedFragmentNames.has(fragName) && !defer) {\n continue;\n }\n\n const fragment = fragments[fragName];\n if (\n fragment == null ||\n !doesFragmentConditionMatch(fragment, runtimeTypeName, resolvers)\n ) {\n continue;\n }\n\n if (!defer) {\n visitedFragmentNames.add(fragName);\n }\n\n if (defer) {\n const patchFields = new AccumulatorMap<string, FieldNode>();\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n fragment.selectionSet,\n patchFields,\n patches,\n visitedFragmentNames,\n );\n patches.push({\n label: defer.label,\n groupedFieldSet: patchFields,\n });\n } else {\n collectFieldsImpl(\n resolvers,\n fragments,\n variableValues,\n operation,\n runtimeTypeName,\n fragment.selectionSet,\n groupedFieldSet,\n patches,\n visitedFragmentNames,\n );\n }\n break;\n }\n }\n }\n}\n\n/**\n * Determines if a field should be included based on the @include and @skip\n * directives, where @skip has higher precedence than @include.\n */\nfunction shouldIncludeNode(\n resolvers: Resolvers,\n variableValues: { [variable: string]: unknown },\n node: SelectionNode,\n): boolean {\n if (!node.directives?.length) {\n return true;\n }\n\n const skip = getDirectiveValues(\n GraphQLSkipDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n if (skip?.if === true) {\n return false;\n }\n\n const include = getDirectiveValues(\n GraphQLIncludeDirective,\n node as SelectionNode,\n resolvers,\n variableValues,\n );\n\n if (include?.if === false) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Determines if a fragment is applicable to the given type.\n */\nfunction doesFragmentConditionMatch(\n fragment: FragmentDefinitionNode | InlineFragmentNode,\n typeName: string,\n resolvers: Resolvers,\n): boolean {\n const typeConditionNode = fragment.typeCondition;\n if (!typeConditionNode) {\n return true;\n }\n\n const conditionalType = typeNameFromAST(typeConditionNode);\n\n if (conditionalType === typeName) {\n return true;\n }\n\n const subTypes = getSubTypes(resolvers, new Set(), conditionalType);\n\n return subTypes.has(typeName);\n}\n\nfunction getSubTypes(\n resolvers: Resolvers,\n abstractTypes: Set<string>,\n conditionalType: string,\n): Set<string> {\n const resolver = resolvers[conditionalType];\n if (isInterfaceResolverType(resolver)) {\n const result = resolver.__implementedBy.reduce(\n (acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n },\n [],\n );\n\n return new Set([...result]);\n }\n\n if (isUnionResolverType(resolver)) {\n const result = resolver.__types.reduce((acc: string[], item: string) => {\n if (!abstractTypes.has(item)) {\n const newTypes = new Set([...abstractTypes, item]);\n\n acc.push(...abstractTypes, ...getSubTypes(resolvers, newTypes, item));\n }\n return acc;\n }, []);\n\n return new Set([...result]);\n }\n\n return abstractTypes;\n}\n\n/**\n * Implements the logic to compute the key of a given field's entry\n */\nfunction getFieldEntryKey(node: FieldNode): string {\n return node.alias ? node.alias.value : node.name.value;\n}\n\n/**\n * Returns an object containing the `@defer` arguments if a field should be\n * deferred based on the experimental flag, defer directive present and\n * not disabled by the \"if\" argument.\n */\nfunction getDeferValues(\n resolvers: Resolvers,\n operation: OperationDefinitionNode,\n variableValues: { [variable: string]: unknown },\n node: FragmentSpreadNode | InlineFragmentNode,\n): undefined | { label: string | undefined } {\n const defer = getDirectiveValues(\n GraphQLDeferDirective,\n node,\n resolvers,\n variableValues,\n );\n\n if (!defer) {\n return;\n }\n\n if (defer.if === false) {\n return;\n }\n\n invariant(\n operation.operation !== \"subscription\",\n \"`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.\",\n );\n\n return {\n label: typeof defer.label === \"string\" ? defer.label : undefined,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/lib/definition.js
CHANGED
|
@@ -33,7 +33,7 @@ function defineArguments(config) {
|
|
|
33
33
|
type: argConfig.type,
|
|
34
34
|
defaultValue: argConfig.defaultValue,
|
|
35
35
|
deprecationReason: argConfig.deprecationReason,
|
|
36
|
-
extensions: argConfig.extensions
|
|
36
|
+
extensions: argConfig.extensions ? (0, import_toObjMap.toObjMap)(argConfig.extensions) : {},
|
|
37
37
|
astNode: argConfig.astNode
|
|
38
38
|
}));
|
|
39
39
|
}
|