@sebspark/openapi-client 2.2.3 → 2.4.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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BaseClient, ClientOptions } from '@sebspark/openapi-core';
1
+ import { BaseClient, ClientOptions, RequestOptions, APIResponse } from '@sebspark/openapi-core';
2
2
  import { AxiosInstance } from 'axios';
3
3
  import { Logger } from 'winston';
4
4
  export * from '@sebspark/retry';
@@ -8,4 +8,55 @@ type TypedAxiosClient<T> = T & {
8
8
  };
9
9
  declare const TypedClient: <C extends Partial<BaseClient>>(baseURL: string, globalOptions?: ClientOptions, logger?: Logger) => TypedAxiosClient<C>;
10
10
 
11
- export { type TypedAxiosClient, TypedClient };
11
+ type GatewayGraphqlClient$1 = Pick<BaseClient, 'post' | 'get'> & {
12
+ post: {
13
+ /**
14
+ *
15
+ * @param {string} url
16
+ * @param {Object} [args] - Optional. The arguments for the request.
17
+ * @param {Object} [args.body] - Optional. Request body for the request.
18
+ * @param {string} [args.body.query] - Optional.
19
+ * @param {object} [args.body.variables] - Optional.
20
+ * @param {RequestOptions} [opts] - Optional.
21
+ * @returns {Promise<APIResponse<{
22
+ }>>}
23
+ */
24
+ (url: '/graphql', args?: {
25
+ body?: {
26
+ query?: string;
27
+ variables?: Record<string, unknown>;
28
+ };
29
+ }, opts?: RequestOptions): Promise<APIResponse<{
30
+ data: Record<string, any>;
31
+ errors?: ({
32
+ message: string;
33
+ } & Record<string, any>)[];
34
+ }>>;
35
+ };
36
+ get: {
37
+ /**
38
+ *
39
+ * @param {string} url
40
+ * @param {RequestOptions} [opts] - Optional.
41
+ * @returns {Promise<undefined>}
42
+ */
43
+ (url: '/health', opts?: RequestOptions): Promise<undefined>;
44
+ };
45
+ };
46
+ type GatewayGraphqlClientArgs = {
47
+ logger: Logger;
48
+ uri: string;
49
+ apiKey: string;
50
+ };
51
+
52
+ declare class GatewayGraphqlClient<T extends GatewayGraphqlClient$1 = GatewayGraphqlClient$1> {
53
+ client: T;
54
+ logger: Logger;
55
+ private uri;
56
+ private options;
57
+ constructor(args: GatewayGraphqlClientArgs);
58
+ graphql<K>(query: string, variables?: Record<string, unknown>): Promise<K>;
59
+ isHealthy(): Promise<boolean>;
60
+ }
61
+
62
+ export { GatewayGraphqlClient, TypedAxiosClient, TypedClient };
package/dist/index.js CHANGED
@@ -1,49 +1,35 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
19
18
  };
20
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
21
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
- // If the importer is in node compatibility mode or this is not an ESM
23
- // file that has been converted to a CommonJS file using a Babel-
24
- // compatible transform (i.e. "__esModule" has not been set), then set
25
- // "default" to the CommonJS "module.exports" for node compatibility.
26
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
- mod
28
- ));
29
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
-
31
- // src/index.ts
32
- var index_exports = {};
33
- __export(index_exports, {
34
- TypedClient: () => TypedClient
35
- });
36
- module.exports = __toCommonJS(index_exports);
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
37
20
 
38
21
  // src/client.ts
39
- var import_openapi_core = require("@sebspark/openapi-core");
40
- var import_retry = require("@sebspark/retry");
41
- var import_axios = __toESM(require("axios"));
42
- var import_axios_auth_refresh = __toESM(require("axios-auth-refresh"));
22
+ var _openapicore = require('@sebspark/openapi-core');
23
+ var _retry = require('@sebspark/retry'); _createStarExport(_retry);
24
+ var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios);
25
+ var _axiosauthrefresh = require('axios-auth-refresh'); var _axiosauthrefresh2 = _interopRequireDefault(_axiosauthrefresh);
43
26
 
44
27
  // src/paramsSerializer.ts
45
28
  var encodeParam = (param) => encodeURIComponent(param);
