@sebspark/openapi-client 4.0.5 → 4.0.7

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.
@@ -0,0 +1,65 @@
1
+ import { APIResponse, BaseClient, ClientOptions, RequestOptions } from "@sebspark/openapi-core";
2
+ import { getLogger } from "@sebspark/otel";
3
+ import { AxiosInstance } from "axios";
4
+ export * from "@sebspark/retry";
5
+
6
+ //#region src/client.d.ts
7
+ type TypedAxiosClient<T> = T & {
8
+ axiosInstance: AxiosInstance;
9
+ };
10
+ declare const TypedClient: <C extends Partial<BaseClient>>(baseURL: string, globalOptions?: ClientOptions) => TypedAxiosClient<C>;
11
+ //#endregion
12
+ //#region src/graphql/types.d.ts
13
+ type GatewayGraphqlClient$1 = Pick<BaseClient, 'post' | 'get'> & {
14
+ post: {
15
+ /**
16
+ *
17
+ * @param {string} url
18
+ * @param {Object} [args] - Optional. The arguments for the request.
19
+ * @param {Object} [args.body] - Optional. Request body for the request.
20
+ * @param {string} [args.body.query] - Optional.
21
+ * @param {object} [args.body.variables] - Optional.
22
+ * @param {RequestOptions} [opts] - Optional.
23
+ * @returns {Promise<APIResponse<{
24
+ }>>}
25
+ */
26
+ (url: '/graphql', args?: {
27
+ body?: {
28
+ query?: string;
29
+ variables?: Record<string, unknown>;
30
+ };
31
+ }, opts?: RequestOptions): Promise<APIResponse<{
32
+ data: Record<string, any>;
33
+ errors?: ({
34
+ message: string;
35
+ } & Record<string, any>)[];
36
+ }>>;
37
+ };
38
+ get: {
39
+ /**
40
+ *
41
+ * @param {string} url
42
+ * @param {RequestOptions} [opts] - Optional.
43
+ * @returns {Promise<undefined>}
44
+ */
45
+ (url: '/health', opts?: RequestOptions): Promise<undefined>;
46
+ };
47
+ };
48
+ type GatewayGraphqlClientArgs = {
49
+ uri: string;
50
+ apiKey: string;
51
+ };
52
+ //#endregion
53
+ //#region src/graphql/client.d.ts
54
+ declare class GatewayGraphqlClient<T extends GatewayGraphqlClient$1 = GatewayGraphqlClient$1> {
55
+ client: T;
56
+ logger: ReturnType<typeof getLogger>;
57
+ private uri;
58
+ private options;
59
+ constructor(args: GatewayGraphqlClientArgs);
60
+ graphql<K>(query: string, variables?: Record<string, unknown>): Promise<K>;
61
+ isHealthy(): Promise<boolean>;
62
+ }
63
+ //#endregion
64
+ export { GatewayGraphqlClient, TypedAxiosClient, TypedClient };
65
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/client.ts","../src/graphql/types.ts","../src/graphql/client.ts"],"sourcesContent":[],"mappings":";;;;;;KAuBY,sBAAsB;iBACjB;;cAGJ,wBAAyB,QAAQ,8CAE5B,kBACf,iBAAiB;;;KCxBR,sBAAA,GAAuB,KAAK;;;;;;ADiBxC;AAIA;;;;;;IAGmB,CAAA,GAAA,EAAA,UAAA,EAAA,ICxBqB,CDwBrB,EAAA;;;oBCNG;MAlBV,CAAA;IAA4B,CAAA,EAAA,IAAA,CAAA,EAqB3B,cArB2B,CAAA,EAsBjC,OAtBiC,CAuBlC,WAvBkC,CAAA;MAAL,IAAA,EAyBrB,MAzBqB,CAAA,MAAA,EAAA,GAAA,CAAA;MAkBb,MAAA,CAAA,EAAA,CAAA;QAGT,OAAA,EAAA,MAAA;MAIC,CAAA,GAE0B,MAF1B,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA;IAE0B,CAAA,CAAA,CAAA;EAJlC,CAAA;EADC,GAAA,EAAA;IAgBqB;;;AAI5B;;;4BAJ4B,iBAAiB;EChChC,CAAA;CACD;AAA2B,KDmC3B,wBAAA,GCnC2B;EAEtB,GAAA,EAAA,MAAA;EACkB,MAAA,EAAA,MAAA;CAAlB;;;cAJJ,+BACD,yBAA2B;UAEtB;UACA,kBAAkB;;;EFOvB,WAAA,CAAA,IAAA,EEHQ,wBFIH;EAGJ,OAAA,CAAA,CAAA,CAAA,CAAA,KAwIZ,EAAA,MAAA,EAAA,SAAA,CAAA,EE9HoD,MF8HpD,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EE9H2E,OF8H3E,CE9H2E,CF8H3E,CAAA;EAxI6C,SAAA,CAAA,CAAA,EE4BtB,OF5BsB,CAAA,OAAA,CAAA"}
package/dist/index.mjs ADDED
@@ -0,0 +1,227 @@
1
+ import { retry } from "@sebspark/retry";
2
+ import { fromAxiosError } from "@sebspark/openapi-core";
3
+ import { getLogger } from "@sebspark/otel";
4
+ import axios from "axios";
5
+ import createAuthRefreshInterceptor from "axios-auth-refresh";
6
+ import { apiGatewayTokenByUrlGenerator, apiGatewayTokenRefresh } from "@sebspark/openapi-auth-iam";
7
+
8
+ export * from "@sebspark/retry"
9
+
10
+ //#region src/paramsSerializer.ts
11
+ const encodeParam = (param) => encodeURIComponent(param);
12
+ const encodeValue = (param, encodeCommas = false) => {
13
+ if (param instanceof Date) return encodeURIComponent(param.toISOString());
14
+ if (typeof param === "number" || typeof param === "string" || typeof param === "boolean") {
15
+ if (encodeCommas) return encodeURIComponent(param);
16
+ return param.toString().split(",").map((p) => encodeURIComponent(p)).join(",");
17
+ }
18
+ return "";
19
+ };
20
+ const paramsSerializer = (format) => (params) => {
21
+ if (!params) return "";
22
+ const s = [];
23
+ for (const [key, value] of Object.entries(params)) {
24
+ if (value === void 0) continue;
25
+ if (Array.isArray(value)) {
26
+ const title = encodeParam(key);
27
+ if (format === "comma") {
28
+ s.push(`${title}=${value.map((v) => encodeValue(v, true)).join(",")}`);
29
+ continue;
30
+ }
31
+ value.forEach((v, ix) => {
32
+ const value$1 = encodeValue(v);
33
+ switch (format) {
34
+ case "indices":
35
+ s.push(`${title}[${ix}]=${value$1}`);
36
+ break;
37
+ case "repeat":
38
+ s.push(`${title}=${value$1}`);
39
+ break;
40
+ default:
41
+ s.push(`${title}[]=${value$1}`);
42
+ break;
43
+ }
44
+ });
45
+ } else s.push(`${encodeParam(key)}=${encodeValue(value)}`);
46
+ }
47
+ return s.join("&");
48
+ };
49
+
50
+ //#endregion
51
+ //#region src/client.ts
52
+ const createAuthRefreshInterceptorFunc = createAuthRefreshInterceptor?.default ?? createAuthRefreshInterceptor;
53
+ const TypedClient = (baseURL, globalOptions) => {
54
+ const axiosInstance = axios.create();
55
+ const logger = getLogger("TypedClient");
56
+ logger.debug(`client initialized with arrayFormat '${globalOptions?.arrayFormat}'`);
57
+ if (globalOptions?.authorizationTokenGenerator) {
58
+ logger.debug("authorizationTokenGenerator is set");
59
+ axiosInstance.interceptors.request.use(async (request) => {
60
+ const url = `${request.baseURL}${request.url}`;
61
+ logger.debug(`Intercepting request to ${url}`);
62
+ if (globalOptions?.authorizationTokenGenerator && url) try {
63
+ const authorizationTokenHeaders = await globalOptions.authorizationTokenGenerator(url);
64
+ if (authorizationTokenHeaders) for (const key of Object.keys(authorizationTokenHeaders)) {
65
+ const value = authorizationTokenHeaders[key];
66
+ logger.debug(`Setting header ${key} to ${value}`);
67
+ request.headers[key] = value;
68
+ }
69
+ } catch (error) {
70
+ logger.error(`Error generating token for URL: ${url}`, error);
71
+ throw error;
72
+ }
73
+ logger.debug("Intercepted request:");
74
+ logger.debug(JSON.stringify(request, null, 2));
75
+ return request;
76
+ });
77
+ }
78
+ if (globalOptions?.authorizationTokenRefresh) {
79
+ const refreshAuthLogic = async (failedRequest) => {
80
+ if (!axios.isAxiosError(failedRequest)) {
81
+ logger.error("Failed request is not an axios error", failedRequest);
82
+ throw failedRequest;
83
+ } else logger.debug("Failed request", failedRequest);
84
+ const axiosError = failedRequest;
85
+ logger.debug("Failed request config", axiosError.config);
86
+ const url = `${axiosError.config?.baseURL}${axiosError.config?.url}`;
87
+ if (globalOptions?.authorizationTokenRefresh && url) {
88
+ logger.debug(`Refreshing token for URL ${url}`);
89
+ try {
90
+ await globalOptions?.authorizationTokenRefresh(url);
91
+ } catch (error) {
92
+ logger.error(`Error refreshing token for URL: ${url}`, error);
93
+ throw error;
94
+ }
95
+ }
96
+ return axiosError.response;
97
+ };
98
+ createAuthRefreshInterceptorFunc(axiosInstance, refreshAuthLogic);
99
+ }
100
+ if (logger) {
101
+ axiosInstance.interceptors.request.use((request) => {
102
+ const requestObject = {
103
+ url: request.url,
104
+ params: request.params,
105
+ headers: request.headers
106
+ };
107
+ logger.debug("request", requestObject);
108
+ return request;
109
+ });
110
+ axiosInstance.interceptors.response.use((response) => {
111
+ const responseObject = {
112
+ data: response.data,
113
+ config: response.config,
114
+ headers: response.headers
115
+ };
116
+ logger.debug("response", responseObject);
117
+ return response;
118
+ });
119
+ }
120
+ return {
121
+ get: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "get", args, opts, globalOptions), logger),
122
+ post: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "post", args, opts, globalOptions), logger),
123
+ put: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "put", args, opts, globalOptions), logger),
124
+ patch: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "patch", args, opts, globalOptions), logger),
125
+ delete: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "delete", args, opts, globalOptions), logger),
126
+ axiosInstance
127
+ };
128
+ };
129
+ const callServer = async (axiosInstance, args, logger) => {
130
+ try {
131
+ const serializer = paramsSerializer(args.arrayFormat);
132
+ logger.debug(`[callServer] typeof serializer: ${typeof serializer}`);
133
+ const body = args.method?.toLowerCase() === "get" || args.method?.toLowerCase() === "delete" ? void 0 : args.body;
134
+ const { headers, data } = await retry(() => axiosInstance.request({
135
+ baseURL: args.baseUrl,
136
+ url: args.url,
137
+ method: args.method,
138
+ headers: args.headers,
139
+ params: args.params,
140
+ paramsSerializer: serializer,
141
+ data: body,
142
+ httpsAgent: args.httpsAgent,
143
+ httpAgent: args.httpAgent
144
+ }), args.retry);
145
+ return {
146
+ headers,
147
+ data
148
+ };
149
+ } catch (error) {
150
+ throw fromAxiosError(error);
151
+ }
152
+ };
153
+ const mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
154
+ const params = merge("params", global, requestArgs, extras);
155
+ const query = merge("query", global, requestArgs, extras);
156
+ const headers = merge("headers", global, requestArgs, extras);
157
+ const body = merge("body", global, requestArgs, extras);
158
+ const retry$1 = merge("retry", global, requestArgs, extras);
159
+ return {
160
+ url: setParams(url, params),
161
+ baseUrl,
162
+ method,
163
+ params: query,
164
+ headers,
165
+ body,
166
+ retry: retry$1,
167
+ arrayFormat: global?.arrayFormat,
168
+ httpsAgent: extras?.httpsAgent,
169
+ httpAgent: extras?.httpAgent
170
+ };
171
+ };
172
+ const merge = (prop, ...args) => Object.assign({}, ...args.map((a) => a?.[prop] || {}));
173
+ const setParams = (url, params = {}) => Object.entries(params).reduce((url$1, [key, val]) => url$1.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`), url);
174
+
175
+ //#endregion
176
+ //#region src/graphql/client.ts
177
+ var GatewayGraphqlClient = class {
178
+ client;
179
+ logger;
180
+ uri;
181
+ options;
182
+ constructor(args) {
183
+ this.uri = args.uri;
184
+ this.logger = getLogger("GatewayGraphqlClient");
185
+ this.options = {
186
+ timeout: 10 * 1e3,
187
+ authorizationTokenGenerator: async (url) => {
188
+ this.logger.debug(`Generating token for: ${this.uri}`);
189
+ return apiGatewayTokenByUrlGenerator(args.apiKey)(url);
190
+ },
191
+ authorizationTokenRefresh: async (url) => {
192
+ this.logger.debug(`Refreshing token for: ${this.uri}`);
193
+ return apiGatewayTokenRefresh()(url);
194
+ }
195
+ };
196
+ this.client = TypedClient(args.uri, this.options);
197
+ }
198
+ async graphql(query, variables) {
199
+ try {
200
+ const response = await this.client.post("/graphql", { body: {
201
+ query: query.trim(),
202
+ variables
203
+ } });
204
+ if (response.data.errors) {
205
+ this.logger.error(`Error posting graphql query to: ${this.uri}`);
206
+ throw new Error(response.data.errors.map((e) => e.message).join("\n"));
207
+ }
208
+ return response.data.data;
209
+ } catch (error) {
210
+ this.logger.error(`Error posting graphql: ${this.uri}`);
211
+ throw error;
212
+ }
213
+ }
214
+ async isHealthy() {
215
+ try {
216
+ await this.client.get("/health");
217
+ return true;
218
+ } catch (error) {
219
+ this.logger.error(error);
220
+ }
221
+ return false;
222
+ }
223
+ };
224
+
225
+ //#endregion
226
+ export { GatewayGraphqlClient, TypedClient };
227
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["value","retry","url"],"sources":["../src/paramsSerializer.ts","../src/client.ts","../src/graphql/client.ts"],"sourcesContent":["import type { ArrayFormat } from '@sebspark/openapi-core'\n\ntype Param = boolean | string | number | Date | undefined | Array<Param>\ntype Params = Record<string, Param>\n\nconst encodeParam = (param: string) => encodeURIComponent(param)\nconst encodeValue = (param: Param, encodeCommas = false) => {\n if (param instanceof Date) {\n return encodeURIComponent(param.toISOString())\n }\n if (\n typeof param === 'number' ||\n typeof param === 'string' ||\n typeof param === 'boolean'\n ) {\n if (encodeCommas) {\n return encodeURIComponent(param)\n }\n\n return param\n .toString()\n .split(',')\n .map((p) => encodeURIComponent(p))\n .join(',')\n }\n\n return ''\n}\n\nexport const paramsSerializer = (format?: ArrayFormat) => (params?: Params) => {\n if (!params) {\n return ''\n }\n\n const s = []\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) {\n continue\n }\n\n if (Array.isArray(value)) {\n const title = encodeParam(key)\n\n if (format === 'comma') {\n s.push(`${title}=${value.map((v) => encodeValue(v, true)).join(',')}`)\n continue\n }\n\n value.forEach((v, ix) => {\n const value = encodeValue(v)\n\n switch (format) {\n case 'indices': {\n s.push(`${title}[${ix}]=${value}`)\n break\n }\n case 'repeat': {\n s.push(`${title}=${value}`)\n break\n }\n default: {\n s.push(`${title}[]=${value}`)\n break\n }\n }\n })\n } else {\n s.push(`${encodeParam(key)}=${encodeValue(value)}`)\n }\n }\n\n return s.join('&')\n}\n","import type {\n APIResponse,\n BaseClient,\n ClientOptions,\n RequestArgs,\n RequestOptions,\n} from '@sebspark/openapi-core'\nimport { fromAxiosError } from '@sebspark/openapi-core'\nimport { getLogger } from '@sebspark/otel'\nimport { retry } from '@sebspark/retry'\nimport type {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n} from 'axios'\nimport axios from 'axios'\nimport createAuthRefreshInterceptor from 'axios-auth-refresh'\nimport { paramsSerializer } from './paramsSerializer'\n\nconst createAuthRefreshInterceptorFunc =\n (createAuthRefreshInterceptor as any)?.default ?? createAuthRefreshInterceptor\n\nexport type TypedAxiosClient<T> = T & {\n axiosInstance: AxiosInstance\n}\n\nexport const TypedClient = <C extends Partial<BaseClient>>(\n baseURL: string,\n globalOptions?: ClientOptions\n): TypedAxiosClient<C> => {\n const axiosInstance = axios.create()\n\n const logger = getLogger('TypedClient')\n\n logger.debug(\n `client initialized with arrayFormat '${globalOptions?.arrayFormat}'`\n )\n\n if (globalOptions?.authorizationTokenGenerator) {\n logger.debug('authorizationTokenGenerator is set')\n\n axiosInstance.interceptors.request.use(async (request) => {\n const url = `${request.baseURL}${request.url}`\n logger.debug(`Intercepting request to ${url}`)\n\n if (globalOptions?.authorizationTokenGenerator && url) {\n try {\n const authorizationTokenHeaders =\n await globalOptions.authorizationTokenGenerator(url)\n\n if (authorizationTokenHeaders) {\n for (const key of Object.keys(authorizationTokenHeaders)) {\n const value = authorizationTokenHeaders[key]\n logger.debug(`Setting header ${key} to ${value}`)\n request.headers[key] = value\n }\n }\n } catch (error) {\n logger.error(`Error generating token for URL: ${url}`, error as Error)\n throw error\n }\n }\n\n logger.debug('Intercepted request:')\n logger.debug(JSON.stringify(request, null, 2))\n return request\n })\n }\n\n if (globalOptions?.authorizationTokenRefresh) {\n const refreshAuthLogic = async (\n // biome-ignore lint/suspicious/noExplicitAny: Defined by dependency\n failedRequest: any\n ): Promise<AxiosResponse> => {\n if (!axios.isAxiosError(failedRequest)) {\n logger.error(\n 'Failed request is not an axios error',\n failedRequest as Error\n )\n throw failedRequest\n } else {\n logger.debug('Failed request', failedRequest)\n }\n\n const axiosError = failedRequest as AxiosError\n\n logger.debug('Failed request config', axiosError.config)\n\n const url = `${axiosError.config?.baseURL}${axiosError.config?.url}`\n if (globalOptions?.authorizationTokenRefresh && url) {\n logger.debug(`Refreshing token for URL ${url}`)\n try {\n await globalOptions?.authorizationTokenRefresh(url)\n } catch (error) {\n logger.error(`Error refreshing token for URL: ${url}`, error as Error)\n throw error\n }\n }\n\n return axiosError.response as AxiosResponse\n }\n\n createAuthRefreshInterceptorFunc(axiosInstance, refreshAuthLogic)\n }\n\n if (logger) {\n axiosInstance.interceptors.request.use((request) => {\n const requestObject = {\n url: request.url,\n params: request.params,\n headers: request.headers,\n }\n logger.debug('request', requestObject)\n return request\n })\n\n axiosInstance.interceptors.response.use((response) => {\n const responseObject = {\n data: response.data,\n config: response.config,\n headers: response.headers,\n }\n\n logger.debug('response', responseObject)\n return response\n })\n }\n\n const client: BaseClient = {\n get: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'get', args, opts, globalOptions),\n logger\n ),\n post: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'post', args, opts, globalOptions),\n logger\n ),\n put: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'put', args, opts, globalOptions),\n logger\n ),\n patch: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'patch', args, opts, globalOptions),\n logger\n ),\n delete: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'delete', args, opts, globalOptions),\n logger\n ),\n }\n\n return { ...client, axiosInstance } as TypedAxiosClient<C>\n}\n\nconst callServer = async <\n R extends APIResponse<\n unknown | undefined,\n Record<string, string> | undefined\n >,\n>(\n axiosInstance: AxiosInstance,\n args: Partial<ClientOptions & RequestArgs>,\n logger: ReturnType<typeof getLogger>\n): Promise<R> => {\n try {\n const serializer = paramsSerializer((args as ClientOptions).arrayFormat)\n\n logger.debug(`[callServer] typeof serializer: ${typeof serializer}`)\n\n const body =\n args.method?.toLowerCase() === 'get' ||\n args.method?.toLowerCase() === 'delete'\n ? undefined\n : args.body\n const { headers, data } = await retry(\n () =>\n axiosInstance.request({\n baseURL: args.baseUrl,\n url: args.url,\n method: args.method,\n headers: args.headers as AxiosRequestConfig['headers'],\n params: args.params,\n paramsSerializer: serializer,\n data: body,\n httpsAgent: args.httpsAgent,\n httpAgent: args.httpAgent,\n }),\n args.retry\n )\n return { headers, data } as R\n } catch (error) {\n throw fromAxiosError(error as AxiosError)\n }\n}\n\nconst mergeArgs = (\n baseUrl: string,\n url: string,\n method: string,\n requestArgs: RequestArgs | RequestOptions | undefined,\n extras: RequestOptions | undefined,\n global: ClientOptions | undefined\n): Partial<ClientOptions & RequestArgs> => {\n const params = merge('params', global, requestArgs, extras)\n const query = merge('query', global, requestArgs, extras)\n const headers = merge('headers', global, requestArgs, extras)\n const body = merge('body', global, requestArgs, extras)\n const retry = merge('retry', global, requestArgs, extras)\n const merged: Partial<ClientOptions & RequestArgs> = {\n url: setParams(url, params),\n baseUrl,\n method,\n params: query,\n headers,\n body,\n retry,\n arrayFormat: global?.arrayFormat,\n httpsAgent: extras?.httpsAgent,\n httpAgent: extras?.httpAgent,\n }\n\n return merged\n}\n\nconst merge = (\n prop: keyof (ClientOptions & RequestArgs),\n // biome-ignore lint/suspicious/noExplicitAny: it is any\n ...args: (any | undefined)[]\n // biome-ignore lint/suspicious/noExplicitAny: it is any\n): any => Object.assign({}, ...args.map((a) => a?.[prop] || {}))\n\nconst setParams = (url: string, params: Record<string, string> = {}): string =>\n Object.entries(params).reduce(\n (url, [key, val]) =>\n url.replace(new RegExp(`/:${key}(?!\\\\w|\\\\d)`, 'g'), `/${val}`),\n url\n )\n","import {\n apiGatewayTokenByUrlGenerator,\n apiGatewayTokenRefresh,\n} from '@sebspark/openapi-auth-iam'\nimport type { ClientOptions } from '@sebspark/openapi-core'\nimport { getLogger } from '@sebspark/otel'\nimport { TypedClient } from '../client'\nimport type {\n GatewayGraphqlClientArgs,\n GatewayGraphqlClient as GatewayGraphqlClientType,\n} from './types'\n\nexport class GatewayGraphqlClient<\n T extends GatewayGraphqlClientType = GatewayGraphqlClientType,\n> {\n public client: T\n public logger: ReturnType<typeof getLogger>\n private uri: string\n private options: ClientOptions\n\n constructor(args: GatewayGraphqlClientArgs) {\n this.uri = args.uri\n this.logger = getLogger('GatewayGraphqlClient')\n this.options = {\n timeout: 10 * 1000,\n authorizationTokenGenerator: async (url) => {\n this.logger.debug(`Generating token for: ${this.uri}`)\n return apiGatewayTokenByUrlGenerator(args.apiKey)(url)\n },\n authorizationTokenRefresh: async (url) => {\n this.logger.debug(`Refreshing token for: ${this.uri}`)\n return apiGatewayTokenRefresh()(url)\n },\n }\n this.client = TypedClient<T>(args.uri, this.options)\n }\n\n public async graphql<K>(query: string, variables?: Record<string, unknown>) {\n try {\n const response = await this.client.post('/graphql', {\n body: { query: query.trim(), variables },\n })\n\n if (response.data.errors) {\n this.logger.error(`Error posting graphql query to: ${this.uri}`)\n throw new Error(response.data.errors.map((e) => e.message).join('\\n'))\n }\n\n return response.data.data as K\n } catch (error) {\n this.logger.error(`Error posting graphql: ${this.uri}`)\n throw error\n }\n }\n\n public async isHealthy() {\n try {\n await this.client.get('/health')\n return true\n } catch (error) {\n this.logger.error(error as Error)\n }\n return false\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@sebspark/openapi-client",
3
- "version": "4.0.5",
3
+ "version": "4.0.7",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
6
+ "main": "dist/index.mjs",
7
+ "types": "dist/index.d.mts",
8
8
  "exports": {
9
9
  ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.js"
10
+ "types": "./dist/index.d.mts",
11
+ "import": "./dist/index.mjs"
12
12
  }
13
13
  },
14
14
  "files": [
@@ -16,7 +16,7 @@
16
16
  ],
17
17
  "scripts": {
18
18
  "generate": "yarn openapi-typegen -i ./src/test/ -o ./src/test/",
19
- "build": "tsup src/index.ts --config tsup.config.ts",
19
+ "build": "tsdown src/index.ts",
20
20
  "depcheck": "depcheck",
21
21
  "dev": "tsc --watch --noEmit",
22
22
  "lint": "biome check .",
@@ -30,7 +30,7 @@
30
30
  "@sebspark/tsconfig": "*",
31
31
  "express": "5.1.0",
32
32
  "nock": "14.0.10",
33
- "tsup": "8.5.0",
33
+ "tsdown": "0.16.6",
34
34
  "vitest": "4.0.6"
35
35
  },
36
36
  "dependencies": {
@@ -38,7 +38,7 @@
38
38
  "@sebspark/openapi-core": "*",
39
39
  "@sebspark/retry": "*",
40
40
  "@types/express-serve-static-core": "5.1.0",
41
- "axios": "1.13.1",
41
+ "axios": "1.13.2",
42
42
  "axios-auth-refresh": "3.3.6"
43
43
  },
44
44
  "peerDependencies": {
package/dist/index.d.ts DELETED
@@ -1,61 +0,0 @@
1
- export * from '@sebspark/retry';
2
- import { BaseClient, ClientOptions, RequestOptions, APIResponse } from '@sebspark/openapi-core';
3
- import { AxiosInstance } from 'axios';
4
- import { getLogger } from '@sebspark/otel';
5
-
6
- type TypedAxiosClient<T> = T & {
7
- axiosInstance: AxiosInstance;
8
- };
9
- declare const TypedClient: <C extends Partial<BaseClient>>(baseURL: string, globalOptions?: ClientOptions) => TypedAxiosClient<C>;
10
-
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
- uri: string;
48
- apiKey: string;
49
- };
50
-
51
- declare class GatewayGraphqlClient<T extends GatewayGraphqlClient$1 = GatewayGraphqlClient$1> {
52
- client: T;
53
- logger: ReturnType<typeof getLogger>;
54
- private uri;
55
- private options;
56
- constructor(args: GatewayGraphqlClientArgs);
57
- graphql<K>(query: string, variables?: Record<string, unknown>): Promise<K>;
58
- isHealthy(): Promise<boolean>;
59
- }
60
-
61
- export { GatewayGraphqlClient, type TypedAxiosClient, TypedClient };
package/dist/index.js DELETED
@@ -1,279 +0,0 @@
1
- // src/index.ts
2
- export * from "@sebspark/retry";
3
-
4
- // src/client.ts
5
- import { fromAxiosError } from "@sebspark/openapi-core";
6
- import { getLogger } from "@sebspark/otel";
7
- import { retry } from "@sebspark/retry";
8
- import axios from "axios";
9
- import createAuthRefreshInterceptor from "axios-auth-refresh";
10
-
11
- // src/paramsSerializer.ts
12
- var encodeParam = (param) => encodeURIComponent(param);
13
- var encodeValue = (param, encodeCommas = false) => {
14
- if (param instanceof Date) {
15
- return encodeURIComponent(param.toISOString());
16
- }
17
- if (typeof param === "number" || typeof param === "string" || typeof param === "boolean") {
18
- if (encodeCommas) {
19
- return encodeURIComponent(param);
20
- }
21
- return param.toString().split(",").map((p) => encodeURIComponent(p)).join(",");
22
- }
23
- return "";
24
- };
25
- var paramsSerializer = (format) => (params) => {
26
- if (!params) {
27
- return "";
28
- }
29
- const s = [];
30
- for (const [key, value] of Object.entries(params)) {
31
- if (value === void 0) {
32
- continue;
33
- }
34
- if (Array.isArray(value)) {
35
- const title = encodeParam(key);
36
- if (format === "comma") {
37
- s.push(`${title}=${value.map((v) => encodeValue(v, true)).join(",")}`);
38
- continue;
39
- }
40
- value.forEach((v, ix) => {
41
- const value2 = encodeValue(v);
42
- switch (format) {
43
- case "indices": {
44
- s.push(`${title}[${ix}]=${value2}`);
45
- break;
46
- }
47
- case "repeat": {
48
- s.push(`${title}=${value2}`);
49
- break;
50
- }
51
- default: {
52
- s.push(`${title}[]=${value2}`);
53
- break;
54
- }
55
- }
56
- });
57
- } else {
58
- s.push(`${encodeParam(key)}=${encodeValue(value)}`);
59
- }
60
- }
61
- return s.join("&");
62
- };
63
-
64
- // src/client.ts
65
- var createAuthRefreshInterceptorFunc = createAuthRefreshInterceptor?.default ?? createAuthRefreshInterceptor;
66
- var TypedClient = (baseURL, globalOptions) => {
67
- const axiosInstance = axios.create();
68
- const logger = getLogger("TypedClient");
69
- logger.debug(
70
- `client initialized with arrayFormat '${globalOptions?.arrayFormat}'`
71
- );
72
- if (globalOptions?.authorizationTokenGenerator) {
73
- logger.debug("authorizationTokenGenerator is set");
74
- axiosInstance.interceptors.request.use(async (request) => {
75
- const url = `${request.baseURL}${request.url}`;
76
- logger.debug(`Intercepting request to ${url}`);
77
- if (globalOptions?.authorizationTokenGenerator && url) {
78
- try {
79
- const authorizationTokenHeaders = await globalOptions.authorizationTokenGenerator(url);
80
- if (authorizationTokenHeaders) {
81
- for (const key of Object.keys(authorizationTokenHeaders)) {
82
- const value = authorizationTokenHeaders[key];
83
- logger.debug(`Setting header ${key} to ${value}`);
84
- request.headers[key] = value;
85
- }
86
- }
87
- } catch (error) {
88
- logger.error(`Error generating token for URL: ${url}`, error);
89
- throw error;
90
- }
91
- }
92
- logger.debug("Intercepted request:");
93
- logger.debug(JSON.stringify(request, null, 2));
94
- return request;
95
- });
96
- }
97
- if (globalOptions?.authorizationTokenRefresh) {
98
- const refreshAuthLogic = async (failedRequest) => {
99
- if (!axios.isAxiosError(failedRequest)) {
100
- logger.error(
101
- "Failed request is not an axios error",
102
- failedRequest
103
- );
104
- throw failedRequest;
105
- } else {
106
- logger.debug("Failed request", failedRequest);
107
- }
108
- const axiosError = failedRequest;
109
- logger.debug("Failed request config", axiosError.config);
110
- const url = `${axiosError.config?.baseURL}${axiosError.config?.url}`;
111
- if (globalOptions?.authorizationTokenRefresh && url) {
112
- logger.debug(`Refreshing token for URL ${url}`);
113
- try {
114
- await globalOptions?.authorizationTokenRefresh(url);
115
- } catch (error) {
116
- logger.error(`Error refreshing token for URL: ${url}`, error);
117
- throw error;
118
- }
119
- }
120
- return axiosError.response;
121
- };
122
- createAuthRefreshInterceptorFunc(axiosInstance, refreshAuthLogic);
123
- }
124
- if (logger) {
125
- axiosInstance.interceptors.request.use((request) => {
126
- const requestObject = {
127
- url: request.url,
128
- params: request.params,
129
- headers: request.headers
130
- };
131
- logger.debug("request", requestObject);
132
- return request;
133
- });
134
- axiosInstance.interceptors.response.use((response) => {
135
- const responseObject = {
136
- data: response.data,
137
- config: response.config,
138
- headers: response.headers
139
- };
140
- logger.debug("response", responseObject);
141
- return response;
142
- });
143
- }
144
- const client = {
145
- get: (url, args, opts) => callServer(
146
- axiosInstance,
147
- mergeArgs(baseURL, url, "get", args, opts, globalOptions),
148
- logger
149
- ),
150
- post: (url, args, opts) => callServer(
151
- axiosInstance,
152
- mergeArgs(baseURL, url, "post", args, opts, globalOptions),
153
- logger
154
- ),
155
- put: (url, args, opts) => callServer(
156
- axiosInstance,
157
- mergeArgs(baseURL, url, "put", args, opts, globalOptions),
158
- logger
159
- ),
160
- patch: (url, args, opts) => callServer(
161
- axiosInstance,
162
- mergeArgs(baseURL, url, "patch", args, opts, globalOptions),
163
- logger
164
- ),
165
- delete: (url, args, opts) => callServer(
166
- axiosInstance,
167
- mergeArgs(baseURL, url, "delete", args, opts, globalOptions),
168
- logger
169
- )
170
- };
171
- return { ...client, axiosInstance };
172
- };
173
- var callServer = async (axiosInstance, args, logger) => {
174
- try {
175
- const serializer = paramsSerializer(args.arrayFormat);
176
- logger.debug(`[callServer] typeof serializer: ${typeof serializer}`);
177
- const body = args.method?.toLowerCase() === "get" || args.method?.toLowerCase() === "delete" ? void 0 : args.body;
178
- const { headers, data } = await retry(
179
- () => axiosInstance.request({
180
- baseURL: args.baseUrl,
181
- url: args.url,
182
- method: args.method,
183
- headers: args.headers,
184
- params: args.params,
185
- paramsSerializer: serializer,
186
- data: body,
187
- httpsAgent: args.httpsAgent,
188
- httpAgent: args.httpAgent
189
- }),
190
- args.retry
191
- );
192
- return { headers, data };
193
- } catch (error) {
194
- throw fromAxiosError(error);
195
- }
196
- };
197
- var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
198
- const params = merge("params", global, requestArgs, extras);
199
- const query = merge("query", global, requestArgs, extras);
200
- const headers = merge("headers", global, requestArgs, extras);
201
- const body = merge("body", global, requestArgs, extras);
202
- const retry2 = merge("retry", global, requestArgs, extras);
203
- const merged = {
204
- url: setParams(url, params),
205
- baseUrl,
206
- method,
207
- params: query,
208
- headers,
209
- body,
210
- retry: retry2,
211
- arrayFormat: global?.arrayFormat,
212
- httpsAgent: extras?.httpsAgent,
213
- httpAgent: extras?.httpAgent
214
- };
215
- return merged;
216
- };
217
- var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => a?.[prop] || {}));
218
- var setParams = (url, params = {}) => Object.entries(params).reduce(
219
- (url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`),
220
- url
221
- );
222
-
223
- // src/graphql/client.ts
224
- import {
225
- apiGatewayTokenByUrlGenerator,
226
- apiGatewayTokenRefresh
227
- } from "@sebspark/openapi-auth-iam";
228
- import { getLogger as getLogger2 } from "@sebspark/otel";
229
- var GatewayGraphqlClient = class {
230
- client;
231
- logger;
232
- uri;
233
- options;
234
- constructor(args) {
235
- this.uri = args.uri;
236
- this.logger = getLogger2("GatewayGraphqlClient");
237
- this.options = {
238
- timeout: 10 * 1e3,
239
- authorizationTokenGenerator: async (url) => {
240
- this.logger.debug(`Generating token for: ${this.uri}`);
241
- return apiGatewayTokenByUrlGenerator(args.apiKey)(url);
242
- },
243
- authorizationTokenRefresh: async (url) => {
244
- this.logger.debug(`Refreshing token for: ${this.uri}`);
245
- return apiGatewayTokenRefresh()(url);
246
- }
247
- };
248
- this.client = TypedClient(args.uri, this.options);
249
- }
250
- async graphql(query, variables) {
251
- try {
252
- const response = await this.client.post("/graphql", {
253
- body: { query: query.trim(), variables }
254
- });
255
- if (response.data.errors) {
256
- this.logger.error(`Error posting graphql query to: ${this.uri}`);
257
- throw new Error(response.data.errors.map((e) => e.message).join("\n"));
258
- }
259
- return response.data.data;
260
- } catch (error) {
261
- this.logger.error(`Error posting graphql: ${this.uri}`);
262
- throw error;
263
- }
264
- }
265
- async isHealthy() {
266
- try {
267
- await this.client.get("/health");
268
- return true;
269
- } catch (error) {
270
- this.logger.error(error);
271
- }
272
- return false;
273
- }
274
- };
275
- export {
276
- GatewayGraphqlClient,
277
- TypedClient
278
- };
279
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/paramsSerializer.ts","../src/graphql/client.ts"],"sourcesContent":["export * from '@sebspark/retry'\nexport * from './client'\nexport * from './graphql/index'\n","import type {\n APIResponse,\n BaseClient,\n ClientOptions,\n RequestArgs,\n RequestOptions,\n} from '@sebspark/openapi-core'\nimport { fromAxiosError } from '@sebspark/openapi-core'\nimport { getLogger } from '@sebspark/otel'\nimport { retry } from '@sebspark/retry'\nimport type {\n AxiosError,\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n} from 'axios'\nimport axios from 'axios'\nimport createAuthRefreshInterceptor from 'axios-auth-refresh'\nimport { paramsSerializer } from './paramsSerializer'\n\nconst createAuthRefreshInterceptorFunc =\n (createAuthRefreshInterceptor as any)?.default ?? createAuthRefreshInterceptor\n\nexport type TypedAxiosClient<T> = T & {\n axiosInstance: AxiosInstance\n}\n\nexport const TypedClient = <C extends Partial<BaseClient>>(\n baseURL: string,\n globalOptions?: ClientOptions\n): TypedAxiosClient<C> => {\n const axiosInstance = axios.create()\n\n const logger = getLogger('TypedClient')\n\n logger.debug(\n `client initialized with arrayFormat '${globalOptions?.arrayFormat}'`\n )\n\n if (globalOptions?.authorizationTokenGenerator) {\n logger.debug('authorizationTokenGenerator is set')\n\n axiosInstance.interceptors.request.use(async (request) => {\n const url = `${request.baseURL}${request.url}`\n logger.debug(`Intercepting request to ${url}`)\n\n if (globalOptions?.authorizationTokenGenerator && url) {\n try {\n const authorizationTokenHeaders =\n await globalOptions.authorizationTokenGenerator(url)\n\n if (authorizationTokenHeaders) {\n for (const key of Object.keys(authorizationTokenHeaders)) {\n const value = authorizationTokenHeaders[key]\n logger.debug(`Setting header ${key} to ${value}`)\n request.headers[key] = value\n }\n }\n } catch (error) {\n logger.error(`Error generating token for URL: ${url}`, error as Error)\n throw error\n }\n }\n\n logger.debug('Intercepted request:')\n logger.debug(JSON.stringify(request, null, 2))\n return request\n })\n }\n\n if (globalOptions?.authorizationTokenRefresh) {\n const refreshAuthLogic = async (\n // biome-ignore lint/suspicious/noExplicitAny: Defined by dependency\n failedRequest: any\n ): Promise<AxiosResponse> => {\n if (!axios.isAxiosError(failedRequest)) {\n logger.error(\n 'Failed request is not an axios error',\n failedRequest as Error\n )\n throw failedRequest\n } else {\n logger.debug('Failed request', failedRequest)\n }\n\n const axiosError = failedRequest as AxiosError\n\n logger.debug('Failed request config', axiosError.config)\n\n const url = `${axiosError.config?.baseURL}${axiosError.config?.url}`\n if (globalOptions?.authorizationTokenRefresh && url) {\n logger.debug(`Refreshing token for URL ${url}`)\n try {\n await globalOptions?.authorizationTokenRefresh(url)\n } catch (error) {\n logger.error(`Error refreshing token for URL: ${url}`, error as Error)\n throw error\n }\n }\n\n return axiosError.response as AxiosResponse\n }\n\n createAuthRefreshInterceptorFunc(axiosInstance, refreshAuthLogic)\n }\n\n if (logger) {\n axiosInstance.interceptors.request.use((request) => {\n const requestObject = {\n url: request.url,\n params: request.params,\n headers: request.headers,\n }\n logger.debug('request', requestObject)\n return request\n })\n\n axiosInstance.interceptors.response.use((response) => {\n const responseObject = {\n data: response.data,\n config: response.config,\n headers: response.headers,\n }\n\n logger.debug('response', responseObject)\n return response\n })\n }\n\n const client: BaseClient = {\n get: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'get', args, opts, globalOptions),\n logger\n ),\n post: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'post', args, opts, globalOptions),\n logger\n ),\n put: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'put', args, opts, globalOptions),\n logger\n ),\n patch: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'patch', args, opts, globalOptions),\n logger\n ),\n delete: (url, args, opts) =>\n callServer(\n axiosInstance,\n mergeArgs(baseURL, url, 'delete', args, opts, globalOptions),\n logger\n ),\n }\n\n return { ...client, axiosInstance } as TypedAxiosClient<C>\n}\n\nconst callServer = async <\n R extends APIResponse<\n unknown | undefined,\n Record<string, string> | undefined\n >,\n>(\n axiosInstance: AxiosInstance,\n args: Partial<ClientOptions & RequestArgs>,\n logger: ReturnType<typeof getLogger>\n): Promise<R> => {\n try {\n const serializer = paramsSerializer((args as ClientOptions).arrayFormat)\n\n logger.debug(`[callServer] typeof serializer: ${typeof serializer}`)\n\n const body =\n args.method?.toLowerCase() === 'get' ||\n args.method?.toLowerCase() === 'delete'\n ? undefined\n : args.body\n const { headers, data } = await retry(\n () =>\n axiosInstance.request({\n baseURL: args.baseUrl,\n url: args.url,\n method: args.method,\n headers: args.headers as AxiosRequestConfig['headers'],\n params: args.params,\n paramsSerializer: serializer,\n data: body,\n httpsAgent: args.httpsAgent,\n httpAgent: args.httpAgent,\n }),\n args.retry\n )\n return { headers, data } as R\n } catch (error) {\n throw fromAxiosError(error as AxiosError)\n }\n}\n\nconst mergeArgs = (\n baseUrl: string,\n url: string,\n method: string,\n requestArgs: RequestArgs | RequestOptions | undefined,\n extras: RequestOptions | undefined,\n global: ClientOptions | undefined\n): Partial<ClientOptions & RequestArgs> => {\n const params = merge('params', global, requestArgs, extras)\n const query = merge('query', global, requestArgs, extras)\n const headers = merge('headers', global, requestArgs, extras)\n const body = merge('body', global, requestArgs, extras)\n const retry = merge('retry', global, requestArgs, extras)\n const merged: Partial<ClientOptions & RequestArgs> = {\n url: setParams(url, params),\n baseUrl,\n method,\n params: query,\n headers,\n body,\n retry,\n arrayFormat: global?.arrayFormat,\n httpsAgent: extras?.httpsAgent,\n httpAgent: extras?.httpAgent,\n }\n\n return merged\n}\n\nconst merge = (\n prop: keyof (ClientOptions & RequestArgs),\n // biome-ignore lint/suspicious/noExplicitAny: it is any\n ...args: (any | undefined)[]\n // biome-ignore lint/suspicious/noExplicitAny: it is any\n): any => Object.assign({}, ...args.map((a) => a?.[prop] || {}))\n\nconst setParams = (url: string, params: Record<string, string> = {}): string =>\n Object.entries(params).reduce(\n (url, [key, val]) =>\n url.replace(new RegExp(`/:${key}(?!\\\\w|\\\\d)`, 'g'), `/${val}`),\n url\n )\n","import type { ArrayFormat } from '@sebspark/openapi-core'\n\ntype Param = boolean | string | number | Date | undefined | Array<Param>\ntype Params = Record<string, Param>\n\nconst encodeParam = (param: string) => encodeURIComponent(param)\nconst encodeValue = (param: Param, encodeCommas = false) => {\n if (param instanceof Date) {\n return encodeURIComponent(param.toISOString())\n }\n if (\n typeof param === 'number' ||\n typeof param === 'string' ||\n typeof param === 'boolean'\n ) {\n if (encodeCommas) {\n return encodeURIComponent(param)\n }\n\n return param\n .toString()\n .split(',')\n .map((p) => encodeURIComponent(p))\n .join(',')\n }\n\n return ''\n}\n\nexport const paramsSerializer = (format?: ArrayFormat) => (params?: Params) => {\n if (!params) {\n return ''\n }\n\n const s = []\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) {\n continue\n }\n\n if (Array.isArray(value)) {\n const title = encodeParam(key)\n\n if (format === 'comma') {\n s.push(`${title}=${value.map((v) => encodeValue(v, true)).join(',')}`)\n continue\n }\n\n value.forEach((v, ix) => {\n const value = encodeValue(v)\n\n switch (format) {\n case 'indices': {\n s.push(`${title}[${ix}]=${value}`)\n break\n }\n case 'repeat': {\n s.push(`${title}=${value}`)\n break\n }\n default: {\n s.push(`${title}[]=${value}`)\n break\n }\n }\n })\n } else {\n s.push(`${encodeParam(key)}=${encodeValue(value)}`)\n }\n }\n\n return s.join('&')\n}\n","import {\n apiGatewayTokenByUrlGenerator,\n apiGatewayTokenRefresh,\n} from '@sebspark/openapi-auth-iam'\nimport type { ClientOptions } from '@sebspark/openapi-core'\nimport { getLogger } from '@sebspark/otel'\nimport { TypedClient } from '../client'\nimport type {\n GatewayGraphqlClientArgs,\n GatewayGraphqlClient as GatewayGraphqlClientType,\n} from './types'\n\nexport class GatewayGraphqlClient<\n T extends GatewayGraphqlClientType = GatewayGraphqlClientType,\n> {\n public client: T\n public logger: ReturnType<typeof getLogger>\n private uri: string\n private options: ClientOptions\n\n constructor(args: GatewayGraphqlClientArgs) {\n this.uri = args.uri\n this.logger = getLogger('GatewayGraphqlClient')\n this.options = {\n timeout: 10 * 1000,\n authorizationTokenGenerator: async (url) => {\n this.logger.debug(`Generating token for: ${this.uri}`)\n return apiGatewayTokenByUrlGenerator(args.apiKey)(url)\n },\n authorizationTokenRefresh: async (url) => {\n this.logger.debug(`Refreshing token for: ${this.uri}`)\n return apiGatewayTokenRefresh()(url)\n },\n }\n this.client = TypedClient<T>(args.uri, this.options)\n }\n\n public async graphql<K>(query: string, variables?: Record<string, unknown>) {\n try {\n const response = await this.client.post('/graphql', {\n body: { query: query.trim(), variables },\n })\n\n if (response.data.errors) {\n this.logger.error(`Error posting graphql query to: ${this.uri}`)\n throw new Error(response.data.errors.map((e) => e.message).join('\\n'))\n }\n\n return response.data.data as K\n } catch (error) {\n this.logger.error(`Error posting graphql: ${this.uri}`)\n throw error\n }\n }\n\n public async isHealthy() {\n try {\n await this.client.get('/health')\n return true\n } catch (error) {\n this.logger.error(error as Error)\n }\n return false\n }\n}\n"],"mappings":"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","names":["value","retry","url","getLogger","getLogger"]}