@graphitation/supermassive 2.6.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.
Files changed (128) hide show
  1. package/.eslintcache +1 -1
  2. package/CHANGELOG.md +10 -2
  3. package/lib/benchmarks/index.js +2 -2
  4. package/lib/benchmarks/index.js.map +2 -2
  5. package/lib/benchmarks/index.mjs +2 -2
  6. package/lib/benchmarks/index.mjs.map +2 -2
  7. package/lib/benchmarks/swapi-schema/index.d.ts +4 -2
  8. package/lib/benchmarks/swapi-schema/index.d.ts.map +1 -1
  9. package/lib/benchmarks/swapi-schema/index.js +8 -2
  10. package/lib/benchmarks/swapi-schema/index.js.map +2 -2
  11. package/lib/benchmarks/swapi-schema/index.mjs +8 -2
  12. package/lib/benchmarks/swapi-schema/index.mjs.map +2 -2
  13. package/lib/benchmarks/swapi-schema/makeExecutableSchema.d.ts +7 -0
  14. package/lib/benchmarks/swapi-schema/makeExecutableSchema.d.ts.map +1 -0
  15. package/lib/benchmarks/swapi-schema/makeExecutableSchema.js +916 -0
  16. package/lib/benchmarks/swapi-schema/makeExecutableSchema.js.map +7 -0
  17. package/lib/benchmarks/swapi-schema/makeExecutableSchema.mjs +903 -0
  18. package/lib/benchmarks/swapi-schema/makeExecutableSchema.mjs.map +7 -0
  19. package/lib/benchmarks/swapi-schema/resolvers.d.ts.map +1 -1
  20. package/lib/benchmarks/swapi-schema/resolvers.js +53 -17
  21. package/lib/benchmarks/swapi-schema/resolvers.js.map +2 -2
  22. package/lib/benchmarks/swapi-schema/resolvers.mjs +54 -18
  23. package/lib/benchmarks/swapi-schema/resolvers.mjs.map +2 -2
  24. package/lib/collectFields.d.ts +28 -6
  25. package/lib/collectFields.d.ts.map +1 -1
  26. package/lib/collectFields.js +155 -28
  27. package/lib/collectFields.js.map +3 -3
  28. package/lib/collectFields.mjs +150 -29
  29. package/lib/collectFields.mjs.map +2 -2
  30. package/lib/definition.js +1 -1
  31. package/lib/definition.js.map +2 -2
  32. package/lib/definition.mjs +1 -1
  33. package/lib/definition.mjs.map +2 -2
  34. package/lib/directives.d.ts +2 -73
  35. package/lib/directives.d.ts.map +1 -1
  36. package/lib/directives.js +10 -123
  37. package/lib/directives.js.map +2 -2
  38. package/lib/directives.mjs +13 -122
  39. package/lib/directives.mjs.map +2 -2
  40. package/lib/executeWithoutSchema.d.ts +50 -13
  41. package/lib/executeWithoutSchema.d.ts.map +1 -1
  42. package/lib/executeWithoutSchema.js +1038 -184
  43. package/lib/executeWithoutSchema.js.map +3 -3
  44. package/lib/executeWithoutSchema.mjs +1049 -186
  45. package/lib/executeWithoutSchema.mjs.map +3 -3
  46. package/lib/extractImplicitTypesRuntime.js +2 -2
  47. package/lib/extractImplicitTypesRuntime.js.map +2 -2
  48. package/lib/extractImplicitTypesRuntime.mjs +2 -2
  49. package/lib/extractImplicitTypesRuntime.mjs.map +2 -2
  50. package/lib/index.d.ts +4 -3
  51. package/lib/index.d.ts.map +1 -1
  52. package/lib/index.js +4 -1
  53. package/lib/index.js.map +2 -2
  54. package/lib/index.mjs +4 -1
  55. package/lib/index.mjs.map +2 -2
  56. package/lib/jsutils/AccumulatorMap.d.ts +8 -0
  57. package/lib/jsutils/AccumulatorMap.d.ts.map +1 -0
  58. package/lib/jsutils/AccumulatorMap.js +36 -0
  59. package/lib/jsutils/AccumulatorMap.js.map +7 -0
  60. package/lib/jsutils/AccumulatorMap.mjs +17 -0
  61. package/lib/jsutils/AccumulatorMap.mjs.map +7 -0
  62. package/lib/jsutils/didYouMean.d.ts +1 -2
  63. package/lib/jsutils/didYouMean.d.ts.map +1 -1
  64. package/lib/jsutils/didYouMean.js.map +2 -2
  65. package/lib/jsutils/didYouMean.mjs.map +2 -2
  66. package/lib/jsutils/instanceOf.js.map +2 -2
  67. package/lib/jsutils/instanceOf.mjs.map +2 -2
  68. package/lib/subscribeWithSchema.d.ts +3 -2
  69. package/lib/subscribeWithSchema.d.ts.map +1 -1
  70. package/lib/subscribeWithSchema.js.map +2 -2
  71. package/lib/subscribeWithSchema.mjs.map +2 -2
  72. package/lib/subscribeWithoutSchema.d.ts +3 -35
  73. package/lib/subscribeWithoutSchema.d.ts.map +1 -1
  74. package/lib/subscribeWithoutSchema.js +1 -163
  75. package/lib/subscribeWithoutSchema.js.map +2 -2
  76. package/lib/subscribeWithoutSchema.mjs +2 -175
  77. package/lib/subscribeWithoutSchema.mjs.map +2 -2
  78. package/lib/supermassive-ast/TypedAST.d.ts +370 -0
  79. package/lib/supermassive-ast/TypedAST.d.ts.map +1 -0
  80. package/lib/supermassive-ast/TypedAST.js +29 -0
  81. package/lib/supermassive-ast/TypedAST.js.map +7 -0
  82. package/lib/supermassive-ast/TypedAST.mjs +10 -0
  83. package/lib/supermassive-ast/TypedAST.mjs.map +7 -0
  84. package/lib/supermassive-ast/addTypesToRequestDocument.d.ts +56 -0
  85. package/lib/supermassive-ast/addTypesToRequestDocument.d.ts.map +1 -0
  86. package/lib/supermassive-ast/addTypesToRequestDocument.js +473 -0
  87. package/lib/supermassive-ast/addTypesToRequestDocument.js.map +7 -0
  88. package/lib/supermassive-ast/addTypesToRequestDocument.mjs +463 -0
  89. package/lib/supermassive-ast/addTypesToRequestDocument.mjs.map +7 -0
  90. package/lib/supermassive-ast/annotateDocumentGraphQLTransform.d.ts +3 -0
  91. package/lib/supermassive-ast/annotateDocumentGraphQLTransform.d.ts.map +1 -0
  92. package/lib/supermassive-ast/annotateDocumentGraphQLTransform.js +34 -0
  93. package/lib/supermassive-ast/annotateDocumentGraphQLTransform.js.map +7 -0
  94. package/lib/supermassive-ast/annotateDocumentGraphQLTransform.mjs +17 -0
  95. package/lib/supermassive-ast/annotateDocumentGraphQLTransform.mjs.map +7 -0
  96. package/lib/supermassive-ast/directives.d.ts +36 -0
  97. package/lib/supermassive-ast/directives.d.ts.map +1 -0
  98. package/lib/supermassive-ast/directives.js +165 -0
  99. package/lib/supermassive-ast/directives.js.map +7 -0
  100. package/lib/supermassive-ast/directives.mjs +153 -0
  101. package/lib/supermassive-ast/directives.mjs.map +7 -0
  102. package/lib/supermassive-ast/index.d.ts +6 -0
  103. package/lib/supermassive-ast/index.d.ts.map +1 -0
  104. package/lib/supermassive-ast/index.js +37 -0
  105. package/lib/supermassive-ast/index.js.map +7 -0
  106. package/lib/supermassive-ast/index.mjs +27 -0
  107. package/lib/supermassive-ast/index.mjs.map +7 -0
  108. package/lib/types.d.ts +62 -6
  109. package/lib/types.d.ts.map +1 -1
  110. package/lib/types.js +14 -0
  111. package/lib/types.js.map +2 -2
  112. package/lib/types.mjs +11 -0
  113. package/lib/types.mjs.map +3 -3
  114. package/lib/utilities/mergeResolvers.d.ts +1 -1
  115. package/lib/utilities/mergeResolvers.d.ts.map +1 -1
  116. package/lib/utilities/mergeResolvers.js.map +2 -2
  117. package/lib/utilities/mergeResolvers.mjs.map +2 -2
  118. package/lib/utilities/typeNameFromAST.d.ts +1 -1
  119. package/lib/utilities/typeNameFromAST.d.ts.map +1 -1
  120. package/lib/utilities/typeNameFromAST.js.map +1 -1
  121. package/lib/utilities/typeNameFromAST.mjs.map +1 -1
  122. package/lib/values.d.ts +2 -3
  123. package/lib/values.d.ts.map +1 -1
  124. package/lib/values.js +10 -14
  125. package/lib/values.js.map +2 -2
  126. package/lib/values.mjs +10 -14
  127. package/lib/values.mjs.map +2 -2
  128. package/package.json +2 -5
