@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.
- package/dist/endpoint.d.ts +2 -1
- package/dist/endpoint.js +33 -21
- package/dist/endpoint.mjs +13 -8
- package/dist/index.d.ts +2 -2
- package/dist/index.js +12 -10
- package/dist/index.mjs +9 -3
- package/dist/{types-4ecbabdf.d.ts → types-9b559f16.d.ts} +14 -2
- package/dist/types-c109c17f.d.ts +85 -0
- package/dist/types-c6f94d0b.d.ts +84 -0
- package/package.json +2 -2
- package/src/__snapshots__/generateTypescriptClient.test.ts.snap +15 -3
- package/src/__testClient.d.ts +7 -1
- package/src/__testClient.js +4 -1
- package/src/__testClient.mjs +4 -1
- package/src/endpoint.ts +20 -8
- package/src/generateTypescriptClient.test.ts +49 -2
- package/src/generateTypescriptClient.ts +8 -2
- package/src/jsonToGraphQLQuery.ts +4 -1
- package/src/types.ts +8 -0
- package/dist/chunk-I4QOADOI.mjs +0 -27
package/dist/endpoint.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { C as ClientConfig, I as IResponseListener, E as Endpoint } from './types-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
757
|
-
|
|
768
|
+
2,
|
|
769
|
+
4,
|
|
758
770
|
,
|
|
759
|
-
|
|
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:
|
|
782
|
+
requestHeaders: listenerData.headers,
|
|
771
783
|
query: query,
|
|
772
784
|
variables: variables,
|
|
773
785
|
errorsParser: apiConfig.errorsParser
|
|
774
786
|
})
|
|
775
787
|
];
|
|
776
|
-
case
|
|
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({},
|
|
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
|
|
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({},
|
|
824
|
+
executeListeners(apiConfig.responseListeners, _objectSpreadProps(_objectSpread({}, listenerData), {
|
|
813
825
|
response: error.response
|
|
814
826
|
}));
|
|
815
827
|
throw error;
|
|
816
|
-
case
|
|
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
|
|
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
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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-
|
|
3
|
-
export { C as ClientConfig,
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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("
|
|
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 "
|
|
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 {
|
|
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
|
package/src/__testClient.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// noinspection TypeScriptUnresolvedVariable, ES6UnusedImports, JSUnusedLocalSymbols, TypeScriptCheckImport
|
|
2
2
|
import { DeepRequired } from "ts-essentials"
|
|
3
|
-
import {
|
|
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
|
package/src/__testClient.js
CHANGED
|
@@ -26,7 +26,7 @@ __export(exports, {
|
|
|
26
26
|
default: () => stdin_default,
|
|
27
27
|
myApiClient: () => myApiClient
|
|
28
28
|
});
|
|
29
|
-
var import_endpoint = __toModule(require("
|
|
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;
|
package/src/__testClient.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getApiEndpointCreator } from "
|
|
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 {
|
|
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
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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 {
|
|
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).
|
|
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
|
|
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
|
|
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
|
package/dist/chunk-I4QOADOI.mjs
DELETED
|
@@ -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
|
-
};
|