46
29
  var encodeValue = (param, encodeCommas = false) => {
30
+ if (param instanceof Date) {
31
+ return encodeURIComponent(param.toISOString());
32
+ }
47
33
  if (typeof param === "number" || typeof param === "string" || typeof param === "boolean") {
48
34
  if (encodeCommas) {
49
35
  return encodeURIComponent(param);
@@ -93,59 +79,57 @@ var paramsSerializer = (format) => (params) => {
93
79
 
94
80
  // src/client.ts
95
81
  var TypedClient = (baseURL, globalOptions, logger) => {
96
- const axiosInstance = import_axios.default.create();
97
- logger?.debug(
98
- "client initialized with arrayFormat",
99
- globalOptions?.arrayFormat
100
- );
101
- if (globalOptions?.authorizationTokenGenerator) {
102
- logger?.debug("authorizationTokenGenerator is set");
82
+ const axiosInstance = _axios2.default.create();
83
+ logger == null ? void 0 : logger.debug("client initialized with arrayFormat", globalOptions == null ? void 0 : globalOptions.arrayFormat);
84
+ if (globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) {
85
+ logger == null ? void 0 : logger.debug("authorizationTokenGenerator is set");
103
86
  axiosInstance.interceptors.request.use(async (request) => {
104
87
  const url = `${request.baseURL}${request.url}`;
105
- logger?.debug(`Intercepting request to ${url}`);
106
- if (globalOptions?.authorizationTokenGenerator && url) {
88
+ logger == null ? void 0 : logger.debug(`Intercepting request to ${url}`);
89
+ if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) && url) {
107
90
  try {
108
91
  const authorizationTokenHeaders = await globalOptions.authorizationTokenGenerator(url);
109
92
  if (authorizationTokenHeaders) {
110
93
  for (const key of Object.keys(authorizationTokenHeaders)) {
111
94
  const value = authorizationTokenHeaders[key];
112
- logger?.debug(`Setting header ${key} to ${value}`);
95
+ logger == null ? void 0 : logger.debug(`Setting header ${key} to ${value}`);
113
96
  request.headers[key] = value;
114
97
  }
115
98
  }
116
99
  } catch (error) {
117
- logger?.error(`Error generating token for URL: ${url}`);
100
+ logger == null ? void 0 : logger.error(`Error generating token for URL: ${url}`);
118
101
  throw error;
119
102
  }
120
103
  }
121
- logger?.debug("Intercepted request:");
122
- logger?.debug(JSON.stringify(request, null, 2));
104
+ logger == null ? void 0 : logger.debug("Intercepted request:");
105
+ logger == null ? void 0 : logger.debug(JSON.stringify(request, null, 2));
123
106
  return request;
124
107
  });
125
108
  }
126
- if (globalOptions?.authorizationTokenRefresh) {
109
+ if (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) {
127
110
  const refreshAuthLogic = async (failedRequest) => {
128
- logger?.debug("Failed request");
129
- logger?.debug(JSON.stringify(failedRequest, null, 2));
130
- if (!import_axios.default.isAxiosError(failedRequest)) {
131
- logger?.error("Failed request is not an axios error");
111
+ var _a, _b;
112
+ logger == null ? void 0 : logger.debug("Failed request");
113
+ logger == null ? void 0 : logger.debug(JSON.stringify(failedRequest, null, 2));
114
+ if (!_axios2.default.isAxiosError(failedRequest)) {
115
+ logger == null ? void 0 : logger.error("Failed request is not an axios error");
132
116
  return;
133
117
  }
134
118
  const axiosError = failedRequest;
135
- logger?.debug("Failed request config:");
136
- logger?.debug(JSON.stringify(axiosError.config, null, 2));
137
- const url = `${axiosError.config?.baseURL}${axiosError.config?.url}`;
138
- if (globalOptions?.authorizationTokenRefresh && url) {
139
- logger?.debug(`Refreshing token for URL ${url}`);
119
+ logger == null ? void 0 : logger.debug("Failed request config:");
120
+ logger == null ? void 0 : logger.debug(JSON.stringify(axiosError.config, null, 2));
121
+ const url = `${(_a = axiosError.config) == null ? void 0 : _a.baseURL}${(_b = axiosError.config) == null ? void 0 : _b.url}`;
122
+ if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) && url) {
123
+ logger == null ? void 0 : logger.debug(`Refreshing token for URL ${url}`);
140
124
  try {
141
- await globalOptions?.authorizationTokenRefresh(url);
125
+ await (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh(url));
142
126
  } catch (error) {
143
- logger?.error(`Error refreshing token for URL: ${url}`);
127
+ logger == null ? void 0 : logger.error(`Error refreshing token for URL: ${url}`);
144
128
  throw error;
145
129
  }
146
130
  }
147
131
  };
148
- (0, import_axios_auth_refresh.default)(axiosInstance, refreshAuthLogic);
132
+ _axiosauthrefresh2.default.call(void 0, axiosInstance, refreshAuthLogic);
149
133
  }
150
134
  if (logger) {
151
135
  axiosInstance.interceptors.request.use((request) => {
@@ -168,60 +152,35 @@ var TypedClient = (baseURL, globalOptions, logger) => {
168
152
  });
169
153
  }
170
154
  const client = {
171
- get: (url, args, opts) => callServer(
172
- axiosInstance,
173
- mergeArgs(baseURL, url, "get", args, opts, globalOptions),
174
- logger
175
- ),
176
- post: (url, args, opts) => callServer(
177
- axiosInstance,
178
- mergeArgs(baseURL, url, "post", args, opts, globalOptions),
179
- logger
180
- ),
181
- put: (url, args, opts) => callServer(
182
- axiosInstance,
183
- mergeArgs(baseURL, url, "put", args, opts, globalOptions),
184
- logger
185
- ),
186
- patch: (url, args, opts) => callServer(
187
- axiosInstance,
188
- mergeArgs(baseURL, url, "patch", args, opts, globalOptions),
189
- logger
190
- ),
191
- delete: (url, args, opts) => callServer(
192
- axiosInstance,
193
- mergeArgs(baseURL, url, "delete", args, opts, globalOptions),
194
- logger
195
- )
155
+ get: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "get", args, opts, globalOptions), logger),
156
+ post: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "post", args, opts, globalOptions), logger),
157
+ put: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "put", args, opts, globalOptions), logger),
158
+ patch: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "patch", args, opts, globalOptions), logger),
159
+ delete: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "delete", args, opts, globalOptions), logger)
196
160
  };
