@baeta/plugin-graphql 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1282 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +1260 -21
- package/package.json +13 -12
- package/dist/codegen.d.ts +0 -6
- package/dist/codegen.js +0 -116
- package/dist/codegen.mjs +0 -89
- package/dist/config.d.ts +0 -10
- package/dist/config.js +0 -16
- package/dist/config.mjs +0 -0
- package/dist/index.mjs +0 -19
- package/dist/modules/builder.d.ts +0 -17
- package/dist/modules/builder.js +0 -439
- package/dist/modules/builder.mjs +0 -429
- package/dist/modules/config.d.ts +0 -11
- package/dist/modules/config.js +0 -16
- package/dist/modules/config.mjs +0 -0
- package/dist/modules/index.d.ts +0 -6
- package/dist/modules/index.js +0 -148
- package/dist/modules/index.mjs +0 -132
- package/dist/modules/utils.d.ts +0 -28
- package/dist/modules/utils.js +0 -209
- package/dist/modules/utils.mjs +0 -168
- package/dist/resolvers/config.d.ts +0 -16
- package/dist/resolvers/config.js +0 -16
- package/dist/resolvers/config.mjs +0 -0
- package/dist/resolvers/index.d.ts +0 -10
- package/dist/resolvers/index.js +0 -309
- package/dist/resolvers/index.mjs +0 -289
- package/dist/resolvers/visitor.d.ts +0 -29
- package/dist/resolvers/visitor.js +0 -139
- package/dist/resolvers/visitor.mjs +0 -111
- package/dist/utils/cache.d.ts +0 -3
- package/dist/utils/cache.js +0 -40
- package/dist/utils/cache.mjs +0 -16
- package/dist/utils/hash.d.ts +0 -6
- package/dist/utils/hash.js +0 -38
- package/dist/utils/hash.mjs +0 -13
- package/dist/utils/load.d.ts +0 -9
- package/dist/utils/load.js +0 -62
- package/dist/utils/load.mjs +0 -40
- package/dist/utils/path.d.ts +0 -3
- package/dist/utils/path.js +0 -37
- package/dist/utils/path.mjs +0 -7
package/dist/resolvers/index.js
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var resolvers_exports = {};
|
|
20
|
-
__export(resolvers_exports, {
|
|
21
|
-
plugin: () => plugin
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(resolvers_exports);
|
|
24
|
-
var import_visitor_plugin_common = require("@graphql-codegen/visitor-plugin-common");
|
|
25
|
-
var import_plugin_helpers = require("@graphql-codegen/plugin-helpers");
|
|
26
|
-
var import_visitor = require("./visitor");
|
|
27
|
-
const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
28
|
-
const plugin = (schema, documents, config) => {
|
|
29
|
-
const imports = [];
|
|
30
|
-
if (!config.customResolveInfo) {
|
|
31
|
-
imports.push("GraphQLResolveInfo");
|
|
32
|
-
}
|
|
33
|
-
const showUnusedMappers = typeof config.showUnusedMappers === "boolean" ? config.showUnusedMappers : true;
|
|
34
|
-
const noSchemaStitching = typeof config.noSchemaStitching === "boolean" ? config.noSchemaStitching : true;
|
|
35
|
-
const indexSignature = config.useIndexSignature ? [
|
|
36
|
-
"export type WithIndex<TObject> = TObject & Record<string, any>;",
|
|
37
|
-
"export type ResolversObject<TObject> = WithIndex<TObject>;"
|
|
38
|
-
].join("\n") : "";
|
|
39
|
-
const importType = config.useTypeImports ? "import type" : "import";
|
|
40
|
-
const prepend = [];
|
|
41
|
-
const defsToInclude = [];
|
|
42
|
-
const directiveResolverMappings = {};
|
|
43
|
-
if (config.directiveResolverMappings) {
|
|
44
|
-
for (const [directiveName, mapper] of Object.entries(
|
|
45
|
-
config.directiveResolverMappings
|
|
46
|
-
)) {
|
|
47
|
-
const parsedMapper = (0, import_visitor_plugin_common.parseMapper)(mapper);
|
|
48
|
-
const capitalizedDirectiveName = capitalize(directiveName);
|
|
49
|
-
const resolverFnName = `ResolverFn${capitalizedDirectiveName}`;
|
|
50
|
-
const resolverFnUsage2 = `${resolverFnName}<TResult, TParent, TContext, TArgs>`;
|
|
51
|
-
const resolverWithResolveUsage2 = `Resolver${capitalizedDirectiveName}WithResolve<TResult, TParent, TContext, TArgs>`;
|
|
52
|
-
const resolverWithResolve2 = `
|
|
53
|
-
export type Resolver${capitalizedDirectiveName}WithResolve<TResult, TParent, TContext, TArgs> = {
|
|
54
|
-
resolve: ${resolverFnName}<TResult, TParent, TContext, TArgs>;
|
|
55
|
-
};`;
|
|
56
|
-
const resolverTypeName = `Resolver${capitalizedDirectiveName}`;
|
|
57
|
-
const resolverType2 = `export type ${resolverTypeName}<TResult, TParent = {}, TContext = {}, TArgs = {}> =`;
|
|
58
|
-
if (parsedMapper.isExternal) {
|
|
59
|
-
if (parsedMapper.default) {
|
|
60
|
-
prepend.push(
|
|
61
|
-
`${importType} ${resolverFnName} from '${parsedMapper.source}';`
|
|
62
|
-
);
|
|
63
|
-
} else {
|
|
64
|
-
prepend.push(
|
|
65
|
-
`${importType} { ${parsedMapper.import} ${parsedMapper.import !== resolverFnName ? `as ${resolverFnName} ` : ""}} from '${parsedMapper.source}';`
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
prepend.push(
|
|
69
|
-
`export${config.useTypeImports ? " type" : ""} { ${resolverFnName} };`
|
|
70
|
-
);
|
|
71
|
-
} else {
|
|
72
|
-
defsToInclude.push(
|
|
73
|
-
`export type ${resolverFnName}<TResult, TParent, TContext, TArgs> = ${parsedMapper.type}`
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
if (config.makeResolverTypeCallable) {
|
|
77
|
-
defsToInclude.push(`${resolverType2} ${resolverFnUsage2};`);
|
|
78
|
-
} else {
|
|
79
|
-
defsToInclude.push(resolverWithResolve2);
|
|
80
|
-
defsToInclude.push(
|
|
81
|
-
`${resolverType2} ${resolverFnUsage2} | ${resolverWithResolveUsage2};`
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
directiveResolverMappings[directiveName] = resolverTypeName;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const transformedSchema = config.federation ? (0, import_plugin_helpers.addFederationReferencesToSchema)(schema) : schema;
|
|
88
|
-
const visitor = new import_visitor.TypeScriptResolversVisitor(
|
|
89
|
-
{ ...config, directiveResolverMappings },
|
|
90
|
-
transformedSchema
|
|
91
|
-
);
|
|
92
|
-
const namespacedImportPrefix = visitor.config.namespacedImportName ? `${visitor.config.namespacedImportName}.` : "";
|
|
93
|
-
const astNode = (0, import_plugin_helpers.getCachedDocumentNodeFromSchema)(transformedSchema);
|
|
94
|
-
const visitorResult = (0, import_plugin_helpers.oldVisit)(astNode, { leave: visitor });
|
|
95
|
-
const optionalSignForInfoArg = visitor.config.optionalInfoArgument ? "?" : "";
|
|
96
|
-
const legacyStitchingResolverType = `
|
|
97
|
-
export type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {
|
|
98
|
-
fragment: string;
|
|
99
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
100
|
-
};`;
|
|
101
|
-
const newStitchingResolverType = `
|
|
102
|
-
export type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {
|
|
103
|
-
selectionSet: string | ((fieldNode: FieldNode) => SelectionSetNode);
|
|
104
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
105
|
-
};`;
|
|
106
|
-
const stitchingResolverType = `export type StitchingResolver<TResult, TParent, TContext, TArgs> = LegacyStitchingResolver<TResult, TParent, TContext, TArgs> | NewStitchingResolver<TResult, TParent, TContext, TArgs>;`;
|
|
107
|
-
const resolverWithResolve = `
|
|
108
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
109
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
110
|
-
};`;
|
|
111
|
-
const resolverType = `export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =`;
|
|
112
|
-
const resolverFnUsage = `ResolverFn<TResult, TParent, TContext, TArgs>`;
|
|
113
|
-
const resolverWithResolveUsage = `ResolverWithResolve<TResult, TParent, TContext, TArgs>`;
|
|
114
|
-
const stitchingResolverUsage = `StitchingResolver<TResult, TParent, TContext, TArgs>`;
|
|
115
|
-
if (visitor.hasFederation()) {
|
|
116
|
-
if (visitor.config.wrapFieldDefinitions) {
|
|
117
|
-
defsToInclude.push(`export type UnwrappedObject<T> = {
|
|
118
|
-
[P in keyof T]: T[P] extends infer R | Promise<infer R> | (() => infer R2 | Promise<infer R2>)
|
|
119
|
-
? R & R2 : T[P]
|
|
120
|
-
};`);
|
|
121
|
-
}
|
|
122
|
-
defsToInclude.push(`export type ReferenceResolver<TResult, TReference, TContext> = (
|
|
123
|
-
reference: TReference,
|
|
124
|
-
context: TContext,
|
|
125
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
126
|
-
) => Promise<TResult> | TResult;`);
|
|
127
|
-
defsToInclude.push(`
|
|
128
|
-
type ScalarCheck<T, S> = S extends true ? T : NullableCheck<T, S>;
|
|
129
|
-
type NullableCheck<T, S> = ${namespacedImportPrefix}Maybe<T> extends T ? ${namespacedImportPrefix}Maybe<ListCheck<NonNullable<T>, S>> : ListCheck<T, S>;
|
|
130
|
-
type ListCheck<T, S> = T extends (infer U)[] ? NullableCheck<U, S>[] : GraphQLRecursivePick<T, S>;
|
|
131
|
-
export type GraphQLRecursivePick<T, S> = { [K in keyof T & keyof S]: ScalarCheck<T[K], S[K]> };
|
|
132
|
-
`);
|
|
133
|
-
}
|
|
134
|
-
if (!config.makeResolverTypeCallable) {
|
|
135
|
-
defsToInclude.push(resolverWithResolve);
|
|
136
|
-
}
|
|
137
|
-
if (noSchemaStitching) {
|
|
138
|
-
const defs = config.makeResolverTypeCallable ? `${resolverType} ${resolverFnUsage};` : `${resolverType} ${resolverFnUsage} | ${resolverWithResolveUsage};`;
|
|
139
|
-
defsToInclude.push(defs);
|
|
140
|
-
} else {
|
|
141
|
-
defsToInclude.push(
|
|
142
|
-
[
|
|
143
|
-
legacyStitchingResolverType,
|
|
144
|
-
newStitchingResolverType,
|
|
145
|
-
stitchingResolverType,
|
|
146
|
-
resolverType,
|
|
147
|
-
` | ${resolverFnUsage}`,
|
|
148
|
-
config.makeResolverTypeCallable ? `` : ` | ${resolverWithResolveUsage}`,
|
|
149
|
-
` | ${stitchingResolverUsage};`
|
|
150
|
-
].join("\n")
|
|
151
|
-
);
|
|
152
|
-
imports.push("SelectionSetNode", "FieldNode");
|
|
153
|
-
}
|
|
154
|
-
if (config.customResolverFn) {
|
|
155
|
-
const parsedMapper = (0, import_visitor_plugin_common.parseMapper)(config.customResolverFn);
|
|
156
|
-
if (parsedMapper.isExternal) {
|
|
157
|
-
if (parsedMapper.default) {
|
|
158
|
-
prepend.push(`${importType} ResolverFn from '${parsedMapper.source}';`);
|
|
159
|
-
} else {
|
|
160
|
-
prepend.push(
|
|
161
|
-
`${importType} { ${parsedMapper.import} ${parsedMapper.import !== "ResolverFn" ? "as ResolverFn " : ""}} from '${parsedMapper.source}';`
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
prepend.push(
|
|
165
|
-
`export${config.useTypeImports ? " type" : ""} { ResolverFn };`
|
|
166
|
-
);
|
|
167
|
-
} else {
|
|
168
|
-
prepend.push(
|
|
169
|
-
`export type ResolverFn<TResult, TParent, TContext, TArgs> = ${parsedMapper.type}`
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
const defaultResolverFn = `
|
|
174
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
175
|
-
parent: TParent,
|
|
176
|
-
args: TArgs,
|
|
177
|
-
context: TContext,
|
|
178
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
179
|
-
) => Promise<TResult> | TResult;`;
|
|
180
|
-
defsToInclude.push(defaultResolverFn);
|
|
181
|
-
}
|
|
182
|
-
if (config.customSubscriptionResolver) {
|
|
183
|
-
const parsedMapper = (0, import_visitor_plugin_common.parseMapper)(config.customSubscriptionResolver);
|
|
184
|
-
if (parsedMapper.isExternal) {
|
|
185
|
-
if (parsedMapper.default) {
|
|
186
|
-
prepend.push(
|
|
187
|
-
`${importType} SubscriptionResolver from '${parsedMapper.source}';`
|
|
188
|
-
);
|
|
189
|
-
} else {
|
|
190
|
-
prepend.push(
|
|
191
|
-
`${importType} { ${parsedMapper.import} ${parsedMapper.import !== "SubscriptionResolver" ? "as SubscriptionResolver " : ""}} from '${parsedMapper.source}';`
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
prepend.push(
|
|
195
|
-
`export${config.useTypeImports ? " type" : ""} { SubscriptionResolver };`
|
|
196
|
-
);
|
|
197
|
-
} else {
|
|
198
|
-
prepend.push(
|
|
199
|
-
`export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> = ${parsedMapper.type}`
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
} else {
|
|
203
|
-
const defaultSubscriptionDef = `
|
|
204
|
-
export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
|
|
205
|
-
parent: TParent,
|
|
206
|
-
args: TArgs,
|
|
207
|
-
context: TContext,
|
|
208
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
209
|
-
) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;
|
|
210
|
-
|
|
211
|
-
export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
|
|
212
|
-
parent: TParent,
|
|
213
|
-
args: TArgs,
|
|
214
|
-
context: TContext,
|
|
215
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
216
|
-
) => TResult | Promise<TResult>;
|
|
217
|
-
|
|
218
|
-
export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {
|
|
219
|
-
subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;
|
|
220
|
-
resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {
|
|
224
|
-
subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;
|
|
225
|
-
resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =
|
|
229
|
-
| SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>
|
|
230
|
-
| SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;
|
|
231
|
-
|
|
232
|
-
export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =
|
|
233
|
-
| ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)
|
|
234
|
-
| SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;
|
|
235
|
-
`;
|
|
236
|
-
defsToInclude.push(defaultSubscriptionDef);
|
|
237
|
-
}
|
|
238
|
-
const header = `${indexSignature}
|
|
239
|
-
|
|
240
|
-
${visitor.getResolverTypeWrapperSignature()}
|
|
241
|
-
|
|
242
|
-
${defsToInclude.join("\n")}
|
|
243
|
-
|
|
244
|
-
export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
|
|
245
|
-
parent: TParent,
|
|
246
|
-
context: TContext,
|
|
247
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
248
|
-
) => ${namespacedImportPrefix}Maybe<TTypes> | Promise<${namespacedImportPrefix}Maybe<TTypes>>;
|
|
249
|
-
|
|
250
|
-
export type IsTypeOfResolverFn<T = {}, TContext = {}> = (obj: T, context: TContext, info${optionalSignForInfoArg}: GraphQLResolveInfo) => boolean | Promise<boolean>;
|
|
251
|
-
|
|
252
|
-
export type NextResolverFn<T> = () => Promise<T>;
|
|
253
|
-
|
|
254
|
-
export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (
|
|
255
|
-
next: NextResolverFn<TResult>,
|
|
256
|
-
parent: TParent,
|
|
257
|
-
args: TArgs,
|
|
258
|
-
context: TContext,
|
|
259
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
260
|
-
) => TResult | Promise<TResult>;
|
|
261
|
-
`;
|
|
262
|
-
const resolversTypeMapping = visitor.buildResolversTypes();
|
|
263
|
-
const resolversParentTypeMapping = visitor.buildResolversParentTypes();
|
|
264
|
-
const {
|
|
265
|
-
getRootResolver,
|
|
266
|
-
getAllDirectiveResolvers,
|
|
267
|
-
mappersImports,
|
|
268
|
-
unusedMappers,
|
|
269
|
-
hasScalars
|
|
270
|
-
} = visitor;
|
|
271
|
-
if (hasScalars()) {
|
|
272
|
-
imports.push("GraphQLScalarType", "GraphQLScalarTypeConfig");
|
|
273
|
-
}
|
|
274
|
-
if (showUnusedMappers && unusedMappers.length) {
|
|
275
|
-
console.warn(`Unused mappers: ${unusedMappers.join(",")}`);
|
|
276
|
-
}
|
|
277
|
-
if (imports.length) {
|
|
278
|
-
prepend.push(`${importType} { ${imports.join(", ")} } from 'graphql';`);
|
|
279
|
-
}
|
|
280
|
-
if (config.customResolveInfo) {
|
|
281
|
-
const parsedMapper = (0, import_visitor_plugin_common.parseMapper)(config.customResolveInfo);
|
|
282
|
-
if (parsedMapper.isExternal) {
|
|
283
|
-
if (parsedMapper.default) {
|
|
284
|
-
prepend.push(`import GraphQLResolveInfo from '${parsedMapper.source}'`);
|
|
285
|
-
}
|
|
286
|
-
prepend.push(
|
|
287
|
-
`import { ${parsedMapper.import} ${parsedMapper.import !== "GraphQLResolveInfo" ? "as GraphQLResolveInfo" : ""} } from '${parsedMapper.source}';`
|
|
288
|
-
);
|
|
289
|
-
} else {
|
|
290
|
-
prepend.push(`type GraphQLResolveInfo = ${parsedMapper.type}`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
prepend.push(...mappersImports, ...visitor.globalDeclarations);
|
|
294
|
-
return {
|
|
295
|
-
prepend,
|
|
296
|
-
content: [
|
|
297
|
-
header,
|
|
298
|
-
resolversTypeMapping,
|
|
299
|
-
resolversParentTypeMapping,
|
|
300
|
-
...visitorResult.definitions.filter((d) => typeof d === "string"),
|
|
301
|
-
getRootResolver(),
|
|
302
|
-
getAllDirectiveResolvers()
|
|
303
|
-
].join("\n")
|
|
304
|
-
};
|
|
305
|
-
};
|
|
306
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
307
|
-
0 && (module.exports = {
|
|
308
|
-
plugin
|
|
309
|
-
});
|
package/dist/resolvers/index.mjs
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
import { parseMapper } from "@graphql-codegen/visitor-plugin-common";
|
|
2
|
-
import {
|
|
3
|
-
addFederationReferencesToSchema,
|
|
4
|
-
getCachedDocumentNodeFromSchema,
|
|
5
|
-
oldVisit
|
|
6
|
-
} from "@graphql-codegen/plugin-helpers";
|
|
7
|
-
import { TypeScriptResolversVisitor } from "./visitor";
|
|
8
|
-
const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
9
|
-
const plugin = (schema, documents, config) => {
|
|
10
|
-
const imports = [];
|
|
11
|
-
if (!config.customResolveInfo) {
|
|
12
|
-
imports.push("GraphQLResolveInfo");
|
|
13
|
-
}
|
|
14
|
-
const showUnusedMappers = typeof config.showUnusedMappers === "boolean" ? config.showUnusedMappers : true;
|
|
15
|
-
const noSchemaStitching = typeof config.noSchemaStitching === "boolean" ? config.noSchemaStitching : true;
|
|
16
|
-
const indexSignature = config.useIndexSignature ? [
|
|
17
|
-
"export type WithIndex<TObject> = TObject & Record<string, any>;",
|
|
18
|
-
"export type ResolversObject<TObject> = WithIndex<TObject>;"
|
|
19
|
-
].join("\n") : "";
|
|
20
|
-
const importType = config.useTypeImports ? "import type" : "import";
|
|
21
|
-
const prepend = [];
|
|
22
|
-
const defsToInclude = [];
|
|
23
|
-
const directiveResolverMappings = {};
|
|
24
|
-
if (config.directiveResolverMappings) {
|
|
25
|
-
for (const [directiveName, mapper] of Object.entries(
|
|
26
|
-
config.directiveResolverMappings
|
|
27
|
-
)) {
|
|
28
|
-
const parsedMapper = parseMapper(mapper);
|
|
29
|
-
const capitalizedDirectiveName = capitalize(directiveName);
|
|
30
|
-
const resolverFnName = `ResolverFn${capitalizedDirectiveName}`;
|
|
31
|
-
const resolverFnUsage2 = `${resolverFnName}<TResult, TParent, TContext, TArgs>`;
|
|
32
|
-
const resolverWithResolveUsage2 = `Resolver${capitalizedDirectiveName}WithResolve<TResult, TParent, TContext, TArgs>`;
|
|
33
|
-
const resolverWithResolve2 = `
|
|
34
|
-
export type Resolver${capitalizedDirectiveName}WithResolve<TResult, TParent, TContext, TArgs> = {
|
|
35
|
-
resolve: ${resolverFnName}<TResult, TParent, TContext, TArgs>;
|
|
36
|
-
};`;
|
|
37
|
-
const resolverTypeName = `Resolver${capitalizedDirectiveName}`;
|
|
38
|
-
const resolverType2 = `export type ${resolverTypeName}<TResult, TParent = {}, TContext = {}, TArgs = {}> =`;
|
|
39
|
-
if (parsedMapper.isExternal) {
|
|
40
|
-
if (parsedMapper.default) {
|
|
41
|
-
prepend.push(
|
|
42
|
-
`${importType} ${resolverFnName} from '${parsedMapper.source}';`
|
|
43
|
-
);
|
|
44
|
-
} else {
|
|
45
|
-
prepend.push(
|
|
46
|
-
`${importType} { ${parsedMapper.import} ${parsedMapper.import !== resolverFnName ? `as ${resolverFnName} ` : ""}} from '${parsedMapper.source}';`
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
prepend.push(
|
|
50
|
-
`export${config.useTypeImports ? " type" : ""} { ${resolverFnName} };`
|
|
51
|
-
);
|
|
52
|
-
} else {
|
|
53
|
-
defsToInclude.push(
|
|
54
|
-
`export type ${resolverFnName}<TResult, TParent, TContext, TArgs> = ${parsedMapper.type}`
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
if (config.makeResolverTypeCallable) {
|
|
58
|
-
defsToInclude.push(`${resolverType2} ${resolverFnUsage2};`);
|
|
59
|
-
} else {
|
|
60
|
-
defsToInclude.push(resolverWithResolve2);
|
|
61
|
-
defsToInclude.push(
|
|
62
|
-
`${resolverType2} ${resolverFnUsage2} | ${resolverWithResolveUsage2};`
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
directiveResolverMappings[directiveName] = resolverTypeName;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const transformedSchema = config.federation ? addFederationReferencesToSchema(schema) : schema;
|
|
69
|
-
const visitor = new TypeScriptResolversVisitor(
|
|
70
|
-
{ ...config, directiveResolverMappings },
|
|
71
|
-
transformedSchema
|
|
72
|
-
);
|
|
73
|
-
const namespacedImportPrefix = visitor.config.namespacedImportName ? `${visitor.config.namespacedImportName}.` : "";
|
|
74
|
-
const astNode = getCachedDocumentNodeFromSchema(transformedSchema);
|
|
75
|
-
const visitorResult = oldVisit(astNode, { leave: visitor });
|
|
76
|
-
const optionalSignForInfoArg = visitor.config.optionalInfoArgument ? "?" : "";
|
|
77
|
-
const legacyStitchingResolverType = `
|
|
78
|
-
export type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {
|
|
79
|
-
fragment: string;
|
|
80
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
81
|
-
};`;
|
|
82
|
-
const newStitchingResolverType = `
|
|
83
|
-
export type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {
|
|
84
|
-
selectionSet: string | ((fieldNode: FieldNode) => SelectionSetNode);
|
|
85
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
86
|
-
};`;
|
|
87
|
-
const stitchingResolverType = `export type StitchingResolver<TResult, TParent, TContext, TArgs> = LegacyStitchingResolver<TResult, TParent, TContext, TArgs> | NewStitchingResolver<TResult, TParent, TContext, TArgs>;`;
|
|
88
|
-
const resolverWithResolve = `
|
|
89
|
-
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
90
|
-
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
|
|
91
|
-
};`;
|
|
92
|
-
const resolverType = `export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =`;
|
|
93
|
-
const resolverFnUsage = `ResolverFn<TResult, TParent, TContext, TArgs>`;
|
|
94
|
-
const resolverWithResolveUsage = `ResolverWithResolve<TResult, TParent, TContext, TArgs>`;
|
|
95
|
-
const stitchingResolverUsage = `StitchingResolver<TResult, TParent, TContext, TArgs>`;
|
|
96
|
-
if (visitor.hasFederation()) {
|
|
97
|
-
if (visitor.config.wrapFieldDefinitions) {
|
|
98
|
-
defsToInclude.push(`export type UnwrappedObject<T> = {
|
|
99
|
-
[P in keyof T]: T[P] extends infer R | Promise<infer R> | (() => infer R2 | Promise<infer R2>)
|
|
100
|
-
? R & R2 : T[P]
|
|
101
|
-
};`);
|
|
102
|
-
}
|
|
103
|
-
defsToInclude.push(`export type ReferenceResolver<TResult, TReference, TContext> = (
|
|
104
|
-
reference: TReference,
|
|
105
|
-
context: TContext,
|
|
106
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
107
|
-
) => Promise<TResult> | TResult;`);
|
|
108
|
-
defsToInclude.push(`
|
|
109
|
-
type ScalarCheck<T, S> = S extends true ? T : NullableCheck<T, S>;
|
|
110
|
-
type NullableCheck<T, S> = ${namespacedImportPrefix}Maybe<T> extends T ? ${namespacedImportPrefix}Maybe<ListCheck<NonNullable<T>, S>> : ListCheck<T, S>;
|
|
111
|
-
type ListCheck<T, S> = T extends (infer U)[] ? NullableCheck<U, S>[] : GraphQLRecursivePick<T, S>;
|
|
112
|
-
export type GraphQLRecursivePick<T, S> = { [K in keyof T & keyof S]: ScalarCheck<T[K], S[K]> };
|
|
113
|
-
`);
|
|
114
|
-
}
|
|
115
|
-
if (!config.makeResolverTypeCallable) {
|
|
116
|
-
defsToInclude.push(resolverWithResolve);
|
|
117
|
-
}
|
|
118
|
-
if (noSchemaStitching) {
|
|
119
|
-
const defs = config.makeResolverTypeCallable ? `${resolverType} ${resolverFnUsage};` : `${resolverType} ${resolverFnUsage} | ${resolverWithResolveUsage};`;
|
|
120
|
-
defsToInclude.push(defs);
|
|
121
|
-
} else {
|
|
122
|
-
defsToInclude.push(
|
|
123
|
-
[
|
|
124
|
-
legacyStitchingResolverType,
|
|
125
|
-
newStitchingResolverType,
|
|
126
|
-
stitchingResolverType,
|
|
127
|
-
resolverType,
|
|
128
|
-
` | ${resolverFnUsage}`,
|
|
129
|
-
config.makeResolverTypeCallable ? `` : ` | ${resolverWithResolveUsage}`,
|
|
130
|
-
` | ${stitchingResolverUsage};`
|
|
131
|
-
].join("\n")
|
|
132
|
-
);
|
|
133
|
-
imports.push("SelectionSetNode", "FieldNode");
|
|
134
|
-
}
|
|
135
|
-
if (config.customResolverFn) {
|
|
136
|
-
const parsedMapper = parseMapper(config.customResolverFn);
|
|
137
|
-
if (parsedMapper.isExternal) {
|
|
138
|
-
if (parsedMapper.default) {
|
|
139
|
-
prepend.push(`${importType} ResolverFn from '${parsedMapper.source}';`);
|
|
140
|
-
} else {
|
|
141
|
-
prepend.push(
|
|
142
|
-
`${importType} { ${parsedMapper.import} ${parsedMapper.import !== "ResolverFn" ? "as ResolverFn " : ""}} from '${parsedMapper.source}';`
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
prepend.push(
|
|
146
|
-
`export${config.useTypeImports ? " type" : ""} { ResolverFn };`
|
|
147
|
-
);
|
|
148
|
-
} else {
|
|
149
|
-
prepend.push(
|
|
150
|
-
`export type ResolverFn<TResult, TParent, TContext, TArgs> = ${parsedMapper.type}`
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
} else {
|
|
154
|
-
const defaultResolverFn = `
|
|
155
|
-
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
156
|
-
parent: TParent,
|
|
157
|
-
args: TArgs,
|
|
158
|
-
context: TContext,
|
|
159
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
160
|
-
) => Promise<TResult> | TResult;`;
|
|
161
|
-
defsToInclude.push(defaultResolverFn);
|
|
162
|
-
}
|
|
163
|
-
if (config.customSubscriptionResolver) {
|
|
164
|
-
const parsedMapper = parseMapper(config.customSubscriptionResolver);
|
|
165
|
-
if (parsedMapper.isExternal) {
|
|
166
|
-
if (parsedMapper.default) {
|
|
167
|
-
prepend.push(
|
|
168
|
-
`${importType} SubscriptionResolver from '${parsedMapper.source}';`
|
|
169
|
-
);
|
|
170
|
-
} else {
|
|
171
|
-
prepend.push(
|
|
172
|
-
`${importType} { ${parsedMapper.import} ${parsedMapper.import !== "SubscriptionResolver" ? "as SubscriptionResolver " : ""}} from '${parsedMapper.source}';`
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
prepend.push(
|
|
176
|
-
`export${config.useTypeImports ? " type" : ""} { SubscriptionResolver };`
|
|
177
|
-
);
|
|
178
|
-
} else {
|
|
179
|
-
prepend.push(
|
|
180
|
-
`export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> = ${parsedMapper.type}`
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
} else {
|
|
184
|
-
const defaultSubscriptionDef = `
|
|
185
|
-
export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
|
|
186
|
-
parent: TParent,
|
|
187
|
-
args: TArgs,
|
|
188
|
-
context: TContext,
|
|
189
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
190
|
-
) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;
|
|
191
|
-
|
|
192
|
-
export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
|
|
193
|
-
parent: TParent,
|
|
194
|
-
args: TArgs,
|
|
195
|
-
context: TContext,
|
|
196
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
197
|
-
) => TResult | Promise<TResult>;
|
|
198
|
-
|
|
199
|
-
export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {
|
|
200
|
-
subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;
|
|
201
|
-
resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {
|
|
205
|
-
subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;
|
|
206
|
-
resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =
|
|
210
|
-
| SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>
|
|
211
|
-
| SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;
|
|
212
|
-
|
|
213
|
-
export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =
|
|
214
|
-
| ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)
|
|
215
|
-
| SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;
|
|
216
|
-
`;
|
|
217
|
-
defsToInclude.push(defaultSubscriptionDef);
|
|
218
|
-
}
|
|
219
|
-
const header = `${indexSignature}
|
|
220
|
-
|
|
221
|
-
${visitor.getResolverTypeWrapperSignature()}
|
|
222
|
-
|
|
223
|
-
${defsToInclude.join("\n")}
|
|
224
|
-
|
|
225
|
-
export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
|
|
226
|
-
parent: TParent,
|
|
227
|
-
context: TContext,
|
|
228
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
229
|
-
) => ${namespacedImportPrefix}Maybe<TTypes> | Promise<${namespacedImportPrefix}Maybe<TTypes>>;
|
|
230
|
-
|
|
231
|
-
export type IsTypeOfResolverFn<T = {}, TContext = {}> = (obj: T, context: TContext, info${optionalSignForInfoArg}: GraphQLResolveInfo) => boolean | Promise<boolean>;
|
|
232
|
-
|
|
233
|
-
export type NextResolverFn<T> = () => Promise<T>;
|
|
234
|
-
|
|
235
|
-
export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (
|
|
236
|
-
next: NextResolverFn<TResult>,
|
|
237
|
-
parent: TParent,
|
|
238
|
-
args: TArgs,
|
|
239
|
-
context: TContext,
|
|
240
|
-
info${optionalSignForInfoArg}: GraphQLResolveInfo
|
|
241
|
-
) => TResult | Promise<TResult>;
|
|
242
|
-
`;
|
|
243
|
-
const resolversTypeMapping = visitor.buildResolversTypes();
|
|
244
|
-
const resolversParentTypeMapping = visitor.buildResolversParentTypes();
|
|
245
|
-
const {
|
|
246
|
-
getRootResolver,
|
|
247
|
-
getAllDirectiveResolvers,
|
|
248
|
-
mappersImports,
|
|
249
|
-
unusedMappers,
|
|
250
|
-
hasScalars
|
|
251
|
-
} = visitor;
|
|
252
|
-
if (hasScalars()) {
|
|
253
|
-
imports.push("GraphQLScalarType", "GraphQLScalarTypeConfig");
|
|
254
|
-
}
|
|
255
|
-
if (showUnusedMappers && unusedMappers.length) {
|
|
256
|
-
console.warn(`Unused mappers: ${unusedMappers.join(",")}`);
|
|
257
|
-
}
|
|
258
|
-
if (imports.length) {
|
|
259
|
-
prepend.push(`${importType} { ${imports.join(", ")} } from 'graphql';`);
|
|
260
|
-
}
|
|
261
|
-
if (config.customResolveInfo) {
|
|
262
|
-
const parsedMapper = parseMapper(config.customResolveInfo);
|
|
263
|
-
if (parsedMapper.isExternal) {
|
|
264
|
-
if (parsedMapper.default) {
|
|
265
|
-
prepend.push(`import GraphQLResolveInfo from '${parsedMapper.source}'`);
|
|
266
|
-
}
|
|
267
|
-
prepend.push(
|
|
268
|
-
`import { ${parsedMapper.import} ${parsedMapper.import !== "GraphQLResolveInfo" ? "as GraphQLResolveInfo" : ""} } from '${parsedMapper.source}';`
|
|
269
|
-
);
|
|
270
|
-
} else {
|
|
271
|
-
prepend.push(`type GraphQLResolveInfo = ${parsedMapper.type}`);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
prepend.push(...mappersImports, ...visitor.globalDeclarations);
|
|
275
|
-
return {
|
|
276
|
-
prepend,
|
|
277
|
-
content: [
|
|
278
|
-
header,
|
|
279
|
-
resolversTypeMapping,
|
|
280
|
-
resolversParentTypeMapping,
|
|
281
|
-
...visitorResult.definitions.filter((d) => typeof d === "string"),
|
|
282
|
-
getRootResolver(),
|
|
283
|
-
getAllDirectiveResolvers()
|
|
284
|
-
].join("\n")
|
|
285
|
-
};
|
|
286
|
-
};
|
|
287
|
-
export {
|
|
288
|
-
plugin
|
|
289
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { TypeScriptResolversPluginConfig } from './config.js';
|
|
2
|
-
import { GraphQLSchema, ListTypeNode, FieldDefinitionNode, NamedTypeNode, NonNullTypeNode, EnumTypeDefinitionNode } from 'graphql';
|
|
3
|
-
import { ParsedResolversConfig, BaseResolversVisitor, DeclarationKind } from '@graphql-codegen/visitor-plugin-common';
|
|
4
|
-
|
|
5
|
-
declare const ENUM_RESOLVERS_SIGNATURE = "export type EnumResolverSignature<T, AllowedValues = any> = { [key in keyof T]?: AllowedValues };";
|
|
6
|
-
interface ParsedTypeScriptResolversConfig extends ParsedResolversConfig {
|
|
7
|
-
useIndexSignature: boolean;
|
|
8
|
-
wrapFieldDefinitions: boolean;
|
|
9
|
-
allowParentTypeOverride: boolean;
|
|
10
|
-
optionalInfoArgument: boolean;
|
|
11
|
-
}
|
|
12
|
-
declare class TypeScriptResolversVisitor extends BaseResolversVisitor<TypeScriptResolversPluginConfig, ParsedTypeScriptResolversConfig> {
|
|
13
|
-
constructor(pluginConfig: TypeScriptResolversPluginConfig, schema: GraphQLSchema);
|
|
14
|
-
protected transformParentGenericType(parentType: string): string;
|
|
15
|
-
protected formatRootResolver(schemaTypeName: string, resolverType: string, declarationKind: DeclarationKind): string;
|
|
16
|
-
private clearOptional;
|
|
17
|
-
ListType(node: ListTypeNode): string;
|
|
18
|
-
protected wrapWithListType(str: string): string;
|
|
19
|
-
protected getParentTypeForSignature(node: FieldDefinitionNode): "UnwrappedObject<ParentType>" | "ParentType";
|
|
20
|
-
NamedType(node: NamedTypeNode): string;
|
|
21
|
-
NonNullType(node: NonNullTypeNode): string;
|
|
22
|
-
protected getPunctuation(_declarationKind: DeclarationKind): string;
|
|
23
|
-
protected buildEnumResolverContentBlock(node: EnumTypeDefinitionNode, mappedEnumType: string): string;
|
|
24
|
-
protected buildEnumResolversExplicitMappedValues(node: EnumTypeDefinitionNode, valuesMapping: {
|
|
25
|
-
[valueName: string]: string | number;
|
|
26
|
-
}): string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export { ENUM_RESOLVERS_SIGNATURE, ParsedTypeScriptResolversConfig, TypeScriptResolversVisitor };
|