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