UNPKG

6.29 kBJavaScriptView Raw
1import { GraphQLError, GraphQLList, getNamedType } from 'graphql';
2import DataLoader from 'dataloader';
3import { delegateToSchema } from '@graphql-tools/delegate';
4import 'tslib';
5
6var 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 = {}));
22var 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
51function 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
55const cache1 = new WeakMap();
56function 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}
74function 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
106function 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
118function 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}
128function createBatchDelegateFnImpl(options) {
129 return batchDelegateOptions => {
130 const loader = getLoader({
131 ...options,
132 ...batchDelegateOptions,
133 });
134 return loader.load(batchDelegateOptions.key);
135 };
136}
137
138export { batchDelegateToSchema, createBatchDelegateFn };
139//# sourceMappingURL=index.esm.js.map