@avantstay/graphql-ts-client 12.0.1 → 12.1.0

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.
@@ -1,7 +1,8 @@
1
- import { C as ClientConfig, I as IResponseListener, E as Endpoint } from './types-23d2d6aa.js';
1
+ import { C as ClientConfig, I as IRequestListener, c as IResponseListener, E as Endpoint } from './types-c6f94d0b.js';
2
2
 
3
3
  declare const getApiEndpointCreator: (apiConfig: {
4
4
  getClient: () => ClientConfig;
5
+ requestListeners: IRequestListener[];
5
6
  responseListeners: IResponseListener[];
6
7
  typesTree: any;
7
8
  maxAge: number;
package/dist/endpoint.js CHANGED
@@ -591,14 +591,17 @@ function _graphqlRequest() {
591
591
  return _graphqlRequest.apply(this, arguments);
592
592
  }
593
593
  // src/jsonToGraphQLQuery.ts
594
- var import_lodash = require("lodash");
594
+ var import_cloneDeep = __toESM(require("lodash/cloneDeep.js"));
595
+ var import_fromPairs = __toESM(require("lodash/fromPairs.js"));
596
+ var import_omit = __toESM(require("lodash/omit.js"));
597
+ var import_toPairs = __toESM(require("lodash/toPairs.js"));
595
598
  var VAR_PREFIX = "@@VAR@@";
596
599
  var VAR_PREFIX_LENGTH = VAR_PREFIX.length;
597
600
  function jsonToGraphQLQuery(param) {
598
601
  var kind = param.kind, queryName = param.queryName, _param_jsonQuery = param.jsonQuery, jsonQuery = _param_jsonQuery === void 0 ? {} : _param_jsonQuery, typesTree = param.typesTree;
599
602
  var variablesData = {};
600
603
  var alias = jsonQuery.__alias;
601
- var newJsonQuery = (0, import_lodash.cloneDeep)((0, import_lodash.omit)(jsonQuery, [
604
+ var newJsonQuery = (0, import_cloneDeep.default)((0, import_omit.default)(jsonQuery, [
602
605
  "__alias",
603
606
  "__headers",
604
607
  "__url"
@@ -618,12 +621,12 @@ function jsonToGraphQLQuery(param) {
618
621
  });
619
622
  return variablesObj;
620
623
  }, {});
621
- var variablesQuery = Object.keys(variableItems).length ? "(".concat((0, import_lodash.toPairs)(variableItems).map(function(param) {
624
+ var variablesQuery = Object.keys(variableItems).length ? "(".concat((0, import_toPairs.default)(variableItems).map(function(param) {
622
625
  var _param = _slicedToArray(param, 2), queryName2 = _param[0], type = _param[1].type;
623
626
  return "$".concat(queryName2, ": ").concat(type);
624
627
  }).join(", "), ")") : "";
625
628
  var query = "".concat(kind, " ").concat(alias || queryName).concat(variablesQuery, " { ").concat(alias ? "".concat(alias, ":") : "").concat(queryName).concat(toGraphql(newJsonQuery), " }");
626
- var variables = (0, import_lodash.fromPairs)((0, import_lodash.toPairs)(variableItems).map(function(param) {
629
+ var variables = (0, import_fromPairs.default)((0, import_toPairs.default)(variableItems).map(function(param) {
627
630
  var _param = _slicedToArray(param, 2), k = _param[0], v = _param[1];
628
631
  return [
629
632
  k,
@@ -670,14 +673,14 @@ function extractVariables(param) {
670
673
  });
671
674
  }
672
675
  function toGraphql(jsonQuery) {
673
- var fields = (0, import_lodash.toPairs)(jsonQuery).filter(function(param) {
676
+ var fields = (0, import_toPairs.default)(jsonQuery).filter(function(param) {
674
677
  var _param = _slicedToArray(param, 2), k = _param[0], v = _param[1];
675
678
  return k !== "__args" && v !== false && v !== void 0;
676
679
  }).map(function(param) {
677
680
  var _param = _slicedToArray(param, 2), k = _param[0], v = _param[1];
678
681
  return typeof v === "object" ? "".concat(k).concat(toGraphql(v)) : k;
679
682
  }).join(" ");
680
- var validArgs = jsonQuery.__args ? (0, import_lodash.toPairs)(jsonQuery.__args).filter(function(param) {
683
+ var validArgs = jsonQuery.__args ? (0, import_toPairs.default)(jsonQuery.__args).filter(function(param) {
681
684
  var _param = _slicedToArray(param, 2), _ = _param[0], v = _param[1];
682
685
  return v !== void 0;
683
686
  }) : [];
@@ -721,13 +724,11 @@ var getApiEndpointCreator = function(apiConfig) {
721
724
  return function(kind, queryName) {
722
725
  var rawEndpoint = function() {
723
726
  var _ref = _asyncToGenerator(function(failureMode, jsonQuery) {
724
- var clientConfig, _jsonQuery___alias, alias, _jsonQuery___url, url, _jsonQuery___retry, shouldRetry, _jsonQuery___headers, requestHeaders, _jsonToGraphQLQuery, query, variables, start, logOptions, responseListenerData, _ref, data, errors, warnings, headers, status, response, error;
727
+ var _jsonQuery___alias, alias, _jsonQuery___retry, shouldRetry, _jsonQuery___headers, requestHeaders, _jsonToGraphQLQuery, query, variables, start, logOptions, listenerData, clientConfig, _jsonQuery___url, url, _ref, data, errors, warnings, headers, status, response, error;
725
728
  return __generator(this, function(_state) {
726
729
  switch(_state.label){
727
730
  case 0:
728
- clientConfig = apiConfig.getClient();
729
731
  alias = (_jsonQuery___alias = jsonQuery === null || jsonQuery === void 0 ? void 0 : jsonQuery.__alias) !== null && _jsonQuery___alias !== void 0 ? _jsonQuery___alias : queryName;
730
- url = (_jsonQuery___url = jsonQuery === null || jsonQuery === void 0 ? void 0 : jsonQuery.__url) !== null && _jsonQuery___url !== void 0 ? _jsonQuery___url : clientConfig.url;
731
732
  shouldRetry = (_jsonQuery___retry = jsonQuery === null || jsonQuery === void 0 ? void 0 : jsonQuery.__retry) !== null && _jsonQuery___retry !== void 0 ? _jsonQuery___retry : true;
732
733
  requestHeaders = (_jsonQuery___headers = jsonQuery === null || jsonQuery === void 0 ? void 0 : jsonQuery.__headers) !== null && _jsonQuery___headers !== void 0 ? _jsonQuery___headers : {};
733
734
  _jsonToGraphQLQuery = jsonToGraphQLQuery({
@@ -745,18 +746,29 @@ var getApiEndpointCreator = function(apiConfig) {
745
746
  query: query,
746
747
  variables: variables
747
748
  };
748
- responseListenerData = {
749
+ listenerData = {
749
750
  queryName: alias,
750
751
  query: apiConfig.formatGraphQL(query),
751
- variables: variables
752
+ variables: variables,
753
+ headers: _objectSpread({}, requestHeaders)
752
754
  };
753
- _state.label = 1;
755
+ return [
756
+ 4,
757
+ Promise.all(apiConfig.requestListeners.map(function(listener) {
758
+ return listener(listenerData);
759
+ }))
760
+ ];
754
761
  case 1:
762
+ _state.sent();
763
+ clientConfig = apiConfig.getClient();
764
+ url = (_jsonQuery___url = jsonQuery === null || jsonQuery === void 0 ? void 0 : jsonQuery.__url) !== null && _jsonQuery___url !== void 0 ? _jsonQuery___url : clientConfig.url;
765
+ _state.label = 2;
766
+ case 2:
755
767
  _state.trys.push([
756
- 1,
757
- 3,
768
+ 2,
769
+ 4,
758
770
  ,
759
- 4
771
+ 5
760
772
  ]);
761
773
  return [
762
774
  4,
@@ -767,13 +779,13 @@ var getApiEndpointCreator = function(apiConfig) {
767
779
  client: _objectSpreadProps(_objectSpread({}, clientConfig), {
768
780
  url: url
769
781
  }),
770
- requestHeaders: requestHeaders,
782
+ requestHeaders: listenerData.headers,
771
783
  query: query,
772
784
  variables: variables,
773
785
  errorsParser: apiConfig.errorsParser
774
786
  })
775
787
  ];
776
- case 2:
788
+ case 3:
777
789
  _ref = _state.sent(), data = _ref.data, errors = _ref.errors, warnings = _ref.warnings, headers = _ref.headers, status = _ref.status;
778
790
  response = {
779
791
  data: data,
@@ -788,7 +800,7 @@ var getApiEndpointCreator = function(apiConfig) {
788
800
  duration: +new Date() - start
789
801
  }));
790
802
  }
791
- executeListeners(apiConfig.responseListeners, _objectSpreadProps(_objectSpread({}, responseListenerData), {
803
+ executeListeners(apiConfig.responseListeners, _objectSpreadProps(_objectSpread({}, listenerData), {
792
804
  response: response
793
805
  }));
794
806
  return [
@@ -801,7 +813,7 @@ var getApiEndpointCreator = function(apiConfig) {
801
813
  status: status
802
814
  }
803
815
  ];
804
- case 3:
816
+ case 4:
805
817
  error = _state.sent();
806
818
  if (apiConfig.verbose && globalThis.document) {
807
819
  logRequest(_objectSpreadProps(_objectSpread({}, logOptions), {
@@ -809,11 +821,11 @@ var getApiEndpointCreator = function(apiConfig) {
809
821
  duration: +new Date() - start
810
822
  }));
811
823
  }
812
- executeListeners(apiConfig.responseListeners, _objectSpreadProps(_objectSpread({}, responseListenerData), {
824
+ executeListeners(apiConfig.responseListeners, _objectSpreadProps(_objectSpread({}, listenerData), {
813
825
  response: error.response
814
826
  }));
815
827
  throw error;
816
- case 4:
828
+ case 5:
817
829
  return [
818
830
  2
819
831
  ];
package/dist/endpoint.mjs CHANGED
@@ -79,7 +79,10 @@ async function graphqlRequest({
79
79
  }
80
80
 
81
81
  // src/jsonToGraphQLQuery.ts
82
- import { cloneDeep, fromPairs as fromEntries, omit, toPairs as entries } from "lodash";
82
+ import cloneDeep from "lodash/cloneDeep.js";
83
+ import fromEntries from "lodash/fromPairs.js";
84
+ import omit from "lodash/omit.js";
85
+ import entries from "lodash/toPairs.js";
83
86
  var VAR_PREFIX = "@@VAR@@";
84
87
  var VAR_PREFIX_LENGTH = VAR_PREFIX.length;
85
88
  function jsonToGraphQLQuery({
@@ -194,9 +197,7 @@ function logRequest(logInfo) {
194
197
  var executeListeners = (listeners, data) => setTimeout(() => listeners.forEach((runResponseListener) => runResponseListener(data)));
195
198
  var getApiEndpointCreator = (apiConfig) => (kind, queryName) => {
196
199
  const rawEndpoint = async (failureMode, jsonQuery) => {
197
- const clientConfig = apiConfig.getClient();
198
200
  const alias = jsonQuery?.__alias ?? queryName;
199
- const url = jsonQuery?.__url ?? clientConfig.url;
200
201
  const shouldRetry = jsonQuery?.__retry ?? true;
201
202
  const requestHeaders = jsonQuery?.__headers ?? {};
202
203
  const { query, variables } = jsonToGraphQLQuery({ kind, queryName, jsonQuery, typesTree: apiConfig.typesTree });
@@ -209,18 +210,22 @@ var getApiEndpointCreator = (apiConfig) => (kind, queryName) => {
209
210
  query,
210
211
  variables
211
212
  };
212
- const responseListenerData = {
213
+ const listenerData = {
213
214
  queryName: alias,
214
215
  query: apiConfig.formatGraphQL(query),
215
- variables
216
+ variables,
217
+ headers: { ...requestHeaders }
216
218
  };
219
+ await Promise.all(apiConfig.requestListeners.map((listener) => listener(listenerData)));
220
+ const clientConfig = apiConfig.getClient();
221
+ const url = jsonQuery?.__url ?? clientConfig.url;
217
222
  try {
218
223
  const { data, errors, warnings, headers, status } = await graphqlRequest({
219
224
  shouldRetry,
220
225
  failureMode,
221
226
  queryName: alias,
222
227
  client: { ...clientConfig, url },
223
- requestHeaders,
228
+ requestHeaders: listenerData.headers,
224
229
  query,
225
230
  variables,
226
231
  errorsParser: apiConfig.errorsParser
@@ -234,7 +239,7 @@ var getApiEndpointCreator = (apiConfig) => (kind, queryName) => {
234
239
  });
235
240
  }
236
241
  executeListeners(apiConfig.responseListeners, {
237
- ...responseListenerData,
242
+ ...listenerData,
238
243
  response
239
244
  });
240
245
  return { data: data?.[alias], errors, warnings, headers, status };
@@ -247,7 +252,7 @@ var getApiEndpointCreator = (apiConfig) => (kind, queryName) => {
247
252
  });
248
253
  }
249
254
  executeListeners(apiConfig.responseListeners, {
250
- ...responseListenerData,
255
+ ...listenerData,
251
256
  response: error.response
252
257
  });
253
258
  throw error;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { PathLike } from 'fs';
2
- import { T as TypescriptClientOutput } from './types-23d2d6aa.js';
3
- export { C as ClientConfig, c as DeepReplace, D as Defined, E as Endpoint, G as GraphQLClientError, I as IResponseListener, J as JsonOutput, L as LogInfo, M as Maybe, P as Projection, d as RawEndpoint, b as Replacement, R as ResponseData, a as ResponseListenerInfo, T as TypescriptClientOutput, U as Unpacked } from './types-23d2d6aa.js';
2
+ import { T as TypescriptClientOutput } from './types-c6f94d0b.js';
3
+ export { C as ClientConfig, e as DeepReplace, D as Defined, E as Endpoint, G as GraphQLClientError, I as IRequestListener, c as IResponseListener, J as JsonOutput, L as LogInfo, M as Maybe, P as Projection, f as RawEndpoint, d as Replacement, a as RequestListenerInfo, R as ResponseData, b as ResponseListenerInfo, T as TypescriptClientOutput, U as Unpacked } from './types-c6f94d0b.js';
4
4
 
5
5
  type IClientOptions = {
6
6
  output?: PathLike;
package/dist/index.js CHANGED
@@ -477,7 +477,9 @@ var import_case = __toESM(require("case"));
477
477
  var esbuild = __toESM(require("esbuild"));
478
478
  var fs = __toESM(require("fs"));
479
479
  var import_graphql = require("graphql");
480
- var import_lodash = require("lodash");
480
+ var import_kebabCase = __toESM(require("lodash/kebabCase.js"));
481
+ var import_orderBy = __toESM(require("lodash/orderBy.js"));
482
+ var import_set = __toESM(require("lodash/set.js"));
481
483
  var import_md5 = __toESM(require("md5"));
482
484
  var import_os = __toESM(require("os"));
483
485
  var import_path = __toESM(require("path"));
@@ -485,7 +487,7 @@ var prettier = __toESM(require("prettier"));
485
487
  // package.json
486
488
  var package_default = {
487
489
  name: "@avantstay/graphql-ts-client",
488
- version: "12.0.1",
490
+ version: "12.1.0",
489
491
  description: "GraphQL Typescript Client Generator",
490
492
  homepage: "https://github.com/avantstay/graphql-ts-client",
491
493
  bugs: {
@@ -690,9 +692,9 @@ function gqlSchemaToCode(gqlType, param) {
690
692
  if (rawKind === "SCALAR") {
691
693
  return outputType === "ts" ? "export declare type ".concat(gqlType.name, " = ").concat(/date/i.test(gqlType.name) ? "IDate" : "string") : "";
692
694
  }
693
- if (rawKind === "ENUM") return outputType === "ts" ? "\n export declare enum ".concat(gqlType.name, " {\n ").concat((0, import_lodash.orderBy)(gqlType.enumValues, "name").map(function(_) {
695
+ if (rawKind === "ENUM") return outputType === "ts" ? "\n export declare enum ".concat(gqlType.name, " {\n ").concat((0, import_orderBy.default)(gqlType.enumValues, "name").map(function(_) {
694
696
  return "".concat(import_case.default.camel(_.name), " = '").concat(_.name, "'");
695
- }).join(",\n "), "\n }") : "export const ".concat(gqlType.name, " = {").concat((0, import_lodash.orderBy)(gqlType.enumValues, "name").map(function(_) {
697
+ }).join(",\n "), "\n }") : "export const ".concat(gqlType.name, " = {").concat((0, import_orderBy.default)(gqlType.enumValues, "name").map(function(_) {
696
698
  return "".concat(import_case.default.camel(_.name), ": '").concat(_.name, "'");
697
699
  }).join(",\n "), "}");
698
700
  var fields = gqlType.fields && gqlType.fields || gqlType.inputFields && gqlType.inputFields || [];
@@ -738,7 +740,7 @@ function getTypesTreeCode(types) {
738
740
  return _.args.forEach(function(a) {
739
741
  var inputType = getGraphQLInputType(a.type);
740
742
  if (inputType) {
741
- (0, import_lodash.set)(typesTree, "".concat(type.name, ".").concat(_.name, ".__args.").concat(a.name), inputType);
743
+ (0, import_set.default)(typesTree, "".concat(type.name, ".").concat(_.name, ".__args.").concat(a.name), inputType);
742
744
  }
743
745
  });
744
746
  });
@@ -747,7 +749,7 @@ function getTypesTreeCode(types) {
747
749
  return t.fields.forEach(function(f) {
748
750
  var outputType = getGraphQLOutputType(f.type);
749
751
  if (outputType) {
750
- (0, import_lodash.set)(typesTree, "".concat(t.name, ".").concat(f.name, ".__shape"), outputType);
752
+ (0, import_set.default)(typesTree, "".concat(t.name, ".").concat(f.name, ".__shape"), outputType);
751
753
  }
752
754
  });
753
755
  });
@@ -808,12 +810,12 @@ function generateClientCode(types, options) {
808
810
  selection: false,
809
811
  outputType: "js"
810
812
  });
811
- }).join("\n"), "\n\n // Schema Resolution Tree\n ").concat(getTypesTreeCode(forInputExtraction), "\n\n let verbose = ").concat(Boolean(options.verbose), "\n let headers = {}\n let url = '").concat(options.endpoint, "'\n let retryConfig = {\n max: 0,\n before: undefined,\n waitBeforeRetry: 0\n }\n let responseListeners = []\n let errorsParser = ").concat(options.errorsParser, "\n // noinspection JSUnusedLocalSymbols\n let apiEndpoint = getApiEndpointCreator({\n getClient: () => ({ url, headers, retryConfig }),\n responseListeners,\n maxAge: 30000,\n verbose,\n typesTree,\n formatGraphQL,\n errorsParser\n })\n\n export const ").concat(clientName, " = {\n addResponseListener: (listener) => responseListeners.push(\n listener),\n setHeader: (key, value) => {\n headers[key] = value\n },\n setHeaders: (newHeaders) => {\n headers = newHeaders\n },\n setRetryConfig: (options) => {\n if (!Number.isInteger(options.max) || options.max < 0) {\n throw new Error('retryOptions.max should be a non-negative integer')\n }\n \n retryConfig = { \n max: options.max,\n waitBeforeRetry: options.waitBeforeRetry,\n before: options.before \n }\n },\n setUrl: (_url) => url = _url,\n queries: {\n ").concat(queries.map(function(query) {
813
+ }).join("\n"), "\n\n // Schema Resolution Tree\n ").concat(getTypesTreeCode(forInputExtraction), "\n\n let verbose = ").concat(Boolean(options.verbose), "\n let headers = {}\n let url = '").concat(options.endpoint, "'\n let retryConfig = {\n max: 0,\n before: undefined,\n waitBeforeRetry: 0\n }\n let requestListeners = []\n let responseListeners = []\n let errorsParser = ").concat(options.errorsParser, "\n // noinspection JSUnusedLocalSymbols\n let apiEndpoint = getApiEndpointCreator({\n getClient: () => ({ url, headers, retryConfig }),\n requestListeners,\n responseListeners,\n maxAge: 30000,\n verbose,\n typesTree,\n formatGraphQL,\n errorsParser\n })\n\n export const ").concat(clientName, " = {\n addRequestListener: (listener) => requestListeners.push(listener),\n addResponseListener: (listener) => responseListeners.push(\n listener),\n setHeader: (key, value) => {\n headers[key] = value\n },\n setHeaders: (newHeaders) => {\n headers = newHeaders\n },\n setRetryConfig: (options) => {\n if (!Number.isInteger(options.max) || options.max < 0) {\n throw new Error('retryOptions.max should be a non-negative integer')\n }\n \n retryConfig = { \n max: options.max,\n waitBeforeRetry: options.waitBeforeRetry,\n before: options.before \n }\n },\n setUrl: (_url) => url = _url,\n queries: {\n ").concat(queries.map(function(query) {
812
814
  return gqlEndpointToCode("query", query, "js");
813
815
  }).join(",\n"), "\n },\n mutations: {\n ").concat(mutations.map(function(mutation) {
814
816
  return gqlEndpointToCode("mutation", mutation, "js");
815
817
  }).join(",\n"), "\n }\n }\n\n export default ").concat(clientName);
816
- var typingsCode = "\n // noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport\n import { DeepRequired } from 'ts-essentials'\n import { Maybe, IResponseListener, Endpoint } from '".concat(graphqlTsClientPath, "'\n\n // Scalars\n export type IDate = string | Date\n ").concat(scalars.map(function(it) {
818
+ var typingsCode = "\n // noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport\n import { DeepRequired } from 'ts-essentials'\n import { Maybe, IRequestListener, IResponseListener, Endpoint } from '".concat(graphqlTsClientPath, "'\n\n // Scalars\n export type IDate = string | Date\n ").concat(scalars.map(function(it) {
817
819
  return gqlSchemaToCode(it, {
818
820
  selection: false,
819
821
  outputType: "ts"
@@ -840,7 +842,7 @@ function generateClientCode(types, options) {
840
842
  selection: true,
841
843
  outputType: "ts"
842
844
  });
843
- }).join("\n"), "\n \n export declare const ").concat(clientName, ": {\n addResponseListener: (listener: IResponseListener) => void\n setHeader: (key: string, value: string) => void\n setHeaders: (newHeaders: { [k: string]: string }) => void,\n setUrl: (url: string) => void,\n setRetryConfig: (options: { max: number, waitBeforeRetry?: number, before?: IResponseListener }) => void\n queries: {\n ").concat(queries.map(function(q) {
845
+ }).join("\n"), "\n \n export declare const ").concat(clientName, ": {\n addRequestListener: (listener: IRequestListener) => void\n addResponseListener: (listener: IResponseListener) => void\n setHeader: (key: string, value: string) => void\n setHeaders: (newHeaders: { [k: string]: string }) => void,\n setUrl: (url: string) => void,\n setRetryConfig: (options: { max: number, waitBeforeRetry?: number, before?: IResponseListener }) => void\n queries: {\n ").concat(queries.map(function(q) {
844
846
  return gqlEndpointToCode("query", q, "ts");
845
847
  }).join(",\n"), "\n },\n mutations: {\n ").concat(mutations.map(function(q) {
846
848
  return gqlEndpointToCode("mutation", q, "ts");
@@ -872,7 +874,7 @@ function _fetchIntrospection() {
872
874
  switch(_state.label){
873
875
  case 0:
874
876
  endpoint = param.endpoint, headers = param.headers;
875
- introspectionCacheFileName = "gql-ts-client__introspection__".concat((0, import_lodash.kebabCase)(endpoint), ".json");
877
+ introspectionCacheFileName = "gql-ts-client__introspection__".concat((0, import_kebabCase.default)(endpoint), ".json");
876
878
  introspectionCacheFilePath = import_path.default.resolve(tempDir, introspectionCacheFileName);
877
879
  loadedFromCache = false;
878
880
  return [
package/dist/index.mjs CHANGED
@@ -13,7 +13,9 @@ import {
13
13
  getIntrospectionQuery,
14
14
  graphqlSync
15
15
  } from "graphql";
16
- import { kebabCase, orderBy, set } from "lodash";
16
+ import kebabCase from "lodash/kebabCase.js";
17
+ import orderBy from "lodash/orderBy.js";
18
+ import set from "lodash/set.js";
17
19
  import md5 from "md5";
18
20
  import os from "os";
19
21
  import path from "path";
@@ -22,7 +24,7 @@ import * as prettier from "prettier";
22
24
  // package.json
23
25
  var package_default = {
24
26
  name: "@avantstay/graphql-ts-client",
25
- version: "12.0.1",
27
+ version: "12.1.0",
26
28
  description: "GraphQL Typescript Client Generator",
27
29
  homepage: "https://github.com/avantstay/graphql-ts-client",
28
30
  bugs: {
@@ -353,11 +355,13 @@ function generateClientCode(types, options) {
353
355
  before: undefined,
354
356
  waitBeforeRetry: 0
355
357
  }
358
+ let requestListeners = []
356
359
  let responseListeners = []
357
360
  let errorsParser = ${options.errorsParser}
358
361
  // noinspection JSUnusedLocalSymbols
359
362
  let apiEndpoint = getApiEndpointCreator({
360
363
  getClient: () => ({ url, headers, retryConfig }),
364
+ requestListeners,
361
365
  responseListeners,
362
366
  maxAge: 30000,
363
367
  verbose,
@@ -367,6 +371,7 @@ function generateClientCode(types, options) {
367
371
  })
368
372
 
369
373
  export const ${clientName} = {
374
+ addRequestListener: (listener) => requestListeners.push(listener),
370
375
  addResponseListener: (listener) => responseListeners.push(
371
376
  listener),
372
377
  setHeader: (key, value) => {
@@ -399,7 +404,7 @@ function generateClientCode(types, options) {
399
404
  const typingsCode = `
400
405
  // noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport
401
406
  import { DeepRequired } from 'ts-essentials'
402
- import { Maybe, IResponseListener, Endpoint } from '${graphqlTsClientPath}'
407
+ import { Maybe, IRequestListener, IResponseListener, Endpoint } from '${graphqlTsClientPath}'
403
408
 
404
409
  // Scalars
405
410
  export type IDate = string | Date
@@ -429,6 +434,7 @@ function generateClientCode(types, options) {
429
434
  ${objectTypes.filter((it) => it.name !== "Query").map((it) => gqlSchemaToCode(it, { selection: true, outputType: "ts" })).join("\n")}
430
435
 
431
436
  export declare const ${clientName}: {
437
+ addRequestListener: (listener: IRequestListener) => void
432
438
  addResponseListener: (listener: IResponseListener) => void
433
439
  setHeader: (key: string, value: string) => void
434
440
  setHeaders: (newHeaders: { [k: string]: string }) => void,
@@ -9,6 +9,12 @@ type ResponseData = {
9
9
  message: string;
10
10
  }[];
11
11
  };
12
+ type RequestListenerInfo = {
13
+ queryName: string;
14
+ query: string;
15
+ variables: any;
16
+ };
17
+ type IRequestListener = (info: RequestListenerInfo) => void | Promise<void>;
12
18
  type ResponseListenerInfo = {
13
19
  queryName: string;
14
20
  query: string;
@@ -17,7 +23,8 @@ type ResponseListenerInfo = {
17
23
  };
18
24
  type IResponseListener = (info: ResponseListenerInfo) => void | Promise<void>;
19
25
  type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
20
- type Projection<Selection, Base, E = never> = Base extends Array<any> ? ArrayElement<Base> extends Date | string | number | boolean | null | undefined | E ? ArrayElement<Base>[] : Projection<Defined<Selection>, ArrayElement<Base>, E>[] : Base extends Date | string | number | boolean | null | E ? Selection extends undefined ? Base | undefined : Base : {
26
+ type Primitive = Date | string | number | boolean | null | undefined;
27
+ type Projection<Selection, Base, E = never> = Base extends Array<any> ? ArrayElement<Base> extends Primitive | E ? ArrayElement<Base>[] : Projection<Defined<Selection>, ArrayElement<Base>, E>[] : Base extends Primitive | E ? Selection extends undefined ? Base | undefined : Base : {
21
28
  [k in keyof Selection & keyof Base]: Selection[k] extends boolean ? Base[k] : Base[k] extends Array<infer A> ? Projection<Defined<Selection[k]>, A, E>[] : Projection<Defined<Selection[k]>, Base[k], E>;
22
29
  };
23
30
  type Unpacked<T> = T extends (infer U)[] ? U : T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
@@ -59,6 +66,11 @@ type LogInfo = {
59
66
  error?: Error;
60
67
  duration: number;
61
68
  };
69
+ type TypescriptClientOutput = {
70
+ js: string;
71
+ mjs: string;
72
+ typings: string;
73
+ };
62
74
  declare class GraphQLClientError extends Error {
63
75
  responseData: ResponseData;
64
76
  constructor(responseData: ResponseData);
@@ -66,4 +78,4 @@ declare class GraphQLClientError extends Error {
66
78
  get response(): ResponseData;
67
79
  }
68
80
 
69
- export { ClientConfig as C, Defined as D, Endpoint as E, GraphQLClientError as G, IResponseListener as I, JsonOutput as J, LogInfo as L, Maybe as M, Projection as P, ResponseData as R, Unpacked as U, ResponseListenerInfo as a, Replacement as b, DeepReplace as c, RawEndpoint as d };
81
+ export { ClientConfig as C, Defined as D, Endpoint as E, GraphQLClientError as G, IRequestListener as I, JsonOutput as J, LogInfo as L, Maybe as M, Projection as P, ResponseData as R, TypescriptClientOutput as T, Unpacked as U, RequestListenerInfo as a, ResponseListenerInfo as b, IResponseListener as c, Replacement as d, DeepReplace as e, RawEndpoint as f };
@@ -0,0 +1,85 @@
1
+ type Maybe<T> = null | undefined | T;
2
+ type Defined<T> = Exclude<T, undefined>;
3
+ type ResponseData = {
4
+ data: any;
5
+ warnings: any;
6
+ headers: any;
7
+ status?: number;
8
+ errors: {
9
+ message: string;
10
+ }[];
11
+ };
12
+ type RequestListenerInfo = {
13
+ url: string;
14
+ queryName: string;
15
+ query: string;
16
+ variables: any;
17
+ headers: {
18
+ [key: string]: string;
19
+ };
20
+ };
21
+ type IRequestListener = (info: RequestListenerInfo) => void | Promise<void>;
22
+ type ResponseListenerInfo = {
23
+ queryName: string;
24
+ query: string;
25
+ variables: any;
26
+ response: ResponseData;
27
+ };
28
+ type IResponseListener = (info: ResponseListenerInfo) => void | Promise<void>;
29
+ type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
30
+ type Primitive = Date | string | number | boolean | null | undefined;
31
+ type Projection<Selection, Base, E = never> = Base extends Array<any> ? ArrayElement<Base> extends Primitive | E ? ArrayElement<Base>[] : Projection<Defined<Selection>, ArrayElement<Base>, E>[] : Base extends Primitive | E ? Selection extends undefined ? Base | undefined : Base : {
32
+ [k in keyof Selection & keyof Base]: Selection[k] extends boolean ? Base[k] : Base[k] extends Array<infer A> ? Projection<Defined<Selection[k]>, A, E>[] : Projection<Defined<Selection[k]>, Base[k], E>;
33
+ };
34
+ type Unpacked<T> = T extends (infer U)[] ? U : T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
35
+ type Replacement<M extends [any, any], T> = M extends any ? ([T] extends [M[0]] ? M[1] : never) : never;
36
+ type DeepReplace<T, Ignore, M extends [any, any]> = {
37
+ [P in keyof T]: T[P] extends M[0] ? T[P] extends Ignore ? T[P] extends object ? DeepReplace<T[P], Ignore, M> : T[P] : Replacement<M, T[P]> : T[P] extends object ? DeepReplace<T[P], Ignore, M> : T[P];
38
+ };
39
+ type RawEndpoint<I, O, E> = <S extends I>(jsonQuery?: S) => Promise<{
40
+ data: Projection<S, O, E>;
41
+ errors: any[];
42
+ warnings: any[];
43
+ headers: any;
44
+ status: any;
45
+ }>;
46
+ type JsonOutput<O, ToBeIgnored> = DeepReplace<O, ToBeIgnored, [string | Date, string]>;
47
+ type Endpoint<I, O, E> = (<S extends I>(jsonQuery?: S) => Promise<Projection<S, JsonOutput<O, E>, E>>) & {
48
+ memo: <S extends I>(jsonQuery?: S) => Promise<Projection<S, JsonOutput<O, E>, E>>;
49
+ memoRaw: RawEndpoint<I, JsonOutput<O, E>, E>;
50
+ raw: RawEndpoint<I, JsonOutput<O, E>, E>;
51
+ };
52
+ type ClientConfig = {
53
+ url: string;
54
+ headers: {
55
+ [key: string]: string;
56
+ };
57
+ retryConfig: {
58
+ max: number;
59
+ waitBeforeRetry?: number;
60
+ before: IResponseListener;
61
+ };
62
+ };
63
+ type LogInfo = {
64
+ query: string;
65
+ variables: any;
66
+ formatGraphQL: any;
67
+ kind: string;
68
+ queryName: string;
69
+ response?: any;
70
+ error?: Error;
71
+ duration: number;
72
+ };
73
+ type TypescriptClientOutput = {
74
+ js: string;
75
+ mjs: string;
76
+ typings: string;
77
+ };
78
+ declare class GraphQLClientError extends Error {
79
+ responseData: ResponseData;
80
+ constructor(responseData: ResponseData);
81
+ get message(): string;
82
+ get response(): ResponseData;
83
+ }
84
+
85
+ export { ClientConfig as C, Defined as D, Endpoint as E, GraphQLClientError as G, IRequestListener as I, JsonOutput as J, LogInfo as L, Maybe as M, Projection as P, ResponseData as R, TypescriptClientOutput as T, Unpacked as U, RequestListenerInfo as a, ResponseListenerInfo as b, IResponseListener as c, Replacement as d, DeepReplace as e, RawEndpoint as f };
@@ -0,0 +1,84 @@
1
+ type Maybe<T> = null | undefined | T;
2
+ type Defined<T> = Exclude<T, undefined>;
3
+ type ResponseData = {
4
+ data: any;
5
+ warnings: any;
6
+ headers: any;
7
+ status?: number;
8
+ errors: {
9
+ message: string;
10
+ }[];
11
+ };
12
+ type RequestListenerInfo = {
13
+ queryName: string;
14
+ query: string;
15
+ variables: any;
16
+ headers: {
17
+ [key: string]: string;
18
+ };
19
+ };
20
+ type IRequestListener = (info: RequestListenerInfo) => void | Promise<void>;
21
+ type ResponseListenerInfo = {
22
+ queryName: string;
23
+ query: string;
24
+ variables: any;
25
+ response: ResponseData;
26
+ };
27
+ type IResponseListener = (info: ResponseListenerInfo) => void | Promise<void>;
28
+ type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
29
+ type Primitive = Date | string | number | boolean | null | undefined;
30
+ type Projection<Selection, Base, E = never> = Base extends Array<any> ? ArrayElement<Base> extends Primitive | E ? ArrayElement<Base>[] : Projection<Defined<Selection>, ArrayElement<Base>, E>[] : Base extends Primitive | E ? Selection extends undefined ? Base | undefined : Base : {
31
+ [k in keyof Selection & keyof Base]: Selection[k] extends boolean ? Base[k] : Base[k] extends Array<infer A> ? Projection<Defined<Selection[k]>, A, E>[] : Projection<Defined<Selection[k]>, Base[k], E>;
32
+ };
33
+ type Unpacked<T> = T extends (infer U)[] ? U : T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
34
+ type Replacement<M extends [any, any], T> = M extends any ? ([T] extends [M[0]] ? M[1] : never) : never;
35
+ type DeepReplace<T, Ignore, M extends [any, any]> = {
36
+ [P in keyof T]: T[P] extends M[0] ? T[P] extends Ignore ? T[P] extends object ? DeepReplace<T[P], Ignore, M> : T[P] : Replacement<M, T[P]> : T[P] extends object ? DeepReplace<T[P], Ignore, M> : T[P];
37
+ };
38
+ type RawEndpoint<I, O, E> = <S extends I>(jsonQuery?: S) => Promise<{
39
+ data: Projection<S, O, E>;
40
+ errors: any[];
41
+ warnings: any[];
42
+ headers: any;
43
+ status: any;
44
+ }>;
45
+ type JsonOutput<O, ToBeIgnored> = DeepReplace<O, ToBeIgnored, [string | Date, string]>;
46
+ type Endpoint<I, O, E> = (<S extends I>(jsonQuery?: S) => Promise<Projection<S, JsonOutput<O, E>, E>>) & {
47
+ memo: <S extends I>(jsonQuery?: S) => Promise<Projection<S, JsonOutput<O, E>, E>>;
48
+ memoRaw: RawEndpoint<I, JsonOutput<O, E>, E>;
49
+ raw: RawEndpoint<I, JsonOutput<O, E>, E>;
50
+ };
51
+ type ClientConfig = {
52
+ url: string;
53
+ headers: {
54
+ [key: string]: string;
55
+ };
56
+ retryConfig: {
57
+ max: number;
58
+ waitBeforeRetry?: number;
59
+ before: IResponseListener;
60
+ };
61
+ };
62
+ type LogInfo = {
63
+ query: string;
64
+ variables: any;
65
+ formatGraphQL: any;
66
+ kind: string;
67
+ queryName: string;
68
+ response?: any;
69
+ error?: Error;
70
+ duration: number;
71
+ };
72
+ type TypescriptClientOutput = {
73
+ js: string;
74
+ mjs: string;
75
+ typings: string;
76
+ };
77
+ declare class GraphQLClientError extends Error {
78
+ responseData: ResponseData;
79
+ constructor(responseData: ResponseData);
80
+ get message(): string;
81
+ get response(): ResponseData;
82
+ }
83
+
84
+ export { ClientConfig as C, Defined as D, Endpoint as E, GraphQLClientError as G, IRequestListener as I, JsonOutput as J, LogInfo as L, Maybe as M, Projection as P, ResponseData as R, TypescriptClientOutput as T, Unpacked as U, RequestListenerInfo as a, ResponseListenerInfo as b, IResponseListener as c, Replacement as d, DeepReplace as e, RawEndpoint as f };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avantstay/graphql-ts-client",
3
- "version": "12.0.1",
3
+ "version": "12.1.0",
4
4
  "description": "GraphQL Typescript Client Generator",
5
5
  "homepage": "https://github.com/avantstay/graphql-ts-client",
6
6
  "bugs": {
@@ -91,4 +91,4 @@
91
91
  "limit": "10 KB"
92
92
  }
93
93
  ]
94
- }
94
+ }
@@ -29,7 +29,7 @@ __export(exports, {
29
29
  client: () => client,
30
30
  default: () => stdin_default
31
31
  });
32
- var import_endpoint = __toModule(require("./endpoint"));
32
+ var import_endpoint = __toModule(require("@avantstay/graphql-ts-client/dist/endpoint"));
33
33
  const formatGraphQL = (query) => query;
34
34
  const typesTree = {};
35
35
  let verbose = false;
@@ -40,10 +40,12 @@ let retryConfig = {
40
40
  before: void 0,
41
41
  waitBeforeRetry: 0
42
42
  };
43
+ let requestListeners = [];
43
44
  let responseListeners = [];
44
45
  let errorsParser = void 0;
45
46
  let apiEndpoint = (0, import_endpoint.getApiEndpointCreator)({
46
47
  getClient: () => ({ url, headers, retryConfig }),
48
+ requestListeners,
47
49
  responseListeners,
48
50
  maxAge: 3e4,
49
51
  verbose,
@@ -52,6 +54,7 @@ let apiEndpoint = (0, import_endpoint.getApiEndpointCreator)({
52
54
  errorsParser
53
55
  });
54
56
  const client = {
57
+ addRequestListener: (listener) => requestListeners.push(listener),
55
58
  addResponseListener: (listener) => responseListeners.push(listener),
56
59
  setHeader: (key, value) => {
57
60
  headers[key] = value;
@@ -77,7 +80,7 @@ const client = {
77
80
  };
78
81
  var stdin_default = client;
79
82
  ",
80
- "mjs": "import { getApiEndpointCreator } from "./endpoint";
83
+ "mjs": "import { getApiEndpointCreator } from "@avantstay/graphql-ts-client/dist/endpoint";
81
84
  const formatGraphQL = (query) => query;
82
85
  const typesTree = {};
83
86
  let verbose = false;
@@ -88,10 +91,12 @@ let retryConfig = {
88
91
  before: void 0,
89
92
  waitBeforeRetry: 0
90
93
  };
94
+ let requestListeners = [];
91
95
  let responseListeners = [];
92
96
  let errorsParser = void 0;
93
97
  let apiEndpoint = getApiEndpointCreator({
94
98
  getClient: () => ({ url, headers, retryConfig }),
99
+ requestListeners,
95
100
  responseListeners,
96
101
  maxAge: 3e4,
97
102
  verbose,
@@ -100,6 +105,7 @@ let apiEndpoint = getApiEndpointCreator({
100
105
  errorsParser
101
106
  });
102
107
  const client = {
108
+ addRequestListener: (listener) => requestListeners.push(listener),
103
109
  addResponseListener: (listener) => responseListeners.push(listener),
104
110
  setHeader: (key, value) => {
105
111
  headers[key] = value;
@@ -131,7 +137,12 @@ export {
131
137
  ",
132
138
  "typings": "// noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport
133
139
  import { DeepRequired } from "ts-essentials"
134
- import { Maybe, IResponseListener, Endpoint } from "."
140
+ import {
141
+ Maybe,
142
+ IRequestListener,
143
+ IResponseListener,
144
+ Endpoint,
145
+ } from "@avantstay/graphql-ts-client/dist"
135
146
 
136
147
  // Scalars
137
148
  export type IDate = string | Date
@@ -156,6 +167,7 @@ export interface Query {
156
167
  // Selection Types
157
168
 
158
169
  export declare const client: {
170
+ addRequestListener: (listener: IRequestListener) => void
159
171
  addResponseListener: (listener: IResponseListener) => void
160
172
  setHeader: (key: string, value: string) => void
161
173
  setHeaders: (newHeaders: { [k: string]: string }) => void
@@ -1,6 +1,11 @@
1
1
  // noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport
2
2
  import { DeepRequired } from "ts-essentials"
3
- import { Maybe, IResponseListener, Endpoint } from "."
3
+ import {
4
+ Maybe,
5
+ IRequestListener,
6
+ IResponseListener,
7
+ Endpoint,
8
+ } from "@avantstay/graphql-ts-client/dist"
4
9
 
5
10
  // Scalars
6
11
  export type IDate = string | Date
@@ -92,6 +97,7 @@ export interface BookSearchParamsSomeRequiredSelection {
92
97
  }
93
98
 
94
99
  export declare const myApiClient: {
100
+ addRequestListener: (listener: IRequestListener) => void
95
101
  addResponseListener: (listener: IResponseListener) => void
96
102
  setHeader: (key: string, value: string) => void
97
103
  setHeaders: (newHeaders: { [k: string]: string }) => void
@@ -26,7 +26,7 @@ __export(exports, {
26
26
  default: () => stdin_default,
27
27
  myApiClient: () => myApiClient
28
28
  });
29
- var import_endpoint = __toModule(require("./endpoint"));
29
+ var import_endpoint = __toModule(require("@avantstay/graphql-ts-client/dist/endpoint"));
30
30
  var import_standalone = __toModule(require("prettier/standalone"));
31
31
  var import_parser_graphql = __toModule(require("prettier/parser-graphql"));
32
32
  const formatGraphQL = (query) => (0, import_standalone.format)(query, { parser: "graphql", plugins: [import_parser_graphql.default] });
@@ -69,10 +69,12 @@ let retryConfig = {
69
69
  before: void 0,
70
70
  waitBeforeRetry: 0
71
71
  };
72
+ let requestListeners = [];
72
73
  let responseListeners = [];
73
74
  let errorsParser = void 0;
74
75
  let apiEndpoint = (0, import_endpoint.getApiEndpointCreator)({
75
76
  getClient: () => ({ url, headers, retryConfig }),
77
+ requestListeners,
76
78
  responseListeners,
77
79
  maxAge: 3e4,
78
80
  verbose,
@@ -81,6 +83,7 @@ let apiEndpoint = (0, import_endpoint.getApiEndpointCreator)({
81
83
  errorsParser
82
84
  });
83
85
  const myApiClient = {
86
+ addRequestListener: (listener) => requestListeners.push(listener),
84
87
  addResponseListener: (listener) => responseListeners.push(listener),
85
88
  setHeader: (key, value) => {
86
89
  headers[key] = value;
@@ -1,4 +1,4 @@
1
- import { getApiEndpointCreator } from "./endpoint";
1
+ import { getApiEndpointCreator } from "@avantstay/graphql-ts-client/dist/endpoint";
2
2
  import { format as formatCode } from "prettier/standalone";
3
3
  import parserGraphql from "prettier/parser-graphql";
4
4
  const formatGraphQL = (query) => formatCode(query, { parser: "graphql", plugins: [parserGraphql] });
@@ -41,10 +41,12 @@ let retryConfig = {
41
41
  before: void 0,
42
42
  waitBeforeRetry: 0
43
43
  };
44
+ let requestListeners = [];
44
45
  let responseListeners = [];
45
46
  let errorsParser = void 0;
46
47
  let apiEndpoint = getApiEndpointCreator({
47
48
  getClient: () => ({ url, headers, retryConfig }),
49
+ requestListeners,
48
50
  responseListeners,
49
51
  maxAge: 3e4,
50
52
  verbose,
@@ -53,6 +55,7 @@ let apiEndpoint = getApiEndpointCreator({
53
55
  errorsParser
54
56
  });
55
57
  const myApiClient = {
58
+ addRequestListener: (listener) => requestListeners.push(listener),
56
59
  addResponseListener: (listener) => responseListeners.push(listener),
57
60
  setHeader: (key, value) => {
58
61
  headers[key] = value;
package/src/endpoint.ts CHANGED
@@ -2,7 +2,15 @@ import memoize from 'moize'
2
2
  import { graphqlRequest } from './graphqlRequest'
3
3
  import { jsonToGraphQLQuery } from './jsonToGraphQLQuery'
4
4
  import { logRequest } from './logging'
5
- import { ClientConfig, Endpoint, GraphQLClientError, IResponseListener, Projection, ResponseListenerInfo } from './types'
5
+ import {
6
+ ClientConfig,
7
+ Endpoint,
8
+ GraphQLClientError,
9
+ IRequestListener,
10
+ IResponseListener,
11
+ Projection,
12
+ ResponseListenerInfo,
13
+ } from './types'
6
14
 
7
15
  const executeListeners = (listeners: IResponseListener[], data: ResponseListenerInfo) =>
8
16
  setTimeout(() => listeners.forEach(runResponseListener => runResponseListener(data)))
@@ -10,6 +18,7 @@ const executeListeners = (listeners: IResponseListener[], data: ResponseListener
10
18
  export const getApiEndpointCreator =
11
19
  (apiConfig: {
12
20
  getClient: () => ClientConfig
21
+ requestListeners: IRequestListener[]
13
22
  responseListeners: IResponseListener[]
14
23
  typesTree: any
15
24
  maxAge: number
@@ -28,10 +37,7 @@ export const getApiEndpointCreator =
28
37
  headers: any
29
38
  status: any
30
39
  }> => {
31
- const clientConfig = apiConfig.getClient()
32
-
33
40
  const alias = (jsonQuery as any)?.__alias ?? queryName
34
- const url = (jsonQuery as any)?.__url ?? clientConfig.url
35
41
  const shouldRetry = (jsonQuery as any)?.__retry ?? true
36
42
  const requestHeaders = (jsonQuery as any)?.__headers ?? {}
37
43
  const { query, variables } = jsonToGraphQLQuery({ kind, queryName, jsonQuery, typesTree: apiConfig.typesTree })
@@ -46,19 +52,25 @@ export const getApiEndpointCreator =
46
52
  variables,
47
53
  }
48
54
 
49
- const responseListenerData = {
55
+ const listenerData = {
50
56
  queryName: alias,
51
57
  query: apiConfig.formatGraphQL(query),
52
58
  variables,
59
+ headers: { ...requestHeaders },
53
60
  }
54
61
 
62
+ await Promise.all(apiConfig.requestListeners.map(listener => listener(listenerData)))
63
+
64
+ const clientConfig = apiConfig.getClient()
65
+ const url = (jsonQuery as any)?.__url ?? clientConfig.url
66
+
55
67
  try {
56
68
  const { data, errors, warnings, headers, status } = await graphqlRequest({
57
69
  shouldRetry,
58
70
  failureMode,
59
71
  queryName: alias,
60
72
  client: { ...clientConfig, url },
61
- requestHeaders,
73
+ requestHeaders: listenerData.headers,
62
74
  query,
63
75
  variables,
64
76
  errorsParser: apiConfig.errorsParser,
@@ -75,7 +87,7 @@ export const getApiEndpointCreator =
75
87
  }
76
88
 
77
89
  executeListeners(apiConfig.responseListeners, {
78
- ...responseListenerData,
90
+ ...listenerData,
79
91
  response,
80
92
  })
81
93
 
@@ -90,7 +102,7 @@ export const getApiEndpointCreator =
90
102
  }
91
103
 
92
104
  executeListeners(apiConfig.responseListeners, {
93
- ...responseListenerData,
105
+ ...listenerData,
94
106
  response: (error as GraphQLClientError).response,
95
107
  })
96
108
 
@@ -2,7 +2,7 @@ import { ApolloServer } from 'apollo-server'
2
2
  import * as path from 'path'
3
3
  import { generateTypescriptClient, generateTypescriptClientFromSDL } from './generateTypescriptClient'
4
4
  import { startServer } from './testServer'
5
- import { GraphQLClientError, ResponseListenerInfo } from './types'
5
+ import { RequestListenerInfo, ResponseListenerInfo } from './types'
6
6
 
7
7
  let testServer: { server: ApolloServer; url: string }
8
8
  let client: any
@@ -77,7 +77,7 @@ describe('Generated Client', () => {
77
77
  (err: any) => err
78
78
  )
79
79
 
80
- expect(result).toBeInstanceOf(GraphQLClientError)
80
+ expect(result.constructor.name).toContain('GraphQLClientError')
81
81
  expect(result.message).toBe('Failed lorem ipsum dolor')
82
82
  })
83
83
 
@@ -109,6 +109,53 @@ describe('Generated Client', () => {
109
109
  expect(failed).toBe(true)
110
110
  })
111
111
 
112
+ it('request listener is called before the request', async () => {
113
+ let requestData: RequestListenerInfo | undefined
114
+ client.addRequestListener((data: any) => (requestData = data))
115
+
116
+ await client.queries.booksWithoutParams({ title: true })
117
+
118
+ expect(requestData?.queryName).toBe('booksWithoutParams')
119
+ expect(requestData?.query).toBeDefined()
120
+ expect(requestData?.variables).toBeDefined()
121
+ })
122
+
123
+ it('header set in request listener is sent with the request', async () => {
124
+ const axios = require('axios')
125
+ const axiosSpy = jest.spyOn(axios, 'post')
126
+
127
+ client.addRequestListener(async () => {
128
+ const token = await Promise.resolve('my-fresh-token')
129
+ client.setHeader('Authorization', `Bearer ${token}`)
130
+ })
131
+
132
+ await client.queries.booksWithoutParams({ title: true })
133
+
134
+ expect(axiosSpy).toHaveBeenCalledWith(
135
+ expect.any(String),
136
+ expect.any(Object),
137
+ expect.objectContaining({
138
+ headers: expect.objectContaining({
139
+ Authorization: 'Bearer my-fresh-token',
140
+ }),
141
+ })
142
+ )
143
+
144
+ axiosSpy.mockRestore()
145
+ client.setHeader('Authorization', undefined)
146
+ })
147
+
148
+ it('request listener is called even for failing operations', async () => {
149
+ let requestData: RequestListenerInfo | undefined
150
+ client.addRequestListener((data: any) => (requestData = data))
151
+
152
+ try {
153
+ await client.queries.failingQuery({ __args: { id: 'hello' } })
154
+ } catch {}
155
+
156
+ expect(requestData?.queryName).toBe('failingQuery')
157
+ })
158
+
112
159
  it('failing operations throw errors', async () => {
113
160
  let responseData: ResponseListenerInfo | undefined
114
161
  client.addResponseListener((data: any) => (responseData = data))
@@ -16,7 +16,9 @@ import {
16
16
  IntrospectionOutputTypeRef,
17
17
  IntrospectionType,
18
18
  } from 'graphql'
19
- import { kebabCase, orderBy, set } from 'lodash'
19
+ import kebabCase from 'lodash/kebabCase.js'
20
+ import orderBy from 'lodash/orderBy.js'
21
+ import set from 'lodash/set.js'
20
22
  import md5 from 'md5'
21
23
  import os from 'os'
22
24
  import path from 'path'
@@ -374,11 +376,13 @@ function generateClientCode(types: ReadonlyArray<IntrospectionType>, options: Om
374
376
  before: undefined,
375
377
  waitBeforeRetry: 0
376
378
  }
379
+ let requestListeners = []
377
380
  let responseListeners = []
378
381
  let errorsParser = ${options.errorsParser}
379
382
  // noinspection JSUnusedLocalSymbols
380
383
  let apiEndpoint = getApiEndpointCreator({
381
384
  getClient: () => ({ url, headers, retryConfig }),
385
+ requestListeners,
382
386
  responseListeners,
383
387
  maxAge: 30000,
384
388
  verbose,
@@ -388,6 +392,7 @@ function generateClientCode(types: ReadonlyArray<IntrospectionType>, options: Om
388
392
  })
389
393
 
390
394
  export const ${clientName} = {
395
+ addRequestListener: (listener) => requestListeners.push(listener),
391
396
  addResponseListener: (listener) => responseListeners.push(
392
397
  listener),
393
398
  setHeader: (key, value) => {
@@ -422,7 +427,7 @@ function generateClientCode(types: ReadonlyArray<IntrospectionType>, options: Om
422
427
  const typingsCode = `
423
428
  // noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport
424
429
  import { DeepRequired } from 'ts-essentials'
425
- import { Maybe, IResponseListener, Endpoint } from '${graphqlTsClientPath}'
430
+ import { Maybe, IRequestListener, IResponseListener, Endpoint } from '${graphqlTsClientPath}'
426
431
 
427
432
  // Scalars
428
433
  export type IDate = string | Date
@@ -459,6 +464,7 @@ function generateClientCode(types: ReadonlyArray<IntrospectionType>, options: Om
459
464
  .join('\n')}
460
465
 
461
466
  export declare const ${clientName}: {
467
+ addRequestListener: (listener: IRequestListener) => void
462
468
  addResponseListener: (listener: IResponseListener) => void
463
469
  setHeader: (key: string, value: string) => void
464
470
  setHeaders: (newHeaders: { [k: string]: string }) => void,
@@ -1,4 +1,7 @@
1
- import { cloneDeep, fromPairs as fromEntries, omit, toPairs as entries } from 'lodash'
1
+ import cloneDeep from 'lodash/cloneDeep.js'
2
+ import fromEntries from 'lodash/fromPairs.js'
3
+ import omit from 'lodash/omit.js'
4
+ import entries from 'lodash/toPairs.js'
2
5
 
3
6
  const VAR_PREFIX = '@@VAR@@'
4
7
  const VAR_PREFIX_LENGTH = VAR_PREFIX.length
package/src/types.ts CHANGED
@@ -11,6 +11,14 @@ export type ResponseData = {
11
11
  }[]
12
12
  }
13
13
 
14
+ export type RequestListenerInfo = {
15
+ queryName: string
16
+ query: string
17
+ variables: any
18
+ headers: { [key: string]: string }
19
+ }
20
+ export type IRequestListener = (info: RequestListenerInfo) => void | Promise<void>
21
+
14
22
  export type ResponseListenerInfo = {
15
23
  queryName: string
16
24
  query: string
@@ -1,27 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw new Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
- // src/types.ts
10
- var GraphQLClientError = class extends Error {
11
- constructor(responseData) {
12
- super();
13
- this.responseData = responseData;
14
- Object.setPrototypeOf(this, GraphQLClientError.prototype);
15
- }
16
- get message() {
17
- return this.response.errors.map((it) => it.message).join(";\n");
18
- }
19
- get response() {
20
- return this.responseData;
21
- }
22
- };
23
-
24
- export {
25
- __require,
26
- GraphQLClientError
27
- };