@@ -1,17 +1,39 @@
1
- import { FieldNode, FragmentDefinitionNode, SelectionSetNode } from "@graphitation/supermassive-ast";
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, adds all of the fields in that selection to
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 which
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
- * Object type returned by that field.
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, selectionSet: SelectionSetNode, fields: Map<string, Array<FieldNode>>, visitedFragmentNames: Set<string>): Map<string, Array<FieldNode>>;
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,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM/C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC;;;;;;;;;GASG;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,YAAY,EAAE,gBAAgB,EAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAgE/B"}
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"}
@@ -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
- function collectFields(resolvers, fragments, variableValues, runtimeTypeName, selectionSet, fields, visitedFragmentNames) {
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
- const name = getFieldEntryKey(selection);
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
- collectFields(
97
+ const defer = getDeferValues(
50
98
  resolvers,
51
- fragments,
99
+ operation,
52
100
  variableValues,
53
- runtimeTypeName,
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 (visitedFragmentNames.has(fragName) || !shouldIncludeNode(resolvers, variableValues, selection)) {
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
- collectFields(
140
+ const defer = getDeferValues(
71
141
  resolvers,
72
- fragments,
142
+ operation,
73
143
  variableValues,
74
- runtimeTypeName,
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
+ }
@@ -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": "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",
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAqB;AAWrB,oBAAmC;AACnC,wBAIO;AACP,6BAAgC;AAChC,wBAA6D;AAI7D,4BAA+B;AAC/B,uBAAsB;AAyBf,SAAS,cACd,WACA,WACA,gBACA,iBACA,WACkB;AAClB,QAAM,kBAAkB,IAAI,qCAAkC;AAC9D,QAAM,UAA8B,CAAC;AACrC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,oBAAI,IAAI;AAAA,EACV;AACA,SAAO,EAAE,iBAAiB,QAAQ;AACpC;AAaO,SAAS,iBACd,WACA,WACA,gBACA,WACA,gBACA,YACkB;AAClB,QAAM,qBAAqB,IAAI,qCAAkC;AACjE,QAAM,uBAAuB,oBAAI,IAAY;AAE7C,QAAM,aAAiC,CAAC;AACxC,QAAM,sBAAsB;AAAA,IAC1B,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACX;AAEA,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,cAAc;AACrB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,kBACP,WACA,WACA,gBACA,WACA,iBACA,cACA,iBACA,SACA,sBACM;AACN,aAAW,aAAa,aAAa,YAAY;AAC/C,YAAQ,UAAU,MAAM;AAAA,MACtB,KAAK,oBAAK,OAAO;AACf,YAAI,CAAC,kBAAkB,WAAW,gBAAgB,SAAS,GAAG;AAC5D;AAAA,QACF;AACA,wBAAgB,IAAI,iBAAiB,SAAS,GAAG,SAAS;AAC1D;AAAA,MACF;AAAA,MACA,KAAK,oBAAK,iBAAiB;AACzB,YACE,CAAC,kBAAkB,WAAW,gBAAgB,SAAS,KACvD,CAAC,2BAA2B,WAAW,iBAAiB,SAAS,GACjE;AACA;AAAA,QACF;AAEA,cAAM,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,OAAO;AACT,gBAAM,cAAc,IAAI,qCAAkC;AAC1D;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,KAAK;AAAA,YACX,OAAO,MAAM;AAAA,YACb,iBAAiB;AAAA,UACnB,CAAC;AAAA,QACH,OAAO;AACL;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK,oBAAK,iBAAiB;AACzB,cAAM,WAAW,UAAU,KAAK;AAEhC,YAAI,CAAC,kBAAkB,WAAW,gBAAgB,SAAS,GAAG;AAC5D;AAAA,QACF;AAEA,cAAM,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,qBAAqB,IAAI,QAAQ,KAAK,CAAC,OAAO;AAChD;AAAA,QACF;AAEA,cAAM,WAAW,UAAU,QAAQ;AACnC,YACE,YAAY,QACZ,CAAC,2BAA2B,UAAU,iBAAiB,SAAS,GAChE;AACA;AAAA,QACF;AAEA,YAAI,CAAC,OAAO;AACV,+BAAqB,IAAI,QAAQ;AAAA,QACnC;AAEA,YAAI,OAAO;AACT,gBAAM,cAAc,IAAI,qCAAkC;AAC1D;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,KAAK;AAAA,YACX,OAAO,MAAM;AAAA,YACb,iBAAiB;AAAA,UACnB,CAAC;AAAA,QACH,OAAO;AACL;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,kBACP,WACA,gBACA,MACS;AAlQX;AAmQE,MAAI,GAAC,UAAK,eAAL,mBAAiB,SAAQ;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,WAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,OAAI,6BAAM,QAAO,MAAM;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,OAAI,mCAAS,QAAO,OAAO;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,SAAS,2BACP,UACA,UACA,WACS;AACT,QAAM,oBAAoB,SAAS;AACnC,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,sBAAkB,wCAAgB,iBAAiB;AAEzD,MAAI,oBAAoB,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY,WAAW,oBAAI,IAAI,GAAG,eAAe;AAElE,SAAO,SAAS,IAAI,QAAQ;AAC9B;AAEA,SAAS,YACP,WACA,eACA,iBACa;AACb,QAAM,WAAW,UAAU,eAAe;AAC1C,UAAI,2CAAwB,QAAQ,GAAG;AACrC,UAAM,SAAS,SAAS,gBAAgB;AAAA,MACtC,CAAC,KAAe,SAAiB;AAC/B,YAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,gBAAM,WAAW,oBAAI,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC;AAEjD,cAAI,KAAK,GAAG,eAAe,GAAG,YAAY,WAAW,UAAU,IAAI,CAAC;AAAA,QACtE;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO,oBAAI,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,EAC5B;AAEA,UAAI,uCAAoB,QAAQ,GAAG;AACjC,UAAM,SAAS,SAAS,QAAQ,OAAO,CAAC,KAAe,SAAiB;AACtE,UAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,cAAM,WAAW,oBAAI,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC;AAEjD,YAAI,KAAK,GAAG,eAAe,GAAG,YAAY,WAAW,UAAU,IAAI,CAAC;AAAA,MACtE;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAEL,WAAO,oBAAI,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,EAC5B;AAEA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAyB;AACjD,SAAO,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK,KAAK;AACnD;AAOA,SAAS,eACP,WACA,WACA,gBACA,MAC2C;AAC3C,QAAM,YAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,MAAI,MAAM,OAAO,OAAO;AACtB;AAAA,EACF;AAEA,uBAAAA;AAAA,IACE,UAAU,cAAc;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,EACzD;AACF;",
6
+ "names": ["invariant"]
7
7
  }
@@ -1,64 +1,163 @@
1
1
  // src/collectFields.ts
2
2
  import { Kind } from "graphql";
3
3
  import { getDirectiveValues } from "./values.mjs";
4
- import { GraphQLSkipDirective, GraphQLIncludeDirective } from "./directives.mjs";
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
- function collectFields(resolvers, fragments, variableValues, runtimeTypeName, selectionSet, fields, visitedFragmentNames) {
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
- const name = getFieldEntryKey(selection);
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
- collectFields(
68
+ const defer = getDeferValues(
28
69
  resolvers,
29
- fragments,
70
+ operation,
30
71
  variableValues,
31
- runtimeTypeName,
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 (visitedFragmentNames.has(fragName) || !shouldIncludeNode(resolvers, variableValues, selection)) {
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
- collectFields(
111
+ const defer = getDeferValues(
49
112
  resolvers,
50
- fragments,
113
+ operation,
51
114
  variableValues,
52
- runtimeTypeName,
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": "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",
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 && (0, import_toObjMap.toObjMap)(argConfig.extensions),
36
+ extensions: argConfig.extensions ? (0, import_toObjMap.toObjMap)(argConfig.extensions) : {},
37
37
  astNode: argConfig.astNode
38
38
  }));
39
39
  }