@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 +53 -2
- package/dist/index.js +129 -127
- package/dist/index.mjs +122 -83
- package/package.json +6 -4
- package/dist/index.d.mts +0 -11
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
|
-
|
|
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
|
|
3
|
-
var
|
|
4
|
-
var
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
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
|
|
40
|
-
var
|
|
41
|
-
var
|
|
42
|
-
var
|
|
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 =
|
|
97
|
-
logger
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
106
|
-
if (globalOptions
|
|
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
|
|
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
|
|
100
|
+
logger == null ? void 0 : logger.error(`Error generating token for URL: ${url}`);
|
|
118
101
|
throw error;
|
|
119
102
|
}
|
|
120
103
|
}
|
|
121
|
-
logger
|
|
122
|
-
logger
|
|
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
|
|
109
|
+
if (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) {
|
|
127
110
|
const refreshAuthLogic = async (failedRequest) => {
|
|
128
|
-
|
|
129
|
-
logger
|
|
130
|
-
|
|
131
|
-
|
|
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
|
|
136
|
-
logger
|
|
137
|
-
const url = `${axiosError.config
|
|
138
|
-
if (globalOptions
|
|
139
|
-
logger
|
|
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
|
|
125
|
+
await (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh(url));
|
|
142
126
|
} catch (error) {
|
|
143
|
-
logger
|
|
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,
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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 {
|
|
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
|
|
203
|
-
logger
|
|
204
|
-
|
|
205
|
-
)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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,
|
|
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
|
|
242
|
-
httpsAgent: extras
|
|
243
|
-
httpAgent: extras
|
|
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
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
71
|
-
if (globalOptions
|
|
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
|
|
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
|
|
100
|
+
logger == null ? void 0 : logger.error(`Error generating token for URL: ${url}`);
|
|
83
101
|
throw error;
|
|
84
102
|
}
|
|
85
103
|
}
|
|
86
|
-
logger
|
|
87
|
-
logger
|
|
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
|
|
109
|
+
if (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) {
|
|
92
110
|
const refreshAuthLogic = async (failedRequest) => {
|
|
93
|
-
|
|
94
|
-
logger
|
|
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
|
|
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
|
|
101
|
-
logger
|
|
102
|
-
const url = `${axiosError.config
|
|
103
|
-
if (globalOptions
|
|
104
|
-
logger
|
|
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
|
|
125
|
+
await (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh(url));
|
|
107
126
|
} catch (error) {
|
|
108
|
-
logger
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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 {
|
|
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
|
|
168
|
-
logger
|
|
169
|
-
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
207
|
-
httpsAgent: extras
|
|
208
|
-
httpAgent: extras
|
|
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
|
|
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.
|
|
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.
|
|
22
|
+
"nock": "14.0.5",
|
|
23
23
|
"tsconfig": "*",
|
|
24
|
-
"
|
|
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.
|
|
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 };
|