@graphql-tools/batch-execute 9.0.0 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/createBatchingExecutor.js +20 -29
- package/cjs/mergeRequests.js +1 -0
- package/cjs/splitResult.js +2 -1
- package/esm/createBatchingExecutor.js +21 -30
- package/esm/mergeRequests.js +2 -1
- package/esm/splitResult.js +2 -1
- package/package.json +2 -2
- package/typings/createBatchingExecutor.d.cts +1 -1
- package/typings/createBatchingExecutor.d.ts +1 -1
- package/typings/mergeRequests.d.cts +1 -1
- package/typings/mergeRequests.d.ts +1 -1
|
@@ -3,16 +3,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createBatchingExecutor = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const dataloader_1 = tslib_1.__importDefault(require("dataloader"));
|
|
6
|
+
const value_or_promise_1 = require("value-or-promise");
|
|
6
7
|
const utils_1 = require("@graphql-tools/utils");
|
|
7
8
|
const mergeRequests_js_1 = require("./mergeRequests.js");
|
|
8
9
|
const splitResult_js_1 = require("./splitResult.js");
|
|
9
|
-
const value_or_promise_1 = require("value-or-promise");
|
|
10
10
|
function createBatchingExecutor(executor, dataLoaderOptions, extensionsReducer = defaultExtensionsReducer) {
|
|
11
11
|
const loadFn = createLoadFn(executor, extensionsReducer);
|
|
12
|
-
const
|
|
12
|
+
const queryLoader = new dataloader_1.default(loadFn, dataLoaderOptions);
|
|
13
|
+
const mutationLoader = new dataloader_1.default(loadFn, dataLoaderOptions);
|
|
13
14
|
return function batchingExecutor(request) {
|
|
14
|
-
const
|
|
15
|
-
|
|
15
|
+
const operationType = request.operationType ?? (0, utils_1.getOperationASTFromRequest)(request)?.operation;
|
|
16
|
+
switch (operationType) {
|
|
17
|
+
case 'query':
|
|
18
|
+
return queryLoader.load(request);
|
|
19
|
+
case 'mutation':
|
|
20
|
+
return mutationLoader.load(request);
|
|
21
|
+
case 'subscription':
|
|
22
|
+
return executor(request);
|
|
23
|
+
default:
|
|
24
|
+
throw new Error(`Invalid operation type "${operationType}"`);
|
|
25
|
+
}
|
|
16
26
|
};
|
|
17
27
|
}
|
|
18
28
|
exports.createBatchingExecutor = createBatchingExecutor;
|
|
@@ -23,32 +33,13 @@ function createLoadFn(executor, extensionsReducer) {
|
|
|
23
33
|
.then((result) => [result])
|
|
24
34
|
.catch((err) => [err]);
|
|
25
35
|
}
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
execBatches.push(currentBatch);
|
|
31
|
-
const operationAst = (0, utils_1.getOperationASTFromRequest)(request);
|
|
32
|
-
const operationType = operationAst.operation;
|
|
33
|
-
if (operationType == null) {
|
|
34
|
-
throw new Error('could not identify operation type of document');
|
|
35
|
-
}
|
|
36
|
-
while (++index < requests.length) {
|
|
37
|
-
const currentRequest = requests[index];
|
|
38
|
-
const currentOperationAST = (0, utils_1.getOperationASTFromRequest)(currentRequest);
|
|
39
|
-
const currentOperationType = currentOperationAST.operation;
|
|
40
|
-
if (operationType === currentOperationType) {
|
|
41
|
-
currentBatch.push(currentRequest);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
currentBatch = [currentRequest];
|
|
45
|
-
execBatches.push(currentBatch);
|
|
36
|
+
const mergedRequests = (0, mergeRequests_js_1.mergeRequests)(requests, extensionsReducer);
|
|
37
|
+
return new value_or_promise_1.ValueOrPromise(() => executor(mergedRequests)).then(resultBatches => {
|
|
38
|
+
if ((0, utils_1.isAsyncIterable)(resultBatches)) {
|
|
39
|
+
throw new Error('Executor must not return incremental results for batching');
|
|
46
40
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const mergedRequests = (0, mergeRequests_js_1.mergeRequests)(execBatch, extensionsReducer);
|
|
50
|
-
return executor(mergedRequests);
|
|
51
|
-
}).then(resultBatches => (0, splitResult_js_1.splitResult)(resultBatches, execBatch.length)))).then(results => results.flat());
|
|
41
|
+
return (0, splitResult_js_1.splitResult)(resultBatches, requests.length);
|
|
42
|
+
});
|
|
52
43
|
};
|
|
53
44
|
}
|
|
54
45
|
function defaultExtensionsReducer(mergedExtensions, request) {
|
package/cjs/mergeRequests.js
CHANGED
package/cjs/splitResult.js
CHANGED
|
@@ -33,7 +33,8 @@ function splitResult({ data, errors }, numResults) {
|
|
|
33
33
|
const parsedKey = (0, prefix_js_1.parseKey)(error.path[0]);
|
|
34
34
|
const { index, originalKey } = parsedKey;
|
|
35
35
|
const newError = (0, utils_1.relocatedError)(error, [originalKey, ...error.path.slice(1)]);
|
|
36
|
-
const resultErrors = (splitResults[index].errors = (splitResults[index].errors ||
|
|
36
|
+
const resultErrors = (splitResults[index].errors = (splitResults[index].errors ||
|
|
37
|
+
[]));
|
|
37
38
|
resultErrors.push(newError);
|
|
38
39
|
}
|
|
39
40
|
else {
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import DataLoader from 'dataloader';
|
|
2
|
-
import {
|
|
2
|
+
import { ValueOrPromise } from 'value-or-promise';
|
|
3
|
+
import { getOperationASTFromRequest, isAsyncIterable, } from '@graphql-tools/utils';
|
|
3
4
|
import { mergeRequests } from './mergeRequests.js';
|
|
4
5
|
import { splitResult } from './splitResult.js';
|
|
5
|
-
import { ValueOrPromise } from 'value-or-promise';
|
|
6
6
|
export function createBatchingExecutor(executor, dataLoaderOptions, extensionsReducer = defaultExtensionsReducer) {
|
|
7
7
|
const loadFn = createLoadFn(executor, extensionsReducer);
|
|
8
|
-
const
|
|
8
|
+
const queryLoader = new DataLoader(loadFn, dataLoaderOptions);
|
|
9
|
+
const mutationLoader = new DataLoader(loadFn, dataLoaderOptions);
|
|
9
10
|
return function batchingExecutor(request) {
|
|
10
|
-
const
|
|
11
|
-
|
|
11
|
+
const operationType = request.operationType ?? getOperationASTFromRequest(request)?.operation;
|
|
12
|
+
switch (operationType) {
|
|
13
|
+
case 'query':
|
|
14
|
+
return queryLoader.load(request);
|
|
15
|
+
case 'mutation':
|
|
16
|
+
return mutationLoader.load(request);
|
|
17
|
+
case 'subscription':
|
|
18
|
+
return executor(request);
|
|
19
|
+
default:
|
|
20
|
+
throw new Error(`Invalid operation type "${operationType}"`);
|
|
21
|
+
}
|
|
12
22
|
};
|
|
13
23
|
}
|
|
14
24
|
function createLoadFn(executor, extensionsReducer) {
|
|
@@ -18,32 +28,13 @@ function createLoadFn(executor, extensionsReducer) {
|
|
|
18
28
|
.then((result) => [result])
|
|
19
29
|
.catch((err) => [err]);
|
|
20
30
|
}
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
execBatches.push(currentBatch);
|
|
26
|
-
const operationAst = getOperationASTFromRequest(request);
|
|
27
|
-
const operationType = operationAst.operation;
|
|
28
|
-
if (operationType == null) {
|
|
29
|
-
throw new Error('could not identify operation type of document');
|
|
30
|
-
}
|
|
31
|
-
while (++index < requests.length) {
|
|
32
|
-
const currentRequest = requests[index];
|
|
33
|
-
const currentOperationAST = getOperationASTFromRequest(currentRequest);
|
|
34
|
-
const currentOperationType = currentOperationAST.operation;
|
|
35
|
-
if (operationType === currentOperationType) {
|
|
36
|
-
currentBatch.push(currentRequest);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
currentBatch = [currentRequest];
|
|
40
|
-
execBatches.push(currentBatch);
|
|
31
|
+
const mergedRequests = mergeRequests(requests, extensionsReducer);
|
|
32
|
+
return new ValueOrPromise(() => executor(mergedRequests)).then(resultBatches => {
|
|
33
|
+
if (isAsyncIterable(resultBatches)) {
|
|
34
|
+
throw new Error('Executor must not return incremental results for batching');
|
|
41
35
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const mergedRequests = mergeRequests(execBatch, extensionsReducer);
|
|
45
|
-
return executor(mergedRequests);
|
|
46
|
-
}).then(resultBatches => splitResult(resultBatches, execBatch.length)))).then(results => results.flat());
|
|
36
|
+
return splitResult(resultBatches, requests.length);
|
|
37
|
+
});
|
|
47
38
|
};
|
|
48
39
|
}
|
|
49
40
|
function defaultExtensionsReducer(mergedExtensions, request) {
|
package/esm/mergeRequests.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// adapted from https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/batching/merge-queries.js
|
|
2
|
-
import {
|
|
2
|
+
import { Kind, visit, } from 'graphql';
|
|
3
3
|
import { getOperationASTFromRequest } from '@graphql-tools/utils';
|
|
4
4
|
import { createPrefix } from './prefix.js';
|
|
5
5
|
/**
|
|
@@ -87,6 +87,7 @@ export function mergeRequests(requests, extensionsReducer) {
|
|
|
87
87
|
context: requests[0].context,
|
|
88
88
|
info: requests[0].info,
|
|
89
89
|
operationType,
|
|
90
|
+
rootValue: requests[0].rootValue,
|
|
90
91
|
};
|
|
91
92
|
}
|
|
92
93
|
function prefixRequest(prefix, request) {
|
package/esm/splitResult.js
CHANGED
|
@@ -30,7 +30,8 @@ export function splitResult({ data, errors }, numResults) {
|
|
|
30
30
|
const parsedKey = parseKey(error.path[0]);
|
|
31
31
|
const { index, originalKey } = parsedKey;
|
|
32
32
|
const newError = relocatedError(error, [originalKey, ...error.path.slice(1)]);
|
|
33
|
-
const resultErrors = (splitResults[index].errors = (splitResults[index].errors ||
|
|
33
|
+
const resultErrors = (splitResults[index].errors = (splitResults[index].errors ||
|
|
34
|
+
[]));
|
|
34
35
|
resultErrors.push(newError);
|
|
35
36
|
}
|
|
36
37
|
else {
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphql-tools/batch-execute",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.1",
|
|
4
4
|
"description": "A set of utils for faster development of GraphQL tools",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"peerDependencies": {
|
|
7
7
|
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@graphql-tools/utils": "^10.0.
|
|
10
|
+
"@graphql-tools/utils": "^10.0.5",
|
|
11
11
|
"dataloader": "^2.2.2",
|
|
12
12
|
"tslib": "^2.4.0",
|
|
13
13
|
"value-or-promise": "^1.0.12"
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import DataLoader from 'dataloader';
|
|
2
|
-
import {
|
|
2
|
+
import { ExecutionRequest, Executor } from '@graphql-tools/utils';
|
|
3
3
|
export declare function createBatchingExecutor(executor: Executor, dataLoaderOptions?: DataLoader.Options<any, any, any>, extensionsReducer?: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): Executor;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import DataLoader from 'dataloader';
|
|
2
|
-
import {
|
|
2
|
+
import { ExecutionRequest, Executor } from '@graphql-tools/utils';
|
|
3
3
|
export declare function createBatchingExecutor(executor: Executor, dataLoaderOptions?: DataLoader.Options<any, any, any>, extensionsReducer?: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): Executor;
|
|
@@ -33,4 +33,4 @@ import { ExecutionRequest } from '@graphql-tools/utils';
|
|
|
33
33
|
* }
|
|
34
34
|
* }
|
|
35
35
|
*/
|
|
36
|
-
export declare function mergeRequests(requests:
|
|
36
|
+
export declare function mergeRequests(requests: ReadonlyArray<ExecutionRequest>, extensionsReducer: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): ExecutionRequest;
|
|
@@ -33,4 +33,4 @@ import { ExecutionRequest } from '@graphql-tools/utils';
|
|
|
33
33
|
* }
|
|
34
34
|
* }
|
|
35
35
|
*/
|
|
36
|
-
export declare function mergeRequests(requests:
|
|
36
|
+
export declare function mergeRequests(requests: ReadonlyArray<ExecutionRequest>, extensionsReducer: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): ExecutionRequest;
|