197
- return { ...client, axiosInstance };
161
+ return __spreadProps(__spreadValues({}, client), {axiosInstance});
198
162
  };
199
163
  var callServer = async (axiosInstance, args, logger) => {
164
+ var _a, _b;
200
165
  try {
201
166
  const serializer = paramsSerializer(args.arrayFormat);
202
- logger?.debug(`[callServer] typeof serializer: ${typeof serializer}`);
203
- logger?.debug(
204
- `[callServer] sample serialization: ${serializer({ test: ["a", "b"] })}`
205
- );
206
- const body = args.method?.toLowerCase() === "get" || args.method?.toLowerCase() === "delete" ? void 0 : args.body;
207
- const { headers, data } = await (0, import_retry.retry)(
208
- () => axiosInstance.request({
209
- baseURL: args.baseUrl,
210
- url: args.url,
211
- method: args.method,
212
- headers: args.headers,
213
- params: args.params,
214
- paramsSerializer: serializer,
215
- data: body,
216
- httpsAgent: args.httpsAgent,
217
- httpAgent: args.httpAgent,
218
- timeout: args.timeout
219
- }),
220
- args.retry
221
- );
222
- return { headers, data };
167
+ logger == null ? void 0 : logger.debug(`[callServer] typeof serializer: ${typeof serializer}`);
168
+ logger == null ? void 0 : logger.debug(`[callServer] sample serialization: ${serializer({test: ["a", "b"]})}`);
169
+ const body = ((_a = args.method) == null ? void 0 : _a.toLowerCase()) === "get" || ((_b = args.method) == null ? void 0 : _b.toLowerCase()) === "delete" ? void 0 : args.body;
170
+ const {headers, data} = await _retry.retry.call(void 0, () => axiosInstance.request({
171
+ baseURL: args.baseUrl,
172
+ url: args.url,
173
+ method: args.method,
174
+ headers: args.headers,
175
+ params: args.params,
176
+ paramsSerializer: serializer,
177
+ data: body,
178
+ httpsAgent: args.httpsAgent,
179
+ httpAgent: args.httpAgent
180
+ }), args.retry);
181
+ return {headers, data};
223
182
  } catch (error) {
224
- throw (0, import_openapi_core.fromAxiosError)(error);
183
+ throw _openapicore.fromAxiosError.call(void 0, error);
225
184
  }
226
185
  };
