UNPKG

5.06 kBJavaScriptView Raw
1import { __assign, __awaiter, __generator, __read } from 'tslib';
2import { GraphQLList, getNamedType } from 'graphql';
3import DataLoader from 'dataloader';
4import { delegateToSchema } from '@graphql-tools/delegate/es5';
5import { relocatedError } from '@graphql-tools/utils/es5';
6
7var cache1 = new WeakMap();
8function createBatchFn(options) {
9 var _this = this;
10 var _a, _b;
11 var argsFromKeys = (_a = options.argsFromKeys) !== null && _a !== void 0 ? _a : (function (keys) { return ({ ids: keys }); });
12 var fieldName = (_b = options.fieldName) !== null && _b !== void 0 ? _b : options.info.fieldName;
13 var valuesFromResults = options.valuesFromResults, lazyOptionsFn = options.lazyOptionsFn;
14 return function (keys) { return __awaiter(_this, void 0, void 0, function () {
15 var results, values;
16 return __generator(this, function (_a) {
17 switch (_a.label) {
18 case 0: return [4 /*yield*/, delegateToSchema(__assign({ returnType: new GraphQLList(getNamedType(options.info.returnType)), onLocatedError: function (originalError) {
19 if (originalError.path == null) {
20 return originalError;
21 }
22 var _a = __read(originalError.path, 2), pathFieldName = _a[0], pathNumber = _a[1];
23 if (pathFieldName !== fieldName) {
24 return originalError;
25 }
26 var pathNumberType = typeof pathNumber;
27 if (pathNumberType !== 'number') {
28 return originalError;
29 }
30 return relocatedError(originalError, originalError.path.slice(0, 0).concat(originalError.path.slice(2)));
31 }, args: argsFromKeys(keys) }, (lazyOptionsFn == null ? options : lazyOptionsFn(options))))];
32 case 1:
33 results = _a.sent();
34 if (results instanceof Error) {
35 return [2 /*return*/, keys.map(function () { return results; })];
36 }
37 values = valuesFromResults == null ? results : valuesFromResults(results, keys);
38 return [2 /*return*/, Array.isArray(values) ? values : keys.map(function () { return values; })];
39 }
40 });
41 }); };
42}
43var cacheKeyFn = function (key) { return (typeof key === 'object' ? JSON.stringify(key) : key); };
44function getLoader(options) {
45 var _a;
46 var fieldName = (_a = options.fieldName) !== null && _a !== void 0 ? _a : options.info.fieldName;
47 var cache2 = cache1.get(options.info.fieldNodes);
48 // Prevents the keys to be passed with the same structure
49 var dataLoaderOptions = __assign({ cacheKeyFn: cacheKeyFn }, options.dataLoaderOptions);
50 if (cache2 === undefined) {
51 cache2 = new WeakMap();
52 cache1.set(options.info.fieldNodes, cache2);
53 var loaders_1 = Object.create(null);
54 cache2.set(options.schema, loaders_1);
55 var batchFn_1 = createBatchFn(options);
56 var loader_1 = new DataLoader(function (keys) { return batchFn_1(keys); }, dataLoaderOptions);
57 loaders_1[fieldName] = loader_1;
58 return loader_1;
59 }
60 var loaders = cache2.get(options.schema);
61 if (loaders === undefined) {
62 loaders = Object.create(null);
63 cache2.set(options.schema, loaders);
64 var batchFn_2 = createBatchFn(options);
65 var loader_2 = new DataLoader(function (keys) { return batchFn_2(keys); }, dataLoaderOptions);
66 loaders[fieldName] = loader_2;
67 return loader_2;
68 }
69 var loader = loaders[fieldName];
70 if (loader === undefined) {
71 var batchFn_3 = createBatchFn(options);
72 loader = new DataLoader(function (keys) { return batchFn_3(keys); }, dataLoaderOptions);
73 loaders[fieldName] = loader;
74 }
75 return loader;
76}
77
78function batchDelegateToSchema(options) {
79 var key = options.key;
80 if (key == null) {
81 return null;
82 }
83 else if (Array.isArray(key) && !key.length) {
84 return [];
85 }
86 var loader = getLoader(options);
87 return Array.isArray(key) ? loader.loadMany(key) : loader.load(key);
88}
89
90function createBatchDelegateFn(optionsOrArgsFromKeys, lazyOptionsFn, dataLoaderOptions, valuesFromResults) {
91 return typeof optionsOrArgsFromKeys === 'function'
92 ? createBatchDelegateFnImpl({
93 argsFromKeys: optionsOrArgsFromKeys,
94 lazyOptionsFn: lazyOptionsFn,
95 dataLoaderOptions: dataLoaderOptions,
96 valuesFromResults: valuesFromResults,
97 })
98 : createBatchDelegateFnImpl(optionsOrArgsFromKeys);
99}
100function createBatchDelegateFnImpl(options) {
101 return function (batchDelegateOptions) {
102 var loader = getLoader(__assign(__assign({}, options), batchDelegateOptions));
103 return loader.load(batchDelegateOptions.key);
104 };
105}
106
107export { batchDelegateToSchema, createBatchDelegateFn };