1 | import { __assign, __awaiter, __generator, __read } from 'tslib';
|
2 | import { GraphQLList, getNamedType } from 'graphql';
|
3 | import DataLoader from 'dataloader';
|
4 | import { delegateToSchema } from '@graphql-tools/delegate/es5';
|
5 | import { relocatedError } from '@graphql-tools/utils/es5';
|
6 |
|
7 | var cache1 = new WeakMap();
|
8 | function 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 , 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 , keys.map(function () { return results; })];
|
36 | }
|
37 | values = valuesFromResults == null ? results : valuesFromResults(results, keys);
|
38 | return [2 , Array.isArray(values) ? values : keys.map(function () { return values; })];
|
39 | }
|
40 | });
|
41 | }); };
|
42 | }
|
43 | var cacheKeyFn = function (key) { return (typeof key === 'object' ? JSON.stringify(key) : key); };
|
44 | function 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 |
|
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 |
|
78 | function 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 |
|
90 | function 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 | }
|
100 | function createBatchDelegateFnImpl(options) {
|
101 | return function (batchDelegateOptions) {
|
102 | var loader = getLoader(__assign(__assign({}, options), batchDelegateOptions));
|
103 | return loader.load(batchDelegateOptions.key);
|
104 | };
|
105 | }
|
106 |
|
107 | export { batchDelegateToSchema, createBatchDelegateFn };
|