227
186
  var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
@@ -238,23 +197,66 @@ var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
238
197
  headers,
239
198
  body,
240
199
  retry: retry2,
241
- arrayFormat: global?.arrayFormat,
242
- httpsAgent: extras?.httpsAgent,
243
- httpAgent: extras?.httpAgent,
244
- timeout: extras?.timeout ?? global?.timeout
200
+ arrayFormat: global == null ? void 0 : global.arrayFormat,
201
+ httpsAgent: extras == null ? void 0 : extras.httpsAgent,
202
+ httpAgent: extras == null ? void 0 : extras.httpAgent
245
203
  };
246
204
  return merged;
247
205
  };
248
- var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => a?.[prop] || {}));
249
- var setParams = (url, params = {}) => Object.entries(params).reduce(
250
- (url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`),
251
- url
252
- );
206
+ var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => (a == null ? void 0 : a[prop]) || {}));
207
+ var setParams = (url, params = {}) => Object.entries(params).reduce((url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`), url);
253
208
 
254
209
  // src/index.ts
255
- __reExport(index_exports, require("@sebspark/retry"), module.exports);
256
- // Annotate the CommonJS export names for ESM import in node:
257
- 0 && (module.exports = {
258
- TypedClient,
259
- ...require("@sebspark/retry")
260
- });
210
+
211
+
212
+ // src/graphql/client.ts
213
+
214
+
215
+
216
+ var _openapiauthiam = require('@sebspark/openapi-auth-iam');
217
+ var GatewayGraphqlClient = class {
218
+ constructor(args) {
219
+ this.uri = args.uri;
220
+ this.logger = args.logger;
221
+ this.options = {
222
+ timeout: 10 * 1e3,
223
+ authorizationTokenGenerator: async (url) => {
224
+ this.logger.debug(`Generating token for: ${this.uri}`);
225
+ return _openapiauthiam.apiGatewayTokenByUrlGenerator.call(void 0, args.apiKey)(url);
226
+ },
227
+ authorizationTokenRefresh: async (url) => {
228
+ this.logger.debug(`Refreshing token for: ${this.uri}`);
229
+ return _openapiauthiam.apiGatewayTokenRefresh.call(void 0, )(url);
230
+ }
231
+ };
232
+ this.client = TypedClient(args.uri, this.options, this.logger);
233
+ }
234
+ async graphql(query, variables) {
235
+ try {
236
+ const response = await this.client.post("/graphql", {
237
+ body: {query: query.trim(), variables}
238
+ });
239
+ if (response.data.errors) {
240
+ this.logger.error(`Error posting graphql query to: ${this.uri}`);
241
+ throw new Error(response.data.errors.map((e) => e.message).join("\n"));
242
+ }
243
+ return response.data.data;
244
+ } catch (error) {
245
+ this.logger.error(`Error posting graphql: ${this.uri}`);
246
+ throw error;
247
+ }
248
+ }
249
+ async isHealthy() {
250
+ try {
251
+ await this.client.get("/health");
252
+ return true;
253
+ } catch (error) {
254
+ this.logger.error(error);
255
+ }
256
+ return false;
257
+ }
258
+ };
259
+
260
+
261
+
262
+ exports.GatewayGraphqlClient = GatewayGraphqlClient; exports.TypedClient = TypedClient;
package/dist/index.mjs CHANGED
@@ -1,14 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
1
21
  // src/client.ts
2
- import {
3
- fromAxiosError
4
- } from "@sebspark/openapi-core";
5
- import { retry } from "@sebspark/retry";
22
+ import {fromAxiosError} from "@sebspark/openapi-core";
23
+ import {retry} from "@sebspark/retry";
6
24
  import axios from "axios";
7
25
  import createAuthRefreshInterceptor from "axios-auth-refresh";
8
26
 
9
27
  // src/paramsSerializer.ts
10
28
  var encodeParam = (param) => encodeURIComponent(param);
