1 | import { GraphQLError, GraphQLList, getNamedType } from 'graphql';
|
2 | import DataLoader from 'dataloader';
|
3 | import { delegateToSchema } from '@graphql-tools/delegate';
|
4 | import 'tslib';
|
5 |
|
6 | var VisitSchemaKind;
|
7 | (function (VisitSchemaKind) {
|
8 | VisitSchemaKind["TYPE"] = "VisitSchemaKind.TYPE";
|
9 | VisitSchemaKind["SCALAR_TYPE"] = "VisitSchemaKind.SCALAR_TYPE";
|
10 | VisitSchemaKind["ENUM_TYPE"] = "VisitSchemaKind.ENUM_TYPE";
|
11 | VisitSchemaKind["COMPOSITE_TYPE"] = "VisitSchemaKind.COMPOSITE_TYPE";
|
12 | VisitSchemaKind["OBJECT_TYPE"] = "VisitSchemaKind.OBJECT_TYPE";
|
13 | VisitSchemaKind["INPUT_OBJECT_TYPE"] = "VisitSchemaKind.INPUT_OBJECT_TYPE";
|
14 | VisitSchemaKind["ABSTRACT_TYPE"] = "VisitSchemaKind.ABSTRACT_TYPE";
|
15 | VisitSchemaKind["UNION_TYPE"] = "VisitSchemaKind.UNION_TYPE";
|
16 | VisitSchemaKind["INTERFACE_TYPE"] = "VisitSchemaKind.INTERFACE_TYPE";
|
17 | VisitSchemaKind["ROOT_OBJECT"] = "VisitSchemaKind.ROOT_OBJECT";
|
18 | VisitSchemaKind["QUERY"] = "VisitSchemaKind.QUERY";
|
19 | VisitSchemaKind["MUTATION"] = "VisitSchemaKind.MUTATION";
|
20 | VisitSchemaKind["SUBSCRIPTION"] = "VisitSchemaKind.SUBSCRIPTION";
|
21 | })(VisitSchemaKind || (VisitSchemaKind = {}));
|
22 | var MapperKind;
|
23 | (function (MapperKind) {
|
24 | MapperKind["TYPE"] = "MapperKind.TYPE";
|
25 | MapperKind["SCALAR_TYPE"] = "MapperKind.SCALAR_TYPE";
|
26 | MapperKind["ENUM_TYPE"] = "MapperKind.ENUM_TYPE";
|
27 | MapperKind["COMPOSITE_TYPE"] = "MapperKind.COMPOSITE_TYPE";
|
28 | MapperKind["OBJECT_TYPE"] = "MapperKind.OBJECT_TYPE";
|
29 | MapperKind["INPUT_OBJECT_TYPE"] = "MapperKind.INPUT_OBJECT_TYPE";
|
30 | MapperKind["ABSTRACT_TYPE"] = "MapperKind.ABSTRACT_TYPE";
|
31 | MapperKind["UNION_TYPE"] = "MapperKind.UNION_TYPE";
|
32 | MapperKind["INTERFACE_TYPE"] = "MapperKind.INTERFACE_TYPE";
|
33 | MapperKind["ROOT_OBJECT"] = "MapperKind.ROOT_OBJECT";
|
34 | MapperKind["QUERY"] = "MapperKind.QUERY";
|
35 | MapperKind["MUTATION"] = "MapperKind.MUTATION";
|
36 | MapperKind["SUBSCRIPTION"] = "MapperKind.SUBSCRIPTION";
|
37 | MapperKind["DIRECTIVE"] = "MapperKind.DIRECTIVE";
|
38 | MapperKind["FIELD"] = "MapperKind.FIELD";
|
39 | MapperKind["COMPOSITE_FIELD"] = "MapperKind.COMPOSITE_FIELD";
|
40 | MapperKind["OBJECT_FIELD"] = "MapperKind.OBJECT_FIELD";
|
41 | MapperKind["ROOT_FIELD"] = "MapperKind.ROOT_FIELD";
|
42 | MapperKind["QUERY_ROOT_FIELD"] = "MapperKind.QUERY_ROOT_FIELD";
|
43 | MapperKind["MUTATION_ROOT_FIELD"] = "MapperKind.MUTATION_ROOT_FIELD";
|
44 | MapperKind["SUBSCRIPTION_ROOT_FIELD"] = "MapperKind.SUBSCRIPTION_ROOT_FIELD";
|
45 | MapperKind["INTERFACE_FIELD"] = "MapperKind.INTERFACE_FIELD";
|
46 | MapperKind["INPUT_OBJECT_FIELD"] = "MapperKind.INPUT_OBJECT_FIELD";
|
47 | MapperKind["ARGUMENT"] = "MapperKind.ARGUMENT";
|
48 | MapperKind["ENUM_VALUE"] = "MapperKind.ENUM_VALUE";
|
49 | })(MapperKind || (MapperKind = {}));
|
50 |
|
51 | function relocatedError(originalError, path) {
|
52 | return new GraphQLError(originalError.message, originalError.nodes, originalError.source, originalError.positions, path === null ? undefined : path === undefined ? originalError.path : path, originalError.originalError, originalError.extensions);
|
53 | }
|
54 |
|
55 | const cache1 = new WeakMap();
|
56 | function createBatchFn(options) {
|
57 | var _a;
|
58 | const argsFromKeys = (_a = options.argsFromKeys) !== null && _a !== void 0 ? _a : ((keys) => ({ ids: keys }));
|
59 | const { valuesFromResults, lazyOptionsFn } = options;
|
60 | return async (keys) => {
|
61 | const results = await delegateToSchema({
|
62 | returnType: new GraphQLList(getNamedType(options.info.returnType)),
|
63 | onLocatedError: originalError => relocatedError(originalError, originalError.path.slice(0, 0).concat(originalError.path.slice(2))),
|
64 | args: argsFromKeys(keys),
|
65 | ...(lazyOptionsFn == null ? options : lazyOptionsFn(options)),
|
66 | });
|
67 | if (results instanceof Error) {
|
68 | return keys.map(() => results);
|
69 | }
|
70 | const values = valuesFromResults == null ? results : valuesFromResults(results, keys);
|
71 | return Array.isArray(values) ? values : keys.map(() => values);
|
72 | };
|
73 | }
|
74 | function getLoader(options) {
|
75 | var _a;
|
76 | const fieldName = (_a = options.fieldName) !== null && _a !== void 0 ? _a : options.info.fieldName;
|
77 | let cache2 = cache1.get(options.info.fieldNodes);
|
78 | if (cache2 === undefined) {
|
79 | cache2 = new WeakMap();
|
80 | cache1.set(options.info.fieldNodes, cache2);
|
81 | const loaders = Object.create(null);
|
82 | cache2.set(options.schema, loaders);
|
83 | const batchFn = createBatchFn(options);
|
84 | const loader = new DataLoader(keys => batchFn(keys), options.dataLoaderOptions);
|
85 | loaders[fieldName] = loader;
|
86 | return loader;
|
87 | }
|
88 | let loaders = cache2.get(options.schema);
|
89 | if (loaders === undefined) {
|
90 | loaders = Object.create(null);
|
91 | cache2.set(options.schema, loaders);
|
92 | const batchFn = createBatchFn(options);
|
93 | const loader = new DataLoader(keys => batchFn(keys), options.dataLoaderOptions);
|
94 | loaders[fieldName] = loader;
|
95 | return loader;
|
96 | }
|
97 | let loader = loaders[fieldName];
|
98 | if (loader === undefined) {
|
99 | const batchFn = createBatchFn(options);
|
100 | loader = new DataLoader(keys => batchFn(keys), options.dataLoaderOptions);
|
101 | loaders[fieldName] = loader;
|
102 | }
|
103 | return loader;
|
104 | }
|
105 |
|
106 | function batchDelegateToSchema(options) {
|
107 | const key = options.key;
|
108 | if (key == null) {
|
109 | return null;
|
110 | }
|
111 | else if (Array.isArray(key) && !key.length) {
|
112 | return [];
|
113 | }
|
114 | const loader = getLoader(options);
|
115 | return Array.isArray(key) ? loader.loadMany(key) : loader.load(key);
|
116 | }
|
117 |
|
118 | function createBatchDelegateFn(optionsOrArgsFromKeys, lazyOptionsFn, dataLoaderOptions, valuesFromResults) {
|
119 | return typeof optionsOrArgsFromKeys === 'function'
|
120 | ? createBatchDelegateFnImpl({
|
121 | argsFromKeys: optionsOrArgsFromKeys,
|
122 | lazyOptionsFn,
|
123 | dataLoaderOptions,
|
124 | valuesFromResults,
|
125 | })
|
126 | : createBatchDelegateFnImpl(optionsOrArgsFromKeys);
|
127 | }
|
128 | function createBatchDelegateFnImpl(options) {
|
129 | return batchDelegateOptions => {
|
130 | const loader = getLoader({
|
131 | ...options,
|
132 | ...batchDelegateOptions,
|
133 | });
|
134 | return loader.load(batchDelegateOptions.key);
|
135 | };
|
136 | }
|
137 |
|
138 | export { batchDelegateToSchema, createBatchDelegateFn };
|
139 |
|