@izak0s/spacebring-api 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13,13 +13,14 @@ function createClient(clientOptions) {
13
13
  fetch: baseFetch = globalThis.fetch,
14
14
  querySerializer: globalQuerySerializer,
15
15
  bodySerializer: globalBodySerializer,
16
+ pathSerializer: globalPathSerializer,
16
17
  headers: baseHeaders,
17
18
  requestInitExt = void 0,
18
19
  ...baseOptions
19
20
  } = { ...clientOptions };
20
21
  requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;
21
22
  baseUrl = removeTrailingSlash(baseUrl);
22
- const middlewares = [];
23
+ const globalMiddlewares = [];
23
24
  async function coreFetch(schemaPath, fetchOptions) {
24
25
  const {
25
26
  baseUrl: localBaseUrl,
@@ -30,7 +31,9 @@ function createClient(clientOptions) {
30
31
  parseAs = "json",
31
32
  querySerializer: requestQuerySerializer,
32
33
  bodySerializer = globalBodySerializer ?? defaultBodySerializer,
34
+ pathSerializer: requestPathSerializer,
33
35
  body,
36
+ middleware: requestMiddlewares = [],
34
37
  ...init
35
38
  } = fetchOptions || {};
36
39
  let finalBaseUrl = baseUrl;
@@ -44,6 +47,7 @@ function createClient(clientOptions) {
44
47
  ...requestQuerySerializer
45
48
  });
46
49
  }
50
+ const pathSerializer = requestPathSerializer || globalPathSerializer || defaultPathSerializer;
47
51
  const serializedBody = body === void 0 ? void 0 : bodySerializer(
48
52
  body,
49
53
  // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:
@@ -63,6 +67,7 @@ function createClient(clientOptions) {
63
67
  headers,
64
68
  params.header
65
69
  );
70
+ const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];
66
71
  const requestInit = {
67
72
  redirect: "follow",
68
73
  ...baseOptions,
@@ -73,7 +78,7 @@ function createClient(clientOptions) {
73
78
  let id;
74
79
  let options;
75
80
  let request = new Request(
76
- createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),
81
+ createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer, pathSerializer }),
77
82
  requestInit
78
83
  );
79
84
  let response;
@@ -82,16 +87,17 @@ function createClient(clientOptions) {
82
87
  request[key] = init[key];
83
88
  }
84
89
  }
85
- if (middlewares.length) {
90
+ if (finalMiddlewares.length) {
86
91
  id = randomID();
87
92
  options = Object.freeze({
88
93
  baseUrl: finalBaseUrl,
89
94
  fetch,
90
95
  parseAs,
91
96
  querySerializer,
92
- bodySerializer
97
+ bodySerializer,
98
+ pathSerializer
93
99
  });
94
- for (const m of middlewares) {
100
+ for (const m of finalMiddlewares) {
95
101
  if (m && typeof m === "object" && typeof m.onRequest === "function") {
96
102
  const result = await m.onRequest({
97
103
  request,
@@ -118,9 +124,9 @@ function createClient(clientOptions) {
118
124
  response = await fetch(request, requestInitExt);
119
125
  } catch (error2) {
120
126
  let errorAfterMiddleware = error2;
121
- if (middlewares.length) {
122
- for (let i = middlewares.length - 1; i >= 0; i--) {
123
- const m = middlewares[i];
127
+ if (finalMiddlewares.length) {
128
+ for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
129
+ const m = finalMiddlewares[i];
124
130
  if (m && typeof m === "object" && typeof m.onError === "function") {
125
131
  const result = await m.onError({
126
132
  request,
@@ -149,9 +155,9 @@ function createClient(clientOptions) {
149
155
  throw errorAfterMiddleware;
150
156
  }
151
157
  }
152
- if (middlewares.length) {
153
- for (let i = middlewares.length - 1; i >= 0; i--) {
154
- const m = middlewares[i];
158
+ if (finalMiddlewares.length) {
159
+ for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
160
+ const m = finalMiddlewares[i];
155
161
  if (m && typeof m === "object" && typeof m.onResponse === "function") {
156
162
  const result = await m.onResponse({
157
163
  request,
@@ -171,14 +177,22 @@ function createClient(clientOptions) {
171
177
  }
172
178
  }
173
179
  }
174
- if (response.status === 204 || request.method === "HEAD" || response.headers.get("Content-Length") === "0") {
180
+ const contentLength = response.headers.get("Content-Length");
181
+ if (response.status === 204 || request.method === "HEAD" || contentLength === "0" && !response.headers.get("Transfer-Encoding")?.includes("chunked")) {
175
182
  return response.ok ? { data: void 0, response } : { error: void 0, response };
176
183
  }
177
184
  if (response.ok) {
178
- if (parseAs === "stream") {
179
- return { data: response.body, response };
180
- }
181
- return { data: await response[parseAs](), response };
185
+ const getResponseData = async () => {
186
+ if (parseAs === "stream") {
187
+ return response.body;
188
+ }
189
+ if (parseAs === "json" && !contentLength) {
190
+ const raw = await response.text();
191
+ return raw ? JSON.parse(raw) : void 0;
192
+ }
193
+ return await response[parseAs]();
194
+ };
195
+ return { data: await getResponseData(), response };
182
196
  }
183
197
  let error = await response.text();
184
198
  try {
@@ -232,15 +246,15 @@ function createClient(clientOptions) {
232
246
  if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) {
233
247
  throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
234
248
  }
235
- middlewares.push(m);
249
+ globalMiddlewares.push(m);
236
250
  }
237
251
  },
238
252
  /** Unregister middleware */
239
253
  eject(...middleware) {
240
254
  for (const m of middleware) {
241
- const i = middlewares.indexOf(m);
255
+ const i = globalMiddlewares.indexOf(m);
242
256
  if (i !== -1) {
243
- middlewares.splice(i, 1);
257
+ globalMiddlewares.splice(i, 1);
244
258
  }
245
259
  }
246
260
  }
@@ -421,7 +435,7 @@ function defaultBodySerializer(body, headers) {
421
435
  function createFinalURL(pathname, options) {
422
436
  let finalURL = `${options.baseUrl}${pathname}`;
423
437
  if (options.params?.path) {
424
- finalURL = defaultPathSerializer(finalURL, options.params.path);
438
+ finalURL = options.pathSerializer(finalURL, options.params.path);
425
439
  }
426
440
  let search = options.querySerializer(options.params.query ?? {});
427
441
  if (search.startsWith("?")) {