11
29
  var encodeValue = (param, encodeCommas = false) => {
30
+ if (param instanceof Date) {
31
+ return encodeURIComponent(param.toISOString());
32
+ }
12
33
  if (typeof param === "number" || typeof param === "string" || typeof param === "boolean") {
13
34
  if (encodeCommas) {
14
35
  return encodeURIComponent(param);
@@ -59,53 +80,51 @@ var paramsSerializer = (format) => (params) => {
59
80
  // src/client.ts
60
81
  var TypedClient = (baseURL, globalOptions, logger) => {
61
82
  const axiosInstance = axios.create();
62
- logger?.debug(
63
- "client initialized with arrayFormat",
64
- globalOptions?.arrayFormat
65
- );
66
- if (globalOptions?.authorizationTokenGenerator) {
67
- logger?.debug("authorizationTokenGenerator is set");
83
+ logger == null ? void 0 : logger.debug("client initialized with arrayFormat", globalOptions == null ? void 0 : globalOptions.arrayFormat);
84
+ if (globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) {
85
+ logger == null ? void 0 : logger.debug("authorizationTokenGenerator is set");
68
86
  axiosInstance.interceptors.request.use(async (request) => {
69
87
  const url = `${request.baseURL}${request.url}`;
70
- logger?.debug(`Intercepting request to ${url}`);
71
- if (globalOptions?.authorizationTokenGenerator && url) {
88
+ logger == null ? void 0 : logger.debug(`Intercepting request to ${url}`);
89
+ if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) && url) {
72
90
  try {
73
91
  const authorizationTokenHeaders = await globalOptions.authorizationTokenGenerator(url);
74
92
  if (authorizationTokenHeaders) {
75
93
  for (const key of Object.keys(authorizationTokenHeaders)) {
76
94
  const value = authorizationTokenHeaders[key];
77
- logger?.debug(`Setting header ${key} to ${value}`);
95
+ logger == null ? void 0 : logger.debug(`Setting header ${key} to ${value}`);
78
96
  request.headers[key] = value;
79
97
  }
80
98
  }
81
99
  } catch (error) {
82
- logger?.error(`Error generating token for URL: ${url}`);
100
+ logger == null ? void 0 : logger.error(`Error generating token for URL: ${url}`);
83
101
  throw error;
84
102
  }
85
103
  }
86
- logger?.debug("Intercepted request:");
87
- logger?.debug(JSON.stringify(request, null, 2));
104
+ logger == null ? void 0 : logger.debug("Intercepted request:");
105
+ logger == null ? void 0 : logger.debug(JSON.stringify(request, null, 2));
88
106
  return request;
89
107
  });
90
108
  }
91
- if (globalOptions?.authorizationTokenRefresh) {
109
+ if (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) {
92
110
  const refreshAuthLogic = async (failedRequest) => {
93
- logger?.debug("Failed request");
94
- logger?.debug(JSON.stringify(failedRequest, null, 2));
111
+ var _a, _b;
112
+ logger == null ? void 0 : logger.debug("Failed request");
113
+ logger == null ? void 0 : logger.debug(JSON.stringify(failedRequest, null, 2));
95
114
  if (!axios.isAxiosError(failedRequest)) {
96
- logger?.error("Failed request is not an axios error");
115
+ logger == null ? void 0 : logger.error("Failed request is not an axios error");
97
116
  return;
98
117
  }
99
118
  const axiosError = failedRequest;
100
- logger?.debug("Failed request config:");
101
- logger?.debug(JSON.stringify(axiosError.config, null, 2));
102
- const url = `${axiosError.config?.baseURL}${axiosError.config?.url}`;
103
- if (globalOptions?.authorizationTokenRefresh && url) {
104
- logger?.debug(`Refreshing token for URL ${url}`);
119
+ logger == null ? void 0 : logger.debug("Failed request config:");
120
+ logger == null ? void 0 : logger.debug(JSON.stringify(axiosError.config, null, 2));
121
+ const url = `${(_a = axiosError.config) == null ? void 0 : _a.baseURL}${(_b = axiosError.config) == null ? void 0 : _b.url}`;
122
+ if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) && url) {
123
+ logger == null ? void 0 : logger.debug(`Refreshing token for URL ${url}`);
105
124
  try {
106
- await globalOptions?.authorizationTokenRefresh(url);
125
+ await (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh(url));
107
126
  } catch (error) {
108
- logger?.error(`Error refreshing token for URL: ${url}`);
127
+ logger == null ? void 0 : logger.error(`Error refreshing token for URL: ${url}`);
109
128
  throw error;
110
129
  }
111
130
  }
@@ -133,58 +152,33 @@ var TypedClient = (baseURL, globalOptions, logger) => {
133
152
  });
134
153
  }
135
154
  const client = {
136
- get: (url, args, opts) => callServer(
137
- axiosInstance,
138
- mergeArgs(baseURL, url, "get", args, opts, globalOptions),
139
- logger
140
- ),
141
- post: (url, args, opts) => callServer(
142
- axiosInstance,
143
- mergeArgs(baseURL, url, "post", args, opts, globalOptions),
144
- logger
145
- ),
146
- put: (url, args, opts) => callServer(
147
- axiosInstance,
148
- mergeArgs(baseURL, url, "put", args, opts, globalOptions),
149
- logger
150
- ),
151
- patch: (url, args, opts) => callServer(
152
- axiosInstance,
153
- mergeArgs(baseURL, url, "patch", args, opts, globalOptions),
154
- logger
155
- ),
156
- delete: (url, args, opts) => callServer(
157
- axiosInstance,
158
- mergeArgs(baseURL, url, "delete", args, opts, globalOptions),
159
- logger
160
- )
155
+ get: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "get", args, opts, globalOptions), logger),
156
+ post: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "post", args, opts, globalOptions), logger),
157
+ put: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "put", args, opts, globalOptions), logger),
158
+ patch: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "patch", args, opts, globalOptions), logger),
159
+ delete: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "delete", args, opts, globalOptions), logger)
161
160
  };
