@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.
@@ -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 loader = new dataloader_1.default(loadFn, dataLoaderOptions);
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 operationAst = (0, utils_1.getOperationASTFromRequest)(request);
15
- return operationAst.operation === 'subscription' ? executor(request) : loader.load(request);
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 execBatches = [];
27
- let index = 0;
28
- const request = requests[index];
29
- let currentBatch = [request];
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
- return value_or_promise_1.ValueOrPromise.all(execBatches.map(execBatch => new value_or_promise_1.ValueOrPromise(() => {
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) {
@@ -90,6 +90,7 @@ function mergeRequests(requests, extensionsReducer) {
90
90
  context: requests[0].context,
91
91
  info: requests[0].info,
92
92
  operationType,
93
+ rootValue: requests[0].rootValue,
93
94
  };
94
95
  }
95
96
  exports.mergeRequests = mergeRequests;
@@ -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 { getOperationASTFromRequest } from '@graphql-tools/utils';
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 loader = new DataLoader(loadFn, dataLoaderOptions);
8
+ const queryLoader = new DataLoader(loadFn, dataLoaderOptions);
9
+ const mutationLoader = new DataLoader(loadFn, dataLoaderOptions);
9
10
  return function batchingExecutor(request) {
10
- const operationAst = getOperationASTFromRequest(request);
11
- return operationAst.operation === 'subscription' ? executor(request) : loader.load(request);
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 execBatches = [];
22
- let index = 0;
23
- const request = requests[index];
24
- let currentBatch = [request];
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
- return ValueOrPromise.all(execBatches.map(execBatch => new ValueOrPromise(() => {
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) {
@@ -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 { visit, Kind, } from 'graphql';
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) {
@@ -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.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.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 { Executor, ExecutionRequest } from '@graphql-tools/utils';
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 { Executor, ExecutionRequest } from '@graphql-tools/utils';
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: Array<ExecutionRequest>, extensionsReducer: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): ExecutionRequest;
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: Array<ExecutionRequest>, extensionsReducer: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): ExecutionRequest;
36
+ export declare function mergeRequests(requests: ReadonlyArray<ExecutionRequest>, extensionsReducer: (mergedExtensions: Record<string, any>, request: ExecutionRequest) => Record<string, any>): ExecutionRequest;