@graphql-tools/wrap 8.4.21 → 8.5.0-alpha-b76ec274.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/cjs/generateProxyingResolvers.js +74 -0
  2. package/cjs/index.js +12 -0
  3. package/cjs/introspect.js +30 -0
  4. package/cjs/package.json +1 -0
  5. package/cjs/transforms/ExtractField.js +51 -0
  6. package/cjs/transforms/FilterInputObjectFields.js +16 -0
  7. package/cjs/transforms/FilterInterfaceFields.js +13 -0
  8. package/cjs/transforms/FilterObjectFieldDirectives.js +33 -0
  9. package/cjs/transforms/FilterObjectFields.js +13 -0
  10. package/cjs/transforms/FilterRootFields.js +18 -0
  11. package/cjs/transforms/FilterTypes.js +19 -0
  12. package/cjs/transforms/HoistField.js +176 -0
  13. package/cjs/transforms/MapFields.js +61 -0
  14. package/cjs/transforms/MapLeafValues.js +111 -0
  15. package/cjs/transforms/PruneSchema.js +12 -0
  16. package/cjs/transforms/RemoveObjectFieldDeprecations.js +25 -0
  17. package/cjs/transforms/RemoveObjectFieldDirectives.js +16 -0
  18. package/cjs/transforms/RemoveObjectFieldsWithDeprecation.js +19 -0
  19. package/cjs/transforms/RemoveObjectFieldsWithDirective.js +19 -0
  20. package/cjs/transforms/RenameInputObjectFields.js +57 -0
  21. package/cjs/transforms/RenameInterfaceFields.js +19 -0
  22. package/cjs/transforms/RenameObjectFieldArguments.js +72 -0
  23. package/cjs/transforms/RenameObjectFields.js +19 -0
  24. package/cjs/transforms/RenameRootFields.js +16 -0
  25. package/cjs/transforms/RenameRootTypes.js +57 -0
  26. package/cjs/transforms/RenameTypes.js +69 -0
  27. package/cjs/transforms/TransformCompositeFields.js +143 -0
  28. package/cjs/transforms/TransformEnumValues.js +55 -0
  29. package/cjs/transforms/TransformInputObjectFields.js +160 -0
  30. package/cjs/transforms/TransformInterfaceFields.js +35 -0
  31. package/cjs/transforms/TransformObjectFields.js +35 -0
  32. package/cjs/transforms/TransformQuery.js +89 -0
  33. package/cjs/transforms/TransformRootFields.js +41 -0
  34. package/cjs/transforms/WrapFields.js +220 -0
  35. package/cjs/transforms/WrapQuery.js +62 -0
  36. package/cjs/transforms/WrapType.js +19 -0
  37. package/cjs/transforms/index.js +71 -0
  38. package/cjs/types.js +2 -0
  39. package/cjs/wrapSchema.js +58 -0
  40. package/esm/generateProxyingResolvers.js +69 -0
  41. package/esm/index.js +5 -0
  42. package/esm/introspect.js +26 -0
  43. package/esm/transforms/ExtractField.js +48 -0
  44. package/esm/transforms/FilterInputObjectFields.js +12 -0
  45. package/esm/transforms/FilterInterfaceFields.js +9 -0
  46. package/esm/transforms/FilterObjectFieldDirectives.js +29 -0
  47. package/esm/transforms/FilterObjectFields.js +9 -0
  48. package/esm/transforms/FilterRootFields.js +14 -0
  49. package/esm/transforms/FilterTypes.js +16 -0
  50. package/esm/transforms/HoistField.js +168 -0
  51. package/esm/transforms/MapFields.js +57 -0
  52. package/esm/transforms/MapLeafValues.js +108 -0
  53. package/esm/transforms/PruneSchema.js +9 -0
  54. package/esm/transforms/RemoveObjectFieldDeprecations.js +21 -0
  55. package/esm/transforms/RemoveObjectFieldDirectives.js +12 -0
  56. package/esm/transforms/RemoveObjectFieldsWithDeprecation.js +15 -0
  57. package/esm/transforms/RemoveObjectFieldsWithDirective.js +15 -0
  58. package/esm/transforms/RenameInputObjectFields.js +53 -0
  59. package/esm/transforms/RenameInterfaceFields.js +15 -0
  60. package/esm/transforms/RenameObjectFieldArguments.js +68 -0
  61. package/esm/transforms/RenameObjectFields.js +15 -0
  62. package/esm/transforms/RenameRootFields.js +12 -0
  63. package/esm/transforms/RenameRootTypes.js +54 -0
  64. package/esm/transforms/RenameTypes.js +66 -0
  65. package/esm/transforms/TransformCompositeFields.js +140 -0
  66. package/esm/transforms/TransformEnumValues.js +51 -0
  67. package/esm/transforms/TransformInputObjectFields.js +157 -0
  68. package/esm/transforms/TransformInterfaceFields.js +31 -0
  69. package/esm/transforms/TransformObjectFields.js +31 -0
  70. package/esm/transforms/TransformQuery.js +86 -0
  71. package/esm/transforms/TransformRootFields.js +37 -0
  72. package/esm/transforms/WrapFields.js +214 -0
  73. package/esm/transforms/WrapQuery.js +59 -0
  74. package/esm/transforms/WrapType.js +15 -0
  75. package/esm/transforms/index.js +33 -0
  76. package/esm/types.js +1 -0
  77. package/esm/wrapSchema.js +54 -0
  78. package/package.json +34 -13
  79. package/{generateProxyingResolvers.d.ts → typings/generateProxyingResolvers.d.ts} +0 -0
  80. package/typings/index.d.ts +5 -0
  81. package/{introspect.d.ts → typings/introspect.d.ts} +0 -0
  82. package/{transforms → typings/transforms}/ExtractField.d.ts +0 -0
  83. package/{transforms → typings/transforms}/FilterInputObjectFields.d.ts +1 -1
  84. package/{transforms → typings/transforms}/FilterInterfaceFields.d.ts +0 -0
  85. package/{transforms → typings/transforms}/FilterObjectFieldDirectives.d.ts +0 -0
  86. package/{transforms → typings/transforms}/FilterObjectFields.d.ts +0 -0
  87. package/{transforms → typings/transforms}/FilterRootFields.d.ts +0 -0
  88. package/{transforms → typings/transforms}/FilterTypes.d.ts +0 -0
  89. package/{transforms → typings/transforms}/HoistField.d.ts +0 -0
  90. package/{transforms → typings/transforms}/MapFields.d.ts +1 -1
  91. package/{transforms → typings/transforms}/MapLeafValues.d.ts +1 -1
  92. package/{transforms → typings/transforms}/PruneSchema.d.ts +0 -0
  93. package/{transforms → typings/transforms}/RemoveObjectFieldDeprecations.d.ts +0 -0
  94. package/{transforms → typings/transforms}/RemoveObjectFieldDirectives.d.ts +0 -0
  95. package/{transforms → typings/transforms}/RemoveObjectFieldsWithDeprecation.d.ts +0 -0
  96. package/{transforms → typings/transforms}/RemoveObjectFieldsWithDirective.d.ts +0 -0
  97. package/{transforms → typings/transforms}/RenameInputObjectFields.d.ts +0 -0
  98. package/{transforms → typings/transforms}/RenameInterfaceFields.d.ts +0 -0
  99. package/{transforms → typings/transforms}/RenameObjectFieldArguments.d.ts +0 -0
  100. package/{transforms → typings/transforms}/RenameObjectFields.d.ts +0 -0
  101. package/{transforms → typings/transforms}/RenameRootFields.d.ts +0 -0
  102. package/{transforms → typings/transforms}/RenameRootTypes.d.ts +0 -0
  103. package/{transforms → typings/transforms}/RenameTypes.d.ts +0 -0
  104. package/{transforms → typings/transforms}/TransformCompositeFields.d.ts +1 -1
  105. package/{transforms → typings/transforms}/TransformEnumValues.d.ts +2 -2
  106. package/{transforms → typings/transforms}/TransformInputObjectFields.d.ts +1 -1
  107. package/{transforms → typings/transforms}/TransformInterfaceFields.d.ts +1 -1
  108. package/{transforms → typings/transforms}/TransformObjectFields.d.ts +1 -1
  109. package/{transforms → typings/transforms}/TransformQuery.d.ts +0 -0
  110. package/{transforms → typings/transforms}/TransformRootFields.d.ts +1 -1
  111. package/{transforms → typings/transforms}/WrapFields.d.ts +0 -0
  112. package/{transforms → typings/transforms}/WrapQuery.d.ts +0 -0
  113. package/{transforms → typings/transforms}/WrapType.d.ts +0 -0
  114. package/typings/transforms/index.d.ts +32 -0
  115. package/{types.d.ts → typings/types.d.ts} +0 -0
  116. package/{wrapSchema.d.ts → typings/wrapSchema.d.ts} +0 -0
  117. package/README.md +0 -5
  118. package/index.d.ts +0 -5
  119. package/index.js +0 -1806
  120. package/index.mjs +0 -1767
  121. package/transforms/index.d.ts +0 -32
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const graphql_1 = require("graphql");
4
+ const utils_1 = require("@graphql-tools/utils");
5
+ class TransformInputObjectFields {
6
+ constructor(inputFieldTransformer, inputFieldNodeTransformer, inputObjectNodeTransformer) {
7
+ this.inputFieldTransformer = inputFieldTransformer;
8
+ this.inputFieldNodeTransformer = inputFieldNodeTransformer;
9
+ this.inputObjectNodeTransformer = inputObjectNodeTransformer;
10
+ this.mapping = {};
11
+ }
12
+ _getTransformedSchema() {
13
+ const transformedSchema = this.transformedSchema;
14
+ if (transformedSchema === undefined) {
15
+ throw new Error(`The TransformInputObjectFields transform's "transformRequest" and "transformResult" methods cannot be used without first calling "transformSchema".`);
16
+ }
17
+ return transformedSchema;
18
+ }
19
+ transformSchema(originalWrappingSchema, _subschemaConfig, _transformedSchema) {
20
+ this.transformedSchema = (0, utils_1.mapSchema)(originalWrappingSchema, {
21
+ [utils_1.MapperKind.INPUT_OBJECT_FIELD]: (inputFieldConfig, fieldName, typeName) => {
22
+ const transformedInputField = this.inputFieldTransformer(typeName, fieldName, inputFieldConfig);
23
+ if (Array.isArray(transformedInputField)) {
24
+ const newFieldName = transformedInputField[0];
25
+ if (newFieldName !== fieldName) {
26
+ if (!(typeName in this.mapping)) {
27
+ this.mapping[typeName] = {};
28
+ }
29
+ this.mapping[typeName][newFieldName] = fieldName;
30
+ }
31
+ }
32
+ return transformedInputField;
33
+ },
34
+ });
35
+ return this.transformedSchema;
36
+ }
37
+ transformRequest(originalRequest, delegationContext, _transformationContext) {
38
+ var _a;
39
+ const variableValues = (_a = originalRequest.variables) !== null && _a !== void 0 ? _a : {};
40
+ const fragments = Object.create(null);
41
+ const operations = [];
42
+ for (const def of originalRequest.document.definitions) {
43
+ if (def.kind === graphql_1.Kind.OPERATION_DEFINITION) {
44
+ operations.push(def);
45
+ }
46
+ else if (def.kind === graphql_1.Kind.FRAGMENT_DEFINITION) {
47
+ fragments[def.name.value] = def;
48
+ }
49
+ }
50
+ for (const def of operations) {
51
+ const variableDefs = def.variableDefinitions;
52
+ if (variableDefs != null) {
53
+ for (const variableDef of variableDefs) {
54
+ const varName = variableDef.variable.name.value;
55
+ // Cast to NamedTypeNode required until upcomming graphql releases will have TypeNode paramter
56
+ const varType = (0, graphql_1.typeFromAST)(delegationContext.transformedSchema, variableDef.type);
57
+ if (!(0, graphql_1.isInputType)(varType)) {
58
+ continue;
59
+ }
60
+ variableValues[varName] = (0, utils_1.transformInputValue)(varType, variableValues[varName], undefined, (type, originalValue) => {
61
+ var _a;
62
+ const newValue = Object.create(null);
63
+ const fields = type.getFields();
64
+ for (const key in originalValue) {
65
+ const field = fields[key];
66
+ if (field != null) {
67
+ const newFieldName = (_a = this.mapping[type.name]) === null || _a === void 0 ? void 0 : _a[field.name];
68
+ if (newFieldName != null) {
69
+ newValue[newFieldName] = originalValue[field.name];
70
+ }
71
+ else {
72
+ newValue[field.name] = originalValue[field.name];
73
+ }
74
+ }
75
+ }
76
+ return newValue;
77
+ });
78
+ }
79
+ }
80
+ }
81
+ for (const def of originalRequest.document.definitions.filter(def => def.kind === graphql_1.Kind.FRAGMENT_DEFINITION)) {
82
+ fragments[def.name.value] = def;
83
+ }
84
+ const document = this.transformDocument(originalRequest.document, this.mapping, this.inputFieldNodeTransformer, this.inputObjectNodeTransformer, originalRequest, delegationContext);
85
+ return {
86
+ ...originalRequest,
87
+ document,
88
+ variables: variableValues,
89
+ };
90
+ }
91
+ transformDocument(document, mapping, inputFieldNodeTransformer, inputObjectNodeTransformer, request, delegationContext) {
92
+ const typeInfo = new graphql_1.TypeInfo(this._getTransformedSchema());
93
+ const newDocument = (0, graphql_1.visit)(document, (0, graphql_1.visitWithTypeInfo)(typeInfo, {
94
+ [graphql_1.Kind.OBJECT]: {
95
+ leave: (node) => {
96
+ // The casting is kind of legit here as we are in a visitor
97
+ const parentType = typeInfo.getInputType();
98
+ if (parentType != null) {
99
+ const parentTypeName = parentType.name;
100
+ const newInputFields = [];
101
+ for (const inputField of node.fields) {
102
+ const newName = inputField.name.value;
103
+ const transformedInputField = inputFieldNodeTransformer != null
104
+ ? inputFieldNodeTransformer(parentTypeName, newName, inputField, request, delegationContext)
105
+ : inputField;
106
+ if (Array.isArray(transformedInputField)) {
107
+ for (const individualTransformedInputField of transformedInputField) {
108
+ const typeMapping = mapping[parentTypeName];
109
+ if (typeMapping == null) {
110
+ newInputFields.push(individualTransformedInputField);
111
+ continue;
112
+ }
113
+ const oldName = typeMapping[newName];
114
+ if (oldName == null) {
115
+ newInputFields.push(individualTransformedInputField);
116
+ continue;
117
+ }
118
+ newInputFields.push({
119
+ ...individualTransformedInputField,
120
+ name: {
121
+ ...individualTransformedInputField.name,
122
+ value: oldName,
123
+ },
124
+ });
125
+ }
126
+ continue;
127
+ }
128
+ const typeMapping = mapping[parentTypeName];
129
+ if (typeMapping == null) {
130
+ newInputFields.push(transformedInputField);
131
+ continue;
132
+ }
133
+ const oldName = typeMapping[newName];
134
+ if (oldName == null) {
135
+ newInputFields.push(transformedInputField);
136
+ continue;
137
+ }
138
+ newInputFields.push({
139
+ ...transformedInputField,
140
+ name: {
141
+ ...transformedInputField.name,
142
+ value: oldName,
143
+ },
144
+ });
145
+ }
146
+ const newNode = {
147
+ ...node,
148
+ fields: newInputFields,
149
+ };
150
+ return inputObjectNodeTransformer != null
151
+ ? inputObjectNodeTransformer(parentTypeName, newNode, request, delegationContext)
152
+ : newNode;
153
+ }
154
+ },
155
+ },
156
+ }));
157
+ return newDocument;
158
+ }
159
+ }
160
+ exports.default = TransformInputObjectFields;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const graphql_1 = require("graphql");
5
+ const TransformCompositeFields_js_1 = tslib_1.__importDefault(require("./TransformCompositeFields.js"));
6
+ class TransformInterfaceFields {
7
+ constructor(interfaceFieldTransformer, fieldNodeTransformer) {
8
+ this.interfaceFieldTransformer = interfaceFieldTransformer;
9
+ this.fieldNodeTransformer = fieldNodeTransformer;
10
+ }
11
+ _getTransformer() {
12
+ const transformer = this.transformer;
13
+ if (transformer === undefined) {
14
+ throw new Error(`The TransformInterfaceFields transform's "transformRequest" and "transformResult" methods cannot be used without first calling "transformSchema".`);
15
+ }
16
+ return transformer;
17
+ }
18
+ transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema) {
19
+ const compositeToObjectFieldTransformer = (typeName, fieldName, fieldConfig) => {
20
+ if ((0, graphql_1.isInterfaceType)(originalWrappingSchema.getType(typeName))) {
21
+ return this.interfaceFieldTransformer(typeName, fieldName, fieldConfig);
22
+ }
23
+ return undefined;
24
+ };
25
+ this.transformer = new TransformCompositeFields_js_1.default(compositeToObjectFieldTransformer, this.fieldNodeTransformer);
26
+ return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema);
27
+ }
28
+ transformRequest(originalRequest, delegationContext, transformationContext) {
29
+ return this._getTransformer().transformRequest(originalRequest, delegationContext, transformationContext);
30
+ }
31
+ transformResult(originalResult, delegationContext, transformationContext) {
32
+ return this._getTransformer().transformResult(originalResult, delegationContext, transformationContext);
33
+ }
34
+ }
35
+ exports.default = TransformInterfaceFields;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const graphql_1 = require("graphql");
5
+ const TransformCompositeFields_js_1 = tslib_1.__importDefault(require("./TransformCompositeFields.js"));
6
+ class TransformObjectFields {
7
+ constructor(objectFieldTransformer, fieldNodeTransformer) {
8
+ this.objectFieldTransformer = objectFieldTransformer;
9
+ this.fieldNodeTransformer = fieldNodeTransformer;
10
+ }
11
+ _getTransformer() {
12
+ const transformer = this.transformer;
13
+ if (transformer === undefined) {
14
+ throw new Error(`The TransformObjectFields transform's "transformRequest" and "transformResult" methods cannot be used without first calling "transformSchema".`);
15
+ }
16
+ return transformer;
17
+ }
18
+ transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema) {
19
+ const compositeToObjectFieldTransformer = (typeName, fieldName, fieldConfig) => {
20
+ if ((0, graphql_1.isObjectType)(originalWrappingSchema.getType(typeName))) {
21
+ return this.objectFieldTransformer(typeName, fieldName, fieldConfig);
22
+ }
23
+ return undefined;
24
+ };
25
+ this.transformer = new TransformCompositeFields_js_1.default(compositeToObjectFieldTransformer, this.fieldNodeTransformer);
26
+ return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema);
27
+ }
28
+ transformRequest(originalRequest, delegationContext, transformationContext) {
29
+ return this._getTransformer().transformRequest(originalRequest, delegationContext, transformationContext);
30
+ }
31
+ transformResult(originalResult, delegationContext, transformationContext) {
32
+ return this._getTransformer().transformResult(originalResult, delegationContext, transformationContext);
33
+ }
34
+ }
35
+ exports.default = TransformObjectFields;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const graphql_1 = require("graphql");
4
+ const utils_1 = require("@graphql-tools/utils");
5
+ class TransformQuery {
6
+ constructor({ path, queryTransformer, resultTransformer = result => result, errorPathTransformer = errorPath => [...errorPath], fragments = {}, }) {
7
+ this.path = path;
8
+ this.queryTransformer = queryTransformer;
9
+ this.resultTransformer = resultTransformer;
10
+ this.errorPathTransformer = errorPathTransformer;
11
+ this.fragments = fragments;
12
+ }
13
+ transformRequest(originalRequest, delegationContext, transformationContext) {
14
+ const pathLength = this.path.length;
15
+ let index = 0;
16
+ const document = (0, graphql_1.visit)(originalRequest.document, {
17
+ [graphql_1.Kind.FIELD]: {
18
+ enter: node => {
19
+ if (index === pathLength || node.name.value !== this.path[index]) {
20
+ return false;
21
+ }
22
+ index++;
23
+ if (index === pathLength) {
24
+ const selectionSet = this.queryTransformer(node.selectionSet, this.fragments, delegationContext, transformationContext);
25
+ return {
26
+ ...node,
27
+ selectionSet,
28
+ };
29
+ }
30
+ },
31
+ leave: () => {
32
+ index--;
33
+ },
34
+ },
35
+ });
36
+ return {
37
+ ...originalRequest,
38
+ document,
39
+ };
40
+ }
41
+ transformResult(originalResult, delegationContext, transformationContext) {
42
+ const data = this.transformData(originalResult.data, delegationContext, transformationContext);
43
+ const errors = originalResult.errors;
44
+ return {
45
+ data,
46
+ errors: errors != null ? this.transformErrors(errors) : undefined,
47
+ };
48
+ }
49
+ transformData(data, delegationContext, transformationContext) {
50
+ const leafIndex = this.path.length - 1;
51
+ let index = 0;
52
+ let newData = data;
53
+ if (newData) {
54
+ let next = this.path[index];
55
+ while (index < leafIndex) {
56
+ if (data[next]) {
57
+ newData = newData[next];
58
+ }
59
+ else {
60
+ break;
61
+ }
62
+ index++;
63
+ next = this.path[index];
64
+ }
65
+ newData[next] = this.resultTransformer(newData[next], delegationContext, transformationContext);
66
+ }
67
+ return data;
68
+ }
69
+ transformErrors(errors) {
70
+ return errors.map(error => {
71
+ const path = error.path;
72
+ if (path == null) {
73
+ return error;
74
+ }
75
+ let match = true;
76
+ let index = 0;
77
+ while (index < this.path.length) {
78
+ if (path[index] !== this.path[index]) {
79
+ match = false;
80
+ break;
81
+ }
82
+ index++;
83
+ }
84
+ const newPath = match ? path.slice(0, index).concat(this.errorPathTransformer(path.slice(index))) : path;
85
+ return (0, utils_1.relocatedError)(error, newPath);
86
+ });
87
+ }
88
+ }
89
+ exports.default = TransformQuery;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const TransformObjectFields_js_1 = tslib_1.__importDefault(require("./TransformObjectFields.js"));
5
+ class TransformRootFields {
6
+ constructor(rootFieldTransformer, fieldNodeTransformer) {
7
+ this.rootFieldTransformer = rootFieldTransformer;
8
+ this.fieldNodeTransformer = fieldNodeTransformer;
9
+ }
10
+ _getTransformer() {
11
+ const transformer = this.transformer;
12
+ if (transformer === undefined) {
13
+ throw new Error(`The TransformRootFields transform's "transformRequest" and "transformResult" methods cannot be used without first calling "transformSchema".`);
14
+ }
15
+ return transformer;
16
+ }
17
+ transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema) {
18
+ const rootToObjectFieldTransformer = (typeName, fieldName, fieldConfig) => {
19
+ var _a, _b, _c;
20
+ if (typeName === ((_a = originalWrappingSchema.getQueryType()) === null || _a === void 0 ? void 0 : _a.name)) {
21
+ return this.rootFieldTransformer('Query', fieldName, fieldConfig);
22
+ }
23
+ if (typeName === ((_b = originalWrappingSchema.getMutationType()) === null || _b === void 0 ? void 0 : _b.name)) {
24
+ return this.rootFieldTransformer('Mutation', fieldName, fieldConfig);
25
+ }
26
+ if (typeName === ((_c = originalWrappingSchema.getSubscriptionType()) === null || _c === void 0 ? void 0 : _c.name)) {
27
+ return this.rootFieldTransformer('Subscription', fieldName, fieldConfig);
28
+ }
29
+ return undefined;
30
+ };
31
+ this.transformer = new TransformObjectFields_js_1.default(rootToObjectFieldTransformer, this.fieldNodeTransformer);
32
+ return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema);
33
+ }
34
+ transformRequest(originalRequest, delegationContext, transformationContext) {
35
+ return this._getTransformer().transformRequest(originalRequest, delegationContext, transformationContext);
36
+ }
37
+ transformResult(originalResult, delegationContext, transformationContext) {
38
+ return this._getTransformer().transformResult(originalResult, delegationContext, transformationContext);
39
+ }
40
+ }
41
+ exports.default = TransformRootFields;
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dehoistValue = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const graphql_1 = require("graphql");
6
+ const utils_1 = require("@graphql-tools/utils");
7
+ const delegate_1 = require("@graphql-tools/delegate");
8
+ const MapFields_js_1 = tslib_1.__importDefault(require("./MapFields.js"));
9
+ const generateProxyingResolvers_js_1 = require("../generateProxyingResolvers.js");
10
+ class WrapFields {
11
+ constructor(outerTypeName, wrappingFieldNames, wrappingTypeNames, fieldNames, prefix = 'gqtld') {
12
+ this.outerTypeName = outerTypeName;
13
+ this.wrappingFieldNames = wrappingFieldNames;
14
+ this.wrappingTypeNames = wrappingTypeNames;
15
+ this.numWraps = wrappingFieldNames.length;
16
+ this.fieldNames = fieldNames;
17
+ const remainingWrappingFieldNames = this.wrappingFieldNames.slice();
18
+ const outerMostWrappingFieldName = remainingWrappingFieldNames.shift();
19
+ if (outerMostWrappingFieldName == null) {
20
+ throw new Error(`Cannot wrap fields, no wrapping field name provided.`);
21
+ }
22
+ this.transformer = new MapFields_js_1.default({
23
+ [outerTypeName]: {
24
+ [outerMostWrappingFieldName]: (fieldNode, fragments, transformationContext) => hoistFieldNodes({
25
+ fieldNode,
26
+ path: remainingWrappingFieldNames,
27
+ fieldNames,
28
+ fragments,
29
+ transformationContext: transformationContext,
30
+ prefix,
31
+ }),
32
+ },
33
+ }, {
34
+ [outerTypeName]: (value, context) => dehoistValue(value, context),
35
+ }, (errors, context) => dehoistErrors(errors, context));
36
+ }
37
+ transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema) {
38
+ var _a, _b, _c, _d;
39
+ const fieldNames = this.fieldNames;
40
+ const targetFieldConfigMap = (0, utils_1.selectObjectFields)(originalWrappingSchema, this.outerTypeName, !fieldNames ? () => true : fieldName => fieldNames.includes(fieldName));
41
+ const newTargetFieldConfigMap = Object.create(null);
42
+ for (const fieldName in targetFieldConfigMap) {
43
+ const field = targetFieldConfigMap[fieldName];
44
+ const newField = {
45
+ ...field,
46
+ resolve: delegate_1.defaultMergedResolver,
47
+ };
48
+ newTargetFieldConfigMap[fieldName] = newField;
49
+ }
50
+ let wrapIndex = this.numWraps - 1;
51
+ let wrappingTypeName = this.wrappingTypeNames[wrapIndex];
52
+ let wrappingFieldName = this.wrappingFieldNames[wrapIndex];
53
+ let newSchema = (0, utils_1.appendObjectFields)(originalWrappingSchema, wrappingTypeName, newTargetFieldConfigMap);
54
+ for (wrapIndex--; wrapIndex > -1; wrapIndex--) {
55
+ const nextWrappingTypeName = this.wrappingTypeNames[wrapIndex];
56
+ newSchema = (0, utils_1.appendObjectFields)(newSchema, nextWrappingTypeName, {
57
+ [wrappingFieldName]: {
58
+ type: new graphql_1.GraphQLNonNull(newSchema.getType(wrappingTypeName)),
59
+ resolve: delegate_1.defaultMergedResolver,
60
+ },
61
+ });
62
+ wrappingTypeName = nextWrappingTypeName;
63
+ wrappingFieldName = this.wrappingFieldNames[wrapIndex];
64
+ }
65
+ const wrappingRootField = this.outerTypeName === ((_a = originalWrappingSchema.getQueryType()) === null || _a === void 0 ? void 0 : _a.name) ||
66
+ this.outerTypeName === ((_b = originalWrappingSchema.getMutationType()) === null || _b === void 0 ? void 0 : _b.name);
67
+ let resolve;
68
+ if (transformedSchema) {
69
+ if (wrappingRootField) {
70
+ const targetSchema = subschemaConfig.schema;
71
+ const operation = this.outerTypeName === ((_c = targetSchema.getQueryType()) === null || _c === void 0 ? void 0 : _c.name) ? 'query' : 'mutation';
72
+ const createProxyingResolver = (_d = subschemaConfig.createProxyingResolver) !== null && _d !== void 0 ? _d : generateProxyingResolvers_js_1.defaultCreateProxyingResolver;
73
+ resolve = createProxyingResolver({
74
+ subschemaConfig,
75
+ transformedSchema,
76
+ operation: operation,
77
+ fieldName: wrappingFieldName,
78
+ });
79
+ }
80
+ else {
81
+ resolve = delegate_1.defaultMergedResolver;
82
+ }
83
+ }
84
+ [newSchema] = (0, utils_1.modifyObjectFields)(newSchema, this.outerTypeName, fieldName => !!newTargetFieldConfigMap[fieldName], {
85
+ [wrappingFieldName]: {
86
+ type: new graphql_1.GraphQLNonNull(newSchema.getType(wrappingTypeName)),
87
+ resolve,
88
+ },
89
+ });
90
+ return this.transformer.transformSchema(newSchema, subschemaConfig, transformedSchema);
91
+ }
92
+ transformRequest(originalRequest, delegationContext, transformationContext) {
93
+ transformationContext.nextIndex = 0;
94
+ transformationContext.paths = Object.create(null);
95
+ return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext);
96
+ }
97
+ transformResult(originalResult, delegationContext, transformationContext) {
98
+ return this.transformer.transformResult(originalResult, delegationContext, transformationContext);
99
+ }
100
+ }
101
+ exports.default = WrapFields;
102
+ function collectFields(selectionSet, fragments, fields = [], visitedFragmentNames = {}) {
103
+ if (selectionSet != null) {
104
+ for (const selection of selectionSet.selections) {
105
+ switch (selection.kind) {
106
+ case graphql_1.Kind.FIELD:
107
+ fields.push(selection);
108
+ break;
109
+ case graphql_1.Kind.INLINE_FRAGMENT:
110
+ collectFields(selection.selectionSet, fragments, fields, visitedFragmentNames);
111
+ break;
112
+ case graphql_1.Kind.FRAGMENT_SPREAD: {
113
+ const fragmentName = selection.name.value;
114
+ if (!visitedFragmentNames[fragmentName]) {
115
+ visitedFragmentNames[fragmentName] = true;
116
+ collectFields(fragments[fragmentName].selectionSet, fragments, fields, visitedFragmentNames);
117
+ }
118
+ break;
119
+ }
120
+ default:
121
+ // unreachable
122
+ break;
123
+ }
124
+ }
125
+ }
126
+ return fields;
127
+ }
128
+ function aliasFieldNode(fieldNode, str) {
129
+ return {
130
+ ...fieldNode,
131
+ alias: {
132
+ kind: graphql_1.Kind.NAME,
133
+ value: str,
134
+ },
135
+ };
136
+ }
137
+ function hoistFieldNodes({ fieldNode, fieldNames, path, fragments, transformationContext, prefix, index = 0, wrappingPath = [], }) {
138
+ const alias = fieldNode.alias != null ? fieldNode.alias.value : fieldNode.name.value;
139
+ let newFieldNodes = [];
140
+ if (index < path.length) {
141
+ const pathSegment = path[index];
142
+ for (const possibleFieldNode of collectFields(fieldNode.selectionSet, fragments)) {
143
+ if (possibleFieldNode.name.value === pathSegment) {
144
+ const newWrappingPath = wrappingPath.concat([alias]);
145
+ newFieldNodes = newFieldNodes.concat(hoistFieldNodes({
146
+ fieldNode: possibleFieldNode,
147
+ fieldNames,
148
+ path,
149
+ fragments,
150
+ transformationContext,
151
+ prefix,
152
+ index: index + 1,
153
+ wrappingPath: newWrappingPath,
154
+ }));
155
+ }
156
+ }
157
+ }
158
+ else {
159
+ for (const possibleFieldNode of collectFields(fieldNode.selectionSet, fragments)) {
160
+ if (!fieldNames || fieldNames.includes(possibleFieldNode.name.value)) {
161
+ const nextIndex = transformationContext.nextIndex;
162
+ transformationContext.nextIndex++;
163
+ const indexingAlias = `__${prefix}${nextIndex}__`;
164
+ transformationContext.paths[indexingAlias] = {
165
+ pathToField: wrappingPath.concat([alias]),
166
+ alias: possibleFieldNode.alias != null ? possibleFieldNode.alias.value : possibleFieldNode.name.value,
167
+ };
168
+ newFieldNodes.push(aliasFieldNode(possibleFieldNode, indexingAlias));
169
+ }
170
+ }
171
+ }
172
+ return newFieldNodes;
173
+ }
174
+ function dehoistValue(originalValue, context) {
175
+ if (originalValue == null) {
176
+ return originalValue;
177
+ }
178
+ const newValue = Object.create(null);
179
+ for (const alias in originalValue) {
180
+ let obj = newValue;
181
+ const path = context.paths[alias];
182
+ if (path == null) {
183
+ newValue[alias] = originalValue[alias];
184
+ continue;
185
+ }
186
+ const pathToField = path.pathToField;
187
+ const fieldAlias = path.alias;
188
+ for (const key of pathToField) {
189
+ obj = obj[key] = obj[key] || Object.create(null);
190
+ }
191
+ obj[fieldAlias] = originalValue[alias];
192
+ }
193
+ return newValue;
194
+ }
195
+ exports.dehoistValue = dehoistValue;
196
+ function dehoistErrors(errors, context) {
197
+ if (errors === undefined) {
198
+ return undefined;
199
+ }
200
+ return errors.map(error => {
201
+ const originalPath = error.path;
202
+ if (originalPath == null) {
203
+ return error;
204
+ }
205
+ let newPath = [];
206
+ for (const pathSegment of originalPath) {
207
+ if (typeof pathSegment !== 'string') {
208
+ newPath.push(pathSegment);
209
+ continue;
210
+ }
211
+ const path = context.paths[pathSegment];
212
+ if (path == null) {
213
+ newPath.push(pathSegment);
214
+ continue;
215
+ }
216
+ newPath = newPath.concat(path.pathToField, [path.alias]);
217
+ }
218
+ return (0, utils_1.relocatedError)(error, newPath);
219
+ });
220
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const graphql_1 = require("graphql");
4
+ class WrapQuery {
5
+ constructor(path, wrapper, extractor) {
6
+ this.path = path;
7
+ this.wrapper = wrapper;
8
+ this.extractor = extractor;
9
+ }
10
+ transformRequest(originalRequest, _delegationContext, _transformationContext) {
11
+ const fieldPath = [];
12
+ const ourPath = JSON.stringify(this.path);
13
+ const document = (0, graphql_1.visit)(originalRequest.document, {
14
+ [graphql_1.Kind.FIELD]: {
15
+ enter: (node) => {
16
+ fieldPath.push(node.name.value);
17
+ if (node.selectionSet != null && ourPath === JSON.stringify(fieldPath)) {
18
+ const wrapResult = this.wrapper(node.selectionSet);
19
+ // Selection can be either a single selection or a selection set. If it's just one selection,
20
+ // let's wrap it in a selection set. Otherwise, keep it as is.
21
+ const selectionSet = wrapResult != null && wrapResult.kind === graphql_1.Kind.SELECTION_SET
22
+ ? wrapResult
23
+ : {
24
+ kind: graphql_1.Kind.SELECTION_SET,
25
+ selections: [wrapResult],
26
+ };
27
+ return {
28
+ ...node,
29
+ selectionSet,
30
+ };
31
+ }
32
+ },
33
+ leave: () => {
34
+ fieldPath.pop();
35
+ },
36
+ },
37
+ });
38
+ return {
39
+ ...originalRequest,
40
+ document,
41
+ };
42
+ }
43
+ transformResult(originalResult, _delegationContext, _transformationContext) {
44
+ const rootData = originalResult.data;
45
+ if (rootData != null) {
46
+ let data = rootData;
47
+ const path = [...this.path];
48
+ while (path.length > 1) {
49
+ const next = path.shift();
50
+ if (data[next]) {
51
+ data = data[next];
52
+ }
53
+ }
54
+ data[path[0]] = this.extractor(data[path[0]]);
55
+ }
56
+ return {
57
+ data: rootData,
58
+ errors: originalResult.errors,
59
+ };
60
+ }
61
+ }
62
+ exports.default = WrapQuery;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const WrapFields_js_1 = tslib_1.__importDefault(require("./WrapFields.js"));
5
+ class WrapType {
6
+ constructor(outerTypeName, innerTypeName, fieldName) {
7
+ this.transformer = new WrapFields_js_1.default(outerTypeName, [fieldName], [innerTypeName]);
8
+ }
9
+ transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema) {
10
+ return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema);
11
+ }
12
+ transformRequest(originalRequest, delegationContext, transformationContext) {
13
+ return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext);
14
+ }
15
+ transformResult(originalResult, delegationContext, transformationContext) {
16
+ return this.transformer.transformResult(originalResult, delegationContext, transformationContext);
17
+ }
18
+ }
19
+ exports.default = WrapType;