162
- return { ...client, axiosInstance };
161
+ return __spreadProps(__spreadValues({}, client), {axiosInstance});
163
162
  };
164
163
  var callServer = async (axiosInstance, args, logger) => {
164
+ var _a, _b;
165
165
  try {
166
166
  const serializer = paramsSerializer(args.arrayFormat);
167
- logger?.debug(`[callServer] typeof serializer: ${typeof serializer}`);
168
- logger?.debug(
169
- `[callServer] sample serialization: ${serializer({ test: ["a", "b"] })}`
170
- );
171
- const body = args.method?.toLowerCase() === "get" || args.method?.toLowerCase() === "delete" ? void 0 : args.body;
172
- const { headers, data } = await retry(
173
- () => axiosInstance.request({
174
- baseURL: args.baseUrl,
175
- url: args.url,
176
- method: args.method,
177
- headers: args.headers,
178
- params: args.params,
179
- paramsSerializer: serializer,
180
- data: body,
181
- httpsAgent: args.httpsAgent,
182
- httpAgent: args.httpAgent,
183
- timeout: args.timeout
184
- }),
185
- args.retry
186
- );
187
- return { headers, data };
167
+ logger == null ? void 0 : logger.debug(`[callServer] typeof serializer: ${typeof serializer}`);
168
+ logger == null ? void 0 : logger.debug(`[callServer] sample serialization: ${serializer({test: ["a", "b"]})}`);
169
+ const body = ((_a = args.method) == null ? void 0 : _a.toLowerCase()) === "get" || ((_b = args.method) == null ? void 0 : _b.toLowerCase()) === "delete" ? void 0 : args.body;
170
+ const {headers, data} = await retry(() => axiosInstance.request({
171
+ baseURL: args.baseUrl,
172
+ url: args.url,
173
+ method: args.method,
174
+ headers: args.headers,
175
+ params: args.params,
176
+ paramsSerializer: serializer,
177
+ data: body,
178
+ httpsAgent: args.httpsAgent,
179
+ httpAgent: args.httpAgent
180
+ }), args.retry);
181
+ return {headers, data};
188
182
  } catch (error) {
189
183
  throw fromAxiosError(error);
190
184
  }
@@ -203,21 +197,66 @@ var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
203
197
  headers,
204
198
  body,
205
199
  retry: retry2,
206
- arrayFormat: global?.arrayFormat,
207
- httpsAgent: extras?.httpsAgent,
208
- httpAgent: extras?.httpAgent,
209
- timeout: extras?.timeout ?? global?.timeout
200
+ arrayFormat: global == null ? void 0 : global.arrayFormat,
201
+ httpsAgent: extras == null ? void 0 : extras.httpsAgent,
202
+ httpAgent: extras == null ? void 0 : extras.httpAgent
210
203
  };
