@hey-api/openapi-ts 0.81.1 → 0.82.1

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.
@@ -5,6 +5,17 @@ export type ServerSentEventsOptions<TData = unknown> = Omit<
5
5
  'method'
6
6
  > &
7
7
  Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {
8
+ /**
9
+ * Fetch API implementation. You can use this option to provide a custom
10
+ * fetch instance.
11
+ *
12
+ * @default globalThis.fetch
13
+ */
14
+ fetch?: typeof fetch;
15
+ /**
16
+ * Implementing clients can call request interceptors inside this hook.
17
+ */
18
+ onRequest?: (url: string, init: RequestInit) => Promise<Request>;
8
19
  /**
9
20
  * Callback invoked when a network or parsing error occurs during streaming.
10
21
  *
@@ -22,6 +33,7 @@ export type ServerSentEventsOptions<TData = unknown> = Omit<
22
33
  * @returns Nothing (void).
23
34
  */
24
35
  onSseEvent?: (event: StreamEvent<TData>) => void;
36
+ serializedBody?: RequestInit['body'];
25
37
  /**
26
38
  * Default retry delay in milliseconds.
27
39
  *
@@ -73,6 +85,7 @@ export type ServerSentEventsResult<
73
85
  };
74
86
 
75
87
  export const createSseClient = <TData = unknown>({
88
+ onRequest,
76
89
  onSseError,
77
90
  onSseEvent,
78
91
  responseTransformer,
@@ -110,7 +123,21 @@ export const createSseClient = <TData = unknown>({
110
123
  }
111
124
 
112
125
  try {
113
- const response = await fetch(url, { ...options, headers, signal });
126
+ const requestInit: RequestInit = {
127
+ redirect: 'follow',
128
+ ...options,
129
+ body: options.serializedBody,
130
+ headers,
131
+ signal,
132
+ };
133
+ let request = new Request(url, requestInit);
134
+ if (onRequest) {
135
+ request = await onRequest(url, requestInit);
136
+ }
137
+ // fetch must be assigned here, otherwise it would throw the error:
138
+ // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
139
+ const _fetch = options.fetch ?? globalThis.fetch;
140
+ const response = await _fetch(request);
114
141
 
115
142
  if (!response.ok)
116
143
  throw new Error(
@@ -106,23 +106,41 @@ export const createClient = (config: Config = {}): Client => {
106
106
  };
107
107
 
108
108
  if (response.ok) {
109
+ const parseAs =
110
+ (opts.parseAs === 'auto'
111
+ ? getParseAs(response.headers.get('Content-Type'))
112
+ : opts.parseAs) ?? 'json';
113
+
109
114
  if (
110
115
  response.status === 204 ||
111
116
  response.headers.get('Content-Length') === '0'
112
117
  ) {
118
+ let emptyData: any;
119
+ switch (parseAs) {
120
+ case 'arrayBuffer':
121
+ case 'blob':
122
+ case 'text':
123
+ emptyData = await response[parseAs]();
124
+ break;
125
+ case 'formData':
126
+ emptyData = new FormData();
127
+ break;
128
+ case 'stream':
129
+ emptyData = response.body;
130
+ break;
131
+ case 'json':
132
+ default:
133
+ emptyData = {};
134
+ break;
135
+ }
113
136
  return opts.responseStyle === 'data'
114
- ? {}
137
+ ? emptyData
115
138
  : {
116
- data: {},
139
+ data: emptyData,
117
140
  ...result,
118
141
  };
119
142
  }
120
143
 
121
- const parseAs =
122
- (opts.parseAs === 'auto'
123
- ? getParseAs(response.headers.get('Content-Type'))
124
- : opts.parseAs) ?? 'json';
125
-
126
144
  let data: any;
127
145
  switch (parseAs) {
128
146
  case 'arrayBuffer':
@@ -204,6 +222,15 @@ export const createClient = (config: Config = {}): Client => {
204
222
  body: opts.body as BodyInit | null | undefined,
205
223
  headers: opts.headers as unknown as Record<string, string>,
206
224
  method,
225
+ onRequest: async (url, init) => {
226
+ let request = new Request(url, init);
227
+ for (const fn of interceptors.request._fns) {
228
+ if (fn) {
229
+ request = await fn(request, opts);
230
+ }
231
+ }
232
+ return request;
233
+ },
207
234
  url,
208
235
  });
209
236
  };
@@ -24,7 +24,7 @@ export interface Config<T extends ClientOptions = ClientOptions>
24
24
  *
25
25
  * @default globalThis.fetch
26
26
  */
27
- fetch?: (request: Request) => ReturnType<typeof fetch>;
27
+ fetch?: typeof fetch;
28
28
  /**
29
29
  * Please don't use the Fetch client for Next.js applications. The `next`
30
30
  * options won't have any effect.
@@ -101,21 +101,39 @@ export const createClient = (config: Config = {}): Client => {
101
101
  };
102
102
 
103
103
  if (response.ok) {
104
+ const parseAs =
105
+ (opts.parseAs === 'auto'
106
+ ? getParseAs(response.headers.get('Content-Type'))
107
+ : opts.parseAs) ?? 'json';
108
+
104
109
  if (
105
110
  response.status === 204 ||
106
111
  response.headers.get('Content-Length') === '0'
107
112
  ) {
113
+ let emptyData: any;
114
+ switch (parseAs) {
115
+ case 'arrayBuffer':
116
+ case 'blob':
117
+ case 'text':
118
+ emptyData = await response[parseAs]();
119
+ break;
120
+ case 'formData':
121
+ emptyData = new FormData();
122
+ break;
123
+ case 'stream':
124
+ emptyData = response.body;
125
+ break;
126
+ case 'json':
127
+ default:
128
+ emptyData = {};
129
+ break;
130
+ }
108
131
  return {
109
- data: {},
132
+ data: emptyData,
110
133
  ...result,
111
134
  };
112
135
  }
113
136
 
114
- const parseAs =
115
- (opts.parseAs === 'auto'
116
- ? getParseAs(response.headers.get('Content-Type'))
117
- : opts.parseAs) ?? 'json';
118
-
119
137
  let data: any;
120
138
  switch (parseAs) {
121
139
  case 'arrayBuffer':
@@ -190,6 +208,21 @@ export const createClient = (config: Config = {}): Client => {
190
208
  body: opts.body as BodyInit | null | undefined,
191
209
  headers: opts.headers as unknown as Record<string, string>,
192
210
  method,
211
+ onRequest: async (url, init) => {
212
+ let request = new Request(url, init);
213
+ const requestInit = {
214
+ ...init,
215
+ method: init.method as Config['method'],
216
+ url,
217
+ };
218
+ for (const fn of interceptors.request._fns) {
219
+ if (fn) {
220
+ await fn(requestInit);
221
+ request = new Request(requestInit.url, requestInit);
222
+ }
223
+ }
224
+ return request;
225
+ },
193
226
  url,
194
227
  });
195
228
  };
@@ -192,6 +192,7 @@ export const createClient = (config: Config = {}): Client => {
192
192
  ...unwrapRefs(opts),
193
193
  body: opts.body as BodyInit | null | undefined,
194
194
  method,
195
+ onRequest: undefined,
195
196
  signal: unwrapRefs(opts.signal) as AbortSignal,
196
197
  url,
197
198
  });