211
204
  return merged;
212
205
  };
213
- var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => a?.[prop] || {}));
214
- var setParams = (url, params = {}) => Object.entries(params).reduce(
215
- (url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`),
216
- url
217
- );
206
+ var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => (a == null ? void 0 : a[prop]) || {}));
207
+ var setParams = (url, params = {}) => Object.entries(params).reduce((url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`), url);
218
208
 
219
209
  // src/index.ts
220
210
  export * from "@sebspark/retry";
211
+
212
+ // src/graphql/client.ts
213
+ import {
214
+ apiGatewayTokenByUrlGenerator,
215
+ apiGatewayTokenRefresh
216
+ } from "@sebspark/openapi-auth-iam";
217
+ var GatewayGraphqlClient = class {
218
+ constructor(args) {
219
+ this.uri = args.uri;
220
+ this.logger = args.logger;
221
+ this.options = {
222
+ timeout: 10 * 1e3,
223
+ authorizationTokenGenerator: async (url) => {
224
+ this.logger.debug(`Generating token for: ${this.uri}`);
225
+ return apiGatewayTokenByUrlGenerator(args.apiKey)(url);
226
+ },
227
+ authorizationTokenRefresh: async (url) => {
228
+ this.logger.debug(`Refreshing token for: ${this.uri}`);
229
+ return apiGatewayTokenRefresh()(url);
230
+ }
231
+ };
232
+ this.client = TypedClient(args.uri, this.options, this.logger);
233
+ }
234
+ async graphql(query, variables) {
235
+ try {
236
+ const response = await this.client.post("/graphql", {
237
+ body: {query: query.trim(), variables}
238
+ });
239
+ if (response.data.errors) {
240
+ this.logger.error(`Error posting graphql query to: ${this.uri}`);
241
+ throw new Error(response.data.errors.map((e) => e.message).join("\n"));
242
+ }
243
+ return response.data.data;
244
+ } catch (error) {
245
+ this.logger.error(`Error posting graphql: ${this.uri}`);
246
+ throw error;
247
+ }
248
+ }
249
+ async isHealthy() {
250
+ try {
251
+ await this.client.get("/health");
252
+ return true;
253
+ } catch (error) {
254
+ this.logger.error(error);
255
+ }
256
+ return false;
257
+ }
258
+ };
221
259
  export {
260
+ GatewayGraphqlClient,
222
261
  TypedClient
223
262
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sebspark/openapi-client",
3
- "version": "2.2.3",
3
+ "version": "2.4.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -19,14 +19,16 @@
19
19
  },
20
20
  "devDependencies": {
21
21
  "@sebspark/openapi-typegen": "*",
22
- "nock": "14.0.4",
22
+ "nock": "14.0.5",
23
23
  "tsconfig": "*",
24
- "vitest": "3.1.2"
24
+ "tsup-node": "^0.1.0",
25
+ "vitest": "3.2.4"
25
26
  },
26
27
  "dependencies": {
28
+ "@sebspark/openapi-auth-iam": "*",
27
29
  "@sebspark/openapi-core": "*",
28
30
  "@sebspark/retry": "*",
29
- "axios": "1.9.0",
31
+ "axios": "1.10.0",
30
32
  "axios-auth-refresh": "3.3.6"
31
33
  }
32
34
  }
package/dist/index.d.mts DELETED
@@ -1,11 +0,0 @@
1
- import { BaseClient, ClientOptions } from '@sebspark/openapi-core';
2
- import { AxiosInstance } from 'axios';
3
- import { Logger } from 'winston';
4
- export * from '@sebspark/retry';
5
-
6
- type TypedAxiosClient<T> = T & {
7
- axiosInstance: AxiosInstance;
8
- };
9
- declare const TypedClient: <C extends Partial<BaseClient>>(baseURL: string, globalOptions?: ClientOptions, logger?: Logger) => TypedAxiosClient<C>;
10
-
11
- export { type TypedAxiosClient, TypedClient };