valyrian.js 7.2.12 → 8.0.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.
Files changed (168) hide show
  1. package/README.md +6 -6
  2. package/dist/flux-store/index.d.ts +32 -0
  3. package/dist/flux-store/index.d.ts.map +1 -0
  4. package/dist/flux-store/index.js +267 -0
  5. package/dist/flux-store/index.js.map +7 -0
  6. package/dist/flux-store/index.min.js +1 -0
  7. package/dist/flux-store/index.min.js.map +1 -0
  8. package/dist/flux-store/index.mjs +246 -0
  9. package/dist/flux-store/index.mjs.map +7 -0
  10. package/dist/hooks/index.d.ts.map +1 -1
  11. package/dist/hooks/index.js +35 -51
  12. package/dist/hooks/index.js.map +3 -3
  13. package/dist/hooks/index.min.js +1 -0
  14. package/dist/hooks/index.min.js.map +1 -0
  15. package/dist/hooks/index.mjs +36 -52
  16. package/dist/hooks/index.mjs.map +3 -3
  17. package/dist/index.d.ts +18 -14
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +107 -88
  20. package/dist/index.js.map +3 -3
  21. package/dist/index.min.js +1 -1
  22. package/dist/index.min.js.map +1 -1
  23. package/dist/index.mjs +107 -88
  24. package/dist/index.mjs.map +3 -3
  25. package/dist/native-store/index.d.ts +14 -0
  26. package/dist/native-store/index.d.ts.map +1 -0
  27. package/dist/native-store/index.js +103 -0
  28. package/dist/native-store/index.js.map +7 -0
  29. package/dist/native-store/index.min.js +1 -0
  30. package/dist/native-store/index.min.js.map +1 -0
  31. package/dist/native-store/index.mjs +82 -0
  32. package/dist/native-store/index.mjs.map +7 -0
  33. package/dist/node/index.d.ts +1 -1
  34. package/dist/node/index.d.ts.map +1 -1
  35. package/dist/node/index.js +125 -10
  36. package/dist/node/index.js.map +4 -4
  37. package/dist/node/index.mjs +125 -10
  38. package/dist/node/index.mjs.map +4 -4
  39. package/dist/node/node.sw.js +152 -0
  40. package/dist/node/utils/icons.d.ts +4 -5
  41. package/dist/node/utils/icons.d.ts.map +1 -1
  42. package/dist/node/utils/inline.d.ts +1 -1
  43. package/dist/node/utils/inline.d.ts.map +1 -1
  44. package/dist/node/utils/node.sw.js +152 -0
  45. package/dist/node/utils/session-storage.d.ts +22 -0
  46. package/dist/node/utils/session-storage.d.ts.map +1 -0
  47. package/dist/node/utils/sw.d.ts.map +1 -1
  48. package/dist/node/utils/tree-adapter.d.ts +5 -1
  49. package/dist/node/utils/tree-adapter.d.ts.map +1 -1
  50. package/dist/pulse-store/index.d.ts +16 -0
  51. package/dist/pulse-store/index.d.ts.map +1 -0
  52. package/dist/pulse-store/index.js +143 -0
  53. package/dist/pulse-store/index.js.map +7 -0
  54. package/dist/pulse-store/index.min.js +1 -0
  55. package/dist/pulse-store/index.min.js.map +1 -0
  56. package/dist/pulse-store/index.mjs +122 -0
  57. package/dist/pulse-store/index.mjs.map +7 -0
  58. package/dist/request/index.d.ts +11 -11
  59. package/dist/request/index.d.ts.map +1 -1
  60. package/dist/request/index.js +63 -84
  61. package/dist/request/index.js.map +2 -2
  62. package/dist/request/index.min.js +1 -0
  63. package/dist/request/index.min.js.map +1 -0
  64. package/dist/request/index.mjs +63 -84
  65. package/dist/request/index.mjs.map +2 -2
  66. package/dist/router/index.d.ts +36 -33
  67. package/dist/router/index.d.ts.map +1 -1
  68. package/dist/router/index.js +247 -96
  69. package/dist/router/index.js.map +3 -3
  70. package/dist/router/index.min.js +1 -0
  71. package/dist/router/index.min.js.map +1 -0
  72. package/dist/router/index.mjs +247 -96
  73. package/dist/router/index.mjs.map +3 -3
  74. package/dist/signals/index.d.ts +6 -0
  75. package/dist/signals/index.d.ts.map +1 -0
  76. package/dist/signals/index.js +92 -0
  77. package/dist/signals/index.js.map +7 -0
  78. package/dist/signals/index.min.js +1 -0
  79. package/dist/signals/index.min.js.map +1 -0
  80. package/dist/signals/index.mjs +71 -0
  81. package/dist/signals/index.mjs.map +7 -0
  82. package/dist/suspense/index.d.ts +6 -0
  83. package/dist/suspense/index.d.ts.map +1 -0
  84. package/dist/suspense/index.js +67 -0
  85. package/dist/suspense/index.js.map +7 -0
  86. package/dist/suspense/index.min.js +1 -0
  87. package/dist/suspense/index.min.js.map +1 -0
  88. package/dist/suspense/index.mjs +46 -0
  89. package/dist/suspense/index.mjs.map +7 -0
  90. package/dist/sw/index.min.js +1 -0
  91. package/dist/sw/index.min.js.map +1 -0
  92. package/dist/translate/index.d.ts +19 -0
  93. package/dist/translate/index.d.ts.map +1 -0
  94. package/dist/translate/index.js +150 -0
  95. package/dist/translate/index.js.map +7 -0
  96. package/dist/translate/index.min.js +1 -0
  97. package/dist/translate/index.min.js.map +1 -0
  98. package/dist/translate/index.mjs +129 -0
  99. package/dist/translate/index.mjs.map +7 -0
  100. package/dist/tsconfig.tsbuildinfo +1 -1
  101. package/dist/utils/deep-freeze.d.ts +3 -0
  102. package/dist/utils/deep-freeze.d.ts.map +1 -0
  103. package/dist/utils/getter-setter.d.ts +3 -0
  104. package/dist/utils/getter-setter.d.ts.map +1 -0
  105. package/dist/utils/has-changed.d.ts +2 -0
  106. package/dist/utils/has-changed.d.ts.map +1 -0
  107. package/dist/utils/index.d.ts +4 -0
  108. package/dist/utils/index.d.ts.map +1 -0
  109. package/dist/utils/index.js +138 -0
  110. package/dist/utils/index.js.map +7 -0
  111. package/dist/utils/index.min.js +1 -0
  112. package/dist/utils/index.min.js.map +1 -0
  113. package/dist/utils/index.mjs +115 -0
  114. package/dist/utils/index.mjs.map +7 -0
  115. package/lib/flux-store/index.ts +312 -0
  116. package/lib/hooks/index.ts +39 -57
  117. package/lib/index.ts +135 -118
  118. package/lib/native-store/index.ts +106 -0
  119. package/lib/node/index.ts +3 -1
  120. package/lib/node/utils/icons.ts +4 -4
  121. package/lib/node/utils/inline.ts +2 -0
  122. package/lib/node/utils/node.sw.js +152 -0
  123. package/lib/node/utils/session-storage.ts +117 -0
  124. package/lib/node/utils/sw.ts +34 -10
  125. package/lib/node/utils/tree-adapter.ts +19 -1
  126. package/lib/pulse-store/index.ts +188 -0
  127. package/lib/request/index.ts +92 -122
  128. package/lib/router/index.ts +353 -164
  129. package/lib/signals/index.ts +98 -0
  130. package/lib/suspense/index.ts +57 -0
  131. package/lib/translate/index.ts +156 -0
  132. package/lib/utils/deep-freeze.ts +54 -0
  133. package/lib/utils/getter-setter.ts +40 -0
  134. package/lib/utils/has-changed.ts +43 -0
  135. package/lib/utils/index.ts +3 -0
  136. package/package.json +40 -57
  137. package/tsconfig.json +5 -4
  138. package/dist/dataset/index.d.ts +0 -24
  139. package/dist/dataset/index.d.ts.map +0 -1
  140. package/dist/dataset/index.js +0 -178
  141. package/dist/dataset/index.js.map +0 -7
  142. package/dist/dataset/index.mjs +0 -157
  143. package/dist/dataset/index.mjs.map +0 -7
  144. package/dist/node/node.sw.tpl +0 -133
  145. package/dist/node/utils/node.sw.tpl +0 -133
  146. package/dist/proxy-signal/index.d.ts +0 -23
  147. package/dist/proxy-signal/index.d.ts.map +0 -1
  148. package/dist/proxy-signal/index.js +0 -138
  149. package/dist/proxy-signal/index.js.map +0 -7
  150. package/dist/proxy-signal/index.mjs +0 -117
  151. package/dist/proxy-signal/index.mjs.map +0 -7
  152. package/dist/signal/index.d.ts +0 -9
  153. package/dist/signal/index.d.ts.map +0 -1
  154. package/dist/signal/index.js +0 -76
  155. package/dist/signal/index.js.map +0 -7
  156. package/dist/signal/index.mjs +0 -55
  157. package/dist/signal/index.mjs.map +0 -7
  158. package/dist/store/index.d.ts +0 -16
  159. package/dist/store/index.d.ts.map +0 -1
  160. package/dist/store/index.js +0 -93
  161. package/dist/store/index.js.map +0 -7
  162. package/dist/store/index.mjs +0 -72
  163. package/dist/store/index.mjs.map +0 -7
  164. package/lib/dataset/index.ts +0 -193
  165. package/lib/node/utils/node.sw.tpl +0 -133
  166. package/lib/proxy-signal/index.ts +0 -187
  167. package/lib/signal/index.ts +0 -86
  168. package/lib/store/index.ts +0 -101
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"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"}
@@ -24,30 +24,40 @@ __export(request_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(request_exports);
26
26
  var import_valyrian = require("valyrian.js");
27
+ var import_utils = require("valyrian.js/utils");
27
28
  function serialize(obj, prefix = "") {
28
- return Object.keys(obj).map((prop) => {
29
- const k = prefix ? `${prefix}[${prop}]` : prop;
30
- return typeof obj[prop] === "object" ? serialize(obj[prop], k) : `${encodeURIComponent(k)}=${encodeURIComponent(obj[prop])}`;
31
- }).join("&");
29
+ const params = new URLSearchParams();
30
+ Object.keys(obj).forEach((prop) => {
31
+ const key = prefix ? `${prefix}[${prop}]` : prop;
32
+ if (typeof obj[prop] === "object") {
33
+ params.append(key, serialize(obj[prop], key).toString());
34
+ } else {
35
+ params.append(key, obj[prop]);
36
+ }
37
+ });
38
+ return params;
39
+ }
40
+ function serializeFormData(data) {
41
+ return Object.entries(data).reduce((fd, [key, value]) => {
42
+ fd.append(key, value);
43
+ return fd;
44
+ }, new FormData());
32
45
  }
33
46
  function parseUrl(url, options) {
34
- let u = /^https?/gi.test(url) ? url : options.urls.base + url;
35
- const parts = u.split("?");
36
- u = parts[0].trim().replace(/^\/\//, "/").replace(/\/$/, "").trim();
37
- if (parts[1]) {
38
- u += `?${parts[1]}`;
39
- }
47
+ const urlWithoutSlash = url.replace(/\/+$/, "").trim();
48
+ const u = /^https?/gi.test(urlWithoutSlash) ? urlWithoutSlash : `${options.urls.base}${urlWithoutSlash}`;
40
49
  if (import_valyrian.isNodeJs && typeof options.urls.node === "string") {
41
- options.urls.node = options.urls.node;
42
50
  if (typeof options.urls.api === "string") {
43
- options.urls.api = options.urls.api.replace(/\/$/gi, "").trim();
44
- u = u.replace(options.urls.api, options.urls.node);
51
+ return new URL(u.replace(options.urls.api, options.urls.node));
45
52
  }
46
53
  if (!/^https?/gi.test(u)) {
47
- u = options.urls.node + u;
54
+ return new URL(u, options.urls.node);
48
55
  }
49
56
  }
50
- return u;
57
+ if (/^https?/gi.test(u)) {
58
+ return new URL(u);
59
+ }
60
+ return new URL(u, options.urls.base);
51
61
  }
52
62
  var defaultOptions = { allowedMethods: ["get", "post", "put", "patch", "delete", "head", "options"] };
53
63
  function Requester(baseUrl = "", options = defaultOptions) {
@@ -78,39 +88,33 @@ function Requester(baseUrl = "", options = defaultOptions) {
78
88
  ...opts,
79
89
  ...options2
80
90
  };
91
+ innerOptions.headers = { ...innerOptions.headers, ...opts.headers, ...options2.headers };
81
92
  if (!innerOptions.headers.Accept) {
82
93
  innerOptions.headers.Accept = "application/json";
83
94
  }
84
95
  const acceptType = innerOptions.headers.Accept;
85
96
  const contentType = innerOptions.headers["Content-Type"] || innerOptions.headers["content-type"] || "";
86
- if (innerOptions.allowedMethods.indexOf(method) === -1) {
87
- throw new Error("Method not allowed");
97
+ if (!innerOptions.allowedMethods.includes(method)) {
98
+ throw new Error(`Method ${method} not allowed. Allowed methods: ${innerOptions.allowedMethods.join(", ")}`);
99
+ }
100
+ let finalUrl;
101
+ try {
102
+ finalUrl = parseUrl(url2, opts);
103
+ } catch (error) {
104
+ throw new Error(`Failed to parse URL: ${url2}`);
88
105
  }
89
106
  if (data) {
107
+ const isJson = /json/gi.test(contentType);
90
108
  if (innerOptions.method === "GET" && typeof data === "object") {
91
- url2 += `?${serialize(data)}`;
92
- }
93
- if (innerOptions.method !== "GET") {
94
- if (/json/gi.test(contentType)) {
95
- innerOptions.body = JSON.stringify(data);
96
- } else {
97
- let formData;
98
- if (data instanceof FormData) {
99
- formData = data;
100
- } else {
101
- formData = new FormData();
102
- for (const i in data) {
103
- formData.append(i, data[i]);
104
- }
105
- }
106
- innerOptions.body = formData;
107
- }
109
+ finalUrl.search = serialize(data).toString();
110
+ } else if (innerOptions.method !== "GET") {
111
+ innerOptions.body = isJson ? JSON.stringify(data) : serializeFormData(data);
108
112
  }
109
113
  }
110
- const response = await fetch(parseUrl(url2, opts), innerOptions);
114
+ const response = await fetch(finalUrl.toString(), innerOptions);
111
115
  let body = null;
112
116
  if (!response.ok) {
113
- const err = new Error(response.statusText);
117
+ const err = new Error(`${response.status}: ${response.statusText}`);
114
118
  err.response = response;
115
119
  if (/text/gi.test(acceptType)) {
116
120
  err.body = await response.text();
@@ -119,6 +123,8 @@ function Requester(baseUrl = "", options = defaultOptions) {
119
123
  try {
120
124
  err.body = await response.json();
121
125
  } catch (error) {
126
+ err.body = null;
127
+ console.warn("Failed to parse JSON response:", error);
122
128
  }
123
129
  }
124
130
  throw err;
@@ -128,66 +134,39 @@ function Requester(baseUrl = "", options = defaultOptions) {
128
134
  }
129
135
  if (/text/gi.test(acceptType)) {
130
136
  body = await response.text();
131
- return body;
132
- }
133
- if (/json/gi.test(acceptType)) {
137
+ } else if (/json/gi.test(acceptType)) {
134
138
  try {
135
139
  body = await response.json();
136
- return body;
137
140
  } catch (error) {
141
+ console.warn("Failed to parse JSON response:", error);
142
+ body = null;
138
143
  }
144
+ } else if (/blob/gi.test(acceptType)) {
145
+ body = await response.blob();
146
+ } else if (/arraybuffer/gi.test(acceptType)) {
147
+ body = await response.arrayBuffer();
148
+ } else {
149
+ body = response;
139
150
  }
140
- return response;
151
+ return body || response;
141
152
  };
142
153
  request2.new = (baseUrl2, options2) => Requester(baseUrl2, { ...opts, ...options2 || {} });
143
154
  request2.setOption = (key, value) => {
144
- let result = opts;
145
- const parsed = key.split(".");
146
- let next;
147
- while (parsed.length) {
148
- next = parsed.shift();
149
- const nextIsArray = next.indexOf("[") > -1;
150
- if (nextIsArray) {
151
- const idx = next.replace(/\D/gi, "");
152
- next = next.split("[")[0];
153
- parsed.unshift(idx);
154
- }
155
- if (parsed.length > 0 && typeof result[next] !== "object") {
156
- result[next] = nextIsArray ? [] : {};
157
- }
158
- if (parsed.length === 0 && typeof value !== "undefined") {
159
- result[next] = value;
160
- }
161
- result = result[next];
162
- }
163
- return result;
155
+ (0, import_utils.set)(opts, key, value);
156
+ return opts;
164
157
  };
165
158
  request2.getOptions = (key) => {
166
- if (!key) {
167
- return opts;
168
- }
169
- let result = opts;
170
- const parsed = key.split(".");
171
- let next;
172
- while (parsed.length) {
173
- next = parsed.shift();
174
- const nextIsArray = next.indexOf("[") > -1;
175
- if (nextIsArray) {
176
- const idx = next.replace(/\D/gi, "");
177
- next = next.split("[")[0];
178
- parsed.unshift(idx);
179
- }
180
- if (parsed.length > 0 && typeof result[next] !== "object") {
181
- return null;
182
- }
183
- if (parsed.length === 0) {
184
- return result[next];
185
- }
186
- result = result[next];
159
+ if (key) {
160
+ return (0, import_utils.get)(opts, key);
187
161
  }
162
+ return opts;
188
163
  };
189
- opts.allowedMethods.forEach(
190
- (method) => request2[method] = (url2, data, options2) => request2(method, url2, data, options2)
164
+ Object.assign(
165
+ request2,
166
+ opts.allowedMethods.reduce((acc, method) => {
167
+ acc[method] = (url2, data, options2) => request2(method, url2, data, options2);
168
+ return acc;
169
+ }, {})
191
170
  );
192
171
  return request2;
193
172
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../lib/request/index.ts"],
4
- "sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\n\ninterface UrlOptions {\n base: string; // Used to prefix the url for scoped requests.\n node: string | null; // Used to redirect local requests to node server for server side rendering.\n api: string | null; // Used to redirect api requests to node server for server side rendering.\n}\n\ninterface RequestOptions {\n allowedMethods?: string[];\n urls?: UrlOptions;\n [key: string | number | symbol]: any;\n}\n\ninterface RequestOptionsWithUrls extends RequestOptions {\n urls: UrlOptions;\n allowedMethods: string[];\n}\n\ninterface SendOptions extends RequestOptionsWithUrls, RequestInit {\n allowedMethods: string[];\n method: string;\n headers: Record<string, string>;\n resolveWithFullResponse?: boolean;\n}\n\nexport interface RequestInterface {\n // eslint-disable-next-line no-unused-vars\n (method: string, url: string, data?: Record<string, any>, options?: Partial<SendOptions>): any | Response;\n // eslint-disable-next-line no-unused-vars\n new: (baseUrl: string, options?: RequestOptions) => RequestInterface;\n // eslint-disable-next-line no-unused-vars\n setOptions: (key: string, value: any) => void;\n // eslint-disable-next-line no-unused-vars\n getOptions: (key?: string) => RequestOptions | void;\n // eslint-disable-next-line no-unused-vars\n get: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n post: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n put: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n patch: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n delete: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n head: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n options: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n [key: string | number | symbol]: any;\n}\n\n// This method is used to serialize an object into a query string.\nfunction serialize(obj: Record<string, any>, prefix: string = \"\"): string {\n return Object.keys(obj)\n .map((prop: string) => {\n const k = prefix ? `${prefix}[${prop}]` : prop;\n return typeof obj[prop] === \"object\"\n ? serialize(obj[prop], k)\n : `${encodeURIComponent(k)}=${encodeURIComponent(obj[prop])}`;\n })\n .join(\"&\");\n}\n\nfunction parseUrl(url: string, options: RequestOptionsWithUrls) {\n let u = /^https?/gi.test(url) ? url : options.urls.base + url;\n\n const parts = u.split(\"?\");\n u = parts[0].trim().replace(/^\\/\\//, \"/\").replace(/\\/$/, \"\").trim();\n\n if (parts[1]) {\n u += `?${parts[1]}`;\n }\n\n if (isNodeJs && typeof options.urls.node === \"string\") {\n options.urls.node = options.urls.node;\n\n if (typeof options.urls.api === \"string\") {\n options.urls.api = options.urls.api.replace(/\\/$/gi, \"\").trim();\n u = u.replace(options.urls.api, options.urls.node);\n }\n\n if (!/^https?/gi.test(u)) {\n u = options.urls.node + u;\n }\n }\n\n return u;\n}\n\nconst defaultOptions: RequestOptions = { allowedMethods: [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"] };\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction Requester(baseUrl = \"\", options: RequestOptions = defaultOptions) {\n const url = baseUrl.replace(/\\/$/gi, \"\").trim();\n if (!options.urls) {\n options.urls = {\n base: \"\",\n node: null,\n api: null\n };\n }\n\n if (!options.allowedMethods) {\n options.allowedMethods = defaultOptions.allowedMethods;\n }\n\n const opts: RequestOptionsWithUrls = {\n ...(options as RequestOptionsWithUrls),\n urls: {\n node: options.urls.node || null,\n api: options.urls.api || null,\n base: options.urls.base ? options.urls.base + url : url\n }\n };\n\n const request = async function request(method: string, url: string, data?: Record<string, any>, options = {}) {\n const innerOptions: SendOptions = {\n method: method.toUpperCase(),\n headers: {},\n resolveWithFullResponse: false,\n ...opts,\n ...options\n } as SendOptions;\n\n if (!innerOptions.headers.Accept) {\n innerOptions.headers.Accept = \"application/json\";\n }\n\n const acceptType = innerOptions.headers.Accept;\n const contentType = innerOptions.headers[\"Content-Type\"] || innerOptions.headers[\"content-type\"] || \"\";\n\n if (innerOptions.allowedMethods.indexOf(method) === -1) {\n throw new Error(\"Method not allowed\");\n }\n\n if (data) {\n if (innerOptions.method === \"GET\" && typeof data === \"object\") {\n url += `?${serialize(data)}`;\n }\n\n if (innerOptions.method !== \"GET\") {\n if (/json/gi.test(contentType)) {\n innerOptions.body = JSON.stringify(data);\n } else {\n let formData;\n if (data instanceof FormData) {\n formData = data;\n } else {\n formData = new FormData();\n for (const i in data) {\n formData.append(i, data[i]);\n }\n }\n innerOptions.body = formData;\n }\n }\n }\n\n const response = await fetch(parseUrl(url, opts), innerOptions);\n let body = null;\n if (!response.ok) {\n const err = new Error(response.statusText) as Error & { response?: any; body?: any };\n err.response = response;\n if (/text/gi.test(acceptType)) {\n err.body = await response.text();\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n err.body = await response.json();\n } catch (error) {\n // ignore\n }\n }\n\n throw err;\n }\n\n if (innerOptions.resolveWithFullResponse) {\n return response;\n }\n\n if (/text/gi.test(acceptType)) {\n body = await response.text();\n return body;\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n body = await response.json();\n return body;\n } catch (error) {\n // ignore\n }\n }\n\n return response;\n } as unknown as RequestInterface;\n\n request.new = (baseUrl: string, options?: RequestOptions) => Requester(baseUrl, { ...opts, ...(options || {}) });\n\n request.setOption = (key: string, value: any) => {\n let result = opts;\n\n const parsed = key.split(\".\");\n let next;\n\n while (parsed.length) {\n next = parsed.shift() as string;\n\n const nextIsArray = next.indexOf(\"[\") > -1;\n if (nextIsArray) {\n const idx = next.replace(/\\D/gi, \"\");\n next = next.split(\"[\")[0];\n parsed.unshift(idx);\n }\n\n if (parsed.length > 0 && typeof result[next] !== \"object\") {\n result[next] = nextIsArray ? [] : {};\n }\n\n if (parsed.length === 0 && typeof value !== \"undefined\") {\n result[next] = value;\n }\n\n result = result[next];\n }\n\n return result;\n };\n\n request.getOptions = (key?: string) => {\n if (!key) {\n return opts;\n }\n\n let result = opts;\n const parsed = key.split(\".\");\n let next;\n\n while (parsed.length) {\n next = parsed.shift() as string;\n\n const nextIsArray = next.indexOf(\"[\") > -1;\n if (nextIsArray) {\n const idx = next.replace(/\\D/gi, \"\");\n next = next.split(\"[\")[0];\n parsed.unshift(idx);\n }\n\n if (parsed.length > 0 && typeof result[next] !== \"object\") {\n return null;\n }\n\n if (parsed.length === 0) {\n return result[next];\n }\n\n result = result[next];\n }\n };\n\n opts.allowedMethods.forEach(\n (method) =>\n (request[method] = (url: string, data?: Record<string, any>, options?: Record<string, any>) =>\n request(method, url, data, options))\n );\n\n return request;\n}\n\nexport const request = Requester();\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\nimport { get, set } from \"valyrian.js/utils\";\n\ninterface UrlOptions {\n base?: string; // Used to prefix the url for scoped requests.\n node?: string | null; // Used to redirect local requests to node server for server side rendering.\n api?: string | null; // Used to redirect api requests to node server for server side rendering.\n}\n\ninterface RequestOptions {\n allowedMethods?: string[];\n urls?: UrlOptions;\n [key: string | number | symbol]: any;\n}\n\ninterface RequestOptionsWithUrls extends RequestOptions {\n urls: UrlOptions;\n allowedMethods: string[];\n}\n\ninterface SendOptions extends RequestOptionsWithUrls, RequestInit {\n allowedMethods: string[];\n method: string;\n headers: Record<string, string>;\n resolveWithFullResponse?: boolean;\n}\n\nexport interface RequestInterface {\n // eslint-disable-next-line no-unused-vars\n (method: string, url: string, data?: Record<string, any> | null, options?: Partial<SendOptions>): any | Response;\n // eslint-disable-next-line no-unused-vars\n new: (baseUrl: string, options?: RequestOptions) => RequestInterface;\n // eslint-disable-next-line no-unused-vars\n setOptions: (key: string, value: any) => void;\n // eslint-disable-next-line no-unused-vars\n getOptions: (key?: string) => RequestOptions | void;\n // eslint-disable-next-line no-unused-vars\n get: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n post: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n put: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n patch: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n delete: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n head: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n options: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n [key: string | number | symbol]: any;\n}\n\n// This method is used to serialize an object into a query string.\nfunction serialize(obj: Record<string, any>, prefix: string = \"\"): URLSearchParams {\n const params = new URLSearchParams();\n\n Object.keys(obj).forEach((prop: string) => {\n const key = prefix ? `${prefix}[${prop}]` : prop;\n if (typeof obj[prop] === \"object\") {\n params.append(key, serialize(obj[prop], key).toString());\n } else {\n params.append(key, obj[prop]);\n }\n });\n\n return params;\n}\n\nfunction serializeFormData(data: Record<string, any>): FormData {\n return Object.entries(data).reduce((fd, [key, value]) => {\n fd.append(key, value);\n return fd;\n }, new FormData());\n}\n\nfunction parseUrl(url: string, options: RequestOptionsWithUrls) {\n const urlWithoutSlash = url.replace(/\\/+$/, \"\").trim();\n const u = /^https?/gi.test(urlWithoutSlash) ? urlWithoutSlash : `${options.urls.base}${urlWithoutSlash}`;\n\n if (isNodeJs && typeof options.urls.node === \"string\") {\n if (typeof options.urls.api === \"string\") {\n return new URL(u.replace(options.urls.api, options.urls.node));\n }\n\n if (!/^https?/gi.test(u)) {\n return new URL(u, options.urls.node);\n }\n }\n\n if (/^https?/gi.test(u)) {\n return new URL(u);\n }\n\n return new URL(u, options.urls.base);\n}\n\nconst defaultOptions: RequestOptions = { allowedMethods: [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"] };\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction Requester(baseUrl = \"\", options: RequestOptions = defaultOptions) {\n const url = baseUrl.replace(/\\/$/gi, \"\").trim();\n if (!options.urls) {\n options.urls = {\n base: \"\",\n node: null,\n api: null\n };\n }\n\n if (!options.allowedMethods) {\n options.allowedMethods = defaultOptions.allowedMethods;\n }\n\n const opts: RequestOptionsWithUrls = {\n ...(options as RequestOptionsWithUrls),\n urls: {\n node: options.urls.node || null,\n api: options.urls.api || null,\n base: options.urls.base ? options.urls.base + url : url\n }\n };\n\n // eslint-disable-next-line complexity\n const request = async function request(\n method: string,\n url: string,\n data?: Record<string, any> | null,\n options: Record<string, any> = {}\n ) {\n const innerOptions: SendOptions = {\n method: method.toUpperCase(),\n headers: {},\n resolveWithFullResponse: false,\n ...opts,\n ...options\n } as SendOptions;\n\n innerOptions.headers = { ...innerOptions.headers, ...opts.headers, ...options.headers };\n\n if (!innerOptions.headers.Accept) {\n innerOptions.headers.Accept = \"application/json\";\n }\n\n const acceptType = innerOptions.headers.Accept;\n const contentType = innerOptions.headers[\"Content-Type\"] || innerOptions.headers[\"content-type\"] || \"\";\n\n if (!innerOptions.allowedMethods.includes(method)) {\n throw new Error(`Method ${method} not allowed. Allowed methods: ${innerOptions.allowedMethods.join(\", \")}`);\n }\n\n let finalUrl: URL;\n try {\n finalUrl = parseUrl(url, opts);\n } catch (error) {\n throw new Error(`Failed to parse URL: ${url}`);\n }\n\n if (data) {\n const isJson = /json/gi.test(contentType);\n\n if (innerOptions.method === \"GET\" && typeof data === \"object\") {\n finalUrl.search = serialize(data).toString();\n } else if (innerOptions.method !== \"GET\") {\n innerOptions.body = isJson ? JSON.stringify(data) : serializeFormData(data);\n }\n }\n\n const response = await fetch(finalUrl.toString(), innerOptions);\n let body = null;\n if (!response.ok) {\n const err = new Error(`${response.status}: ${response.statusText}`) as Error & { response?: any; body?: any };\n err.response = response;\n if (/text/gi.test(acceptType)) {\n err.body = await response.text();\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n err.body = await response.json();\n } catch (error) {\n err.body = null;\n // eslint-disable-next-line no-console\n console.warn(\"Failed to parse JSON response:\", error);\n }\n }\n\n throw err;\n }\n\n if (innerOptions.resolveWithFullResponse) {\n return response;\n }\n\n if (/text/gi.test(acceptType)) {\n body = await response.text();\n } else if (/json/gi.test(acceptType)) {\n try {\n body = await response.json();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to parse JSON response:\", error);\n body = null;\n }\n } else if (/blob/gi.test(acceptType)) {\n body = await response.blob();\n } else if (/arraybuffer/gi.test(acceptType)) {\n body = await response.arrayBuffer();\n } else {\n body = response;\n }\n\n return body || response;\n } as unknown as RequestInterface;\n\n request.new = (baseUrl: string, options?: RequestOptions) => Requester(baseUrl, { ...opts, ...(options || {}) });\n\n request.setOption = (key: string, value: any) => {\n set(opts, key, value);\n return opts;\n };\n\n request.getOptions = (key?: string) => {\n if (key) {\n return get(opts, key);\n }\n\n return opts;\n };\n\n Object.assign(\n request,\n opts.allowedMethods.reduce((acc: Record<string, any>, method) => {\n acc[method] = (url: string, data?: Record<string, any> | null, options?: Record<string, any>) =>\n request(method, url, data, options);\n return acc;\n }, {})\n );\n\n return request;\n}\n\nexport const request = Requester();\n"],
5
+ "mappings": "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",
6
6
  "names": ["request", "url", "options", "baseUrl"]
7
7
  }
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,o={};((t,r)=>{for(var s in r)e(t,s,{get:r[s],enumerable:!0})})(o,{request:()=>c});var n,a=(n=o,((o,n,a,l)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let i of r(n))s.call(o,i)||i===a||e(o,i,{get:()=>n[i],enumerable:!(l=t(n,i))||l.enumerable});return o})(e({},"__esModule",{value:!0}),n)),l=require("valyrian.js"),i=require("valyrian.js/utils");function u(e,t=""){const r=new URLSearchParams;return Object.keys(e).forEach(s=>{const o=t?`${t}[${s}]`:s;"object"==typeof e[s]?r.append(o,u(e[s],o).toString()):r.append(o,e[s])}),r}var d={allowedMethods:["get","post","put","patch","delete","head","options"]};var c=function e(t="",r=d){const s=t.replace(/\/$/gi,"").trim();r.urls||(r.urls={base:"",node:null,api:null}),r.allowedMethods||(r.allowedMethods=d.allowedMethods);const o={...r,urls:{node:r.urls.node||null,api:r.urls.api||null,base:r.urls.base?r.urls.base+s:s}},n=async function(e,t,r,s={}){const n={method:e.toUpperCase(),headers:{},resolveWithFullResponse:!1,...o,...s};n.headers={...n.headers,...o.headers,...s.headers},n.headers.Accept||(n.headers.Accept="application/json");const a=n.headers.Accept,i=n.headers["Content-Type"]||n.headers["content-type"]||"";if(!n.allowedMethods.includes(e))throw new Error(`Method ${e} not allowed. Allowed methods: ${n.allowedMethods.join(", ")}`);let d;try{d=function(e,t){const r=e.replace(/\/+$/,"").trim(),s=/^https?/gi.test(r)?r:`${t.urls.base}${r}`;if(l.isNodeJs&&"string"==typeof t.urls.node){if("string"==typeof t.urls.api)return new URL(s.replace(t.urls.api,t.urls.node));if(!/^https?/gi.test(s))return new URL(s,t.urls.node)}return/^https?/gi.test(s)?new URL(s):new URL(s,t.urls.base)}(t,o)}catch(e){throw new Error(`Failed to parse URL: ${t}`)}if(r){const e=/json/gi.test(i);"GET"===n.method&&"object"==typeof r?d.search=u(r).toString():"GET"!==n.method&&(n.body=e?JSON.stringify(r):function(e){return Object.entries(e).reduce((e,[t,r])=>(e.append(t,r),e),new FormData)}(r))}const c=await fetch(d.toString(),n);let p=null;if(!c.ok){const e=new Error(`${c.status}: ${c.statusText}`);if(e.response=c,/text/gi.test(a)&&(e.body=await c.text()),/json/gi.test(a))try{e.body=await c.json()}catch(t){e.body=null,console.warn("Failed to parse JSON response:",t)}throw e}if(n.resolveWithFullResponse)return c;if(/text/gi.test(a))p=await c.text();else if(/json/gi.test(a))try{p=await c.json()}catch(e){console.warn("Failed to parse JSON response:",e),p=null}else p=/blob/gi.test(a)?await c.blob():/arraybuffer/gi.test(a)?await c.arrayBuffer():c;return p||c};return n.new=(t,r)=>e(t,{...o,...r||{}}),n.setOption=(e,t)=>((0,i.set)(o,e,t),o),n.getOptions=e=>e?(0,i.get)(o,e):o,Object.assign(n,o.allowedMethods.reduce((e,t)=>(e[t]=(e,r,s)=>n(t,e,r,s),e),{})),n}();"undefined"!=typeof module?module.exports=a:self.ValyrianRequest=a})();//# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1ZXN0X2V4cG9ydHMiLCJfX2V4cG9ydCIsInJlcXVlc3QiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJzZXJpYWxpemUiLCJvYmoiLCJwcmVmaXgiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsInByb3AiLCJrZXkiLCJhcHBlbmQiLCJ0b1N0cmluZyIsImRlZmF1bHRPcHRpb25zIiwiYWxsb3dlZE1ldGhvZHMiLCJSZXF1ZXN0ZXIiLCJiYXNlVXJsIiwib3B0aW9ucyIsInVybCIsInJlcGxhY2UiLCJ0cmltIiwidXJscyIsImJhc2UiLCJub2RlIiwiYXBpIiwib3B0cyIsImFzeW5jIiwibWV0aG9kIiwiZGF0YSIsImlubmVyT3B0aW9ucyIsInRvVXBwZXJDYXNlIiwiaGVhZGVycyIsInJlc29sdmVXaXRoRnVsbFJlc3BvbnNlIiwiQWNjZXB0IiwiYWNjZXB0VHlwZSIsImNvbnRlbnRUeXBlIiwiaW5jbHVkZXMiLCJFcnJvciIsImpvaW4iLCJmaW5hbFVybCIsInVybFdpdGhvdXRTbGFzaCIsInUiLCJ0ZXN0IiwiaXNOb2RlSnMiLCJVUkwiLCJwYXJzZVVybCIsImVycm9yIiwiaXNKc29uIiwic2VhcmNoIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlbnRyaWVzIiwicmVkdWNlIiwiZmQiLCJ2YWx1ZSIsIkZvcm1EYXRhIiwic2VyaWFsaXplRm9ybURhdGEiLCJyZXNwb25zZSIsImZldGNoIiwib2siLCJlcnIiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwidGV4dCIsImpzb24iLCJjb25zb2xlIiwid2FybiIsImJsb2IiLCJhcnJheUJ1ZmZlciIsIm5ldyIsInNldE9wdGlvbiIsInNldCIsImdldE9wdGlvbnMiLCJnZXQiLCJhc3NpZ24iLCJhY2MiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcmVxdWVzdC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGVKcyB9IGZyb20gXCJ2YWx5cmlhbi5qc1wiO1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tIFwidmFseXJpYW4uanMvdXRpbHNcIjtcblxuaW50ZXJmYWNlIFVybE9wdGlvbnMge1xuICBiYXNlPzogc3RyaW5nOyAvLyBVc2VkIHRvIHByZWZpeCB0aGUgdXJsIGZvciBzY29wZWQgcmVxdWVzdHMuXG4gIG5vZGU/OiBzdHJpbmcgfCBudWxsOyAvLyBVc2VkIHRvIHJlZGlyZWN0IGxvY2FsIHJlcXVlc3RzIHRvIG5vZGUgc2VydmVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcuXG4gIGFwaT86IHN0cmluZyB8IG51bGw7IC8vIFVzZWQgdG8gcmVkaXJlY3QgYXBpIHJlcXVlc3RzIHRvIG5vZGUgc2VydmVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcuXG59XG5cbmludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIGFsbG93ZWRNZXRob2RzPzogc3RyaW5nW107XG4gIHVybHM/OiBVcmxPcHRpb25zO1xuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0T3B0aW9uc1dpdGhVcmxzIGV4dGVuZHMgUmVxdWVzdE9wdGlvbnMge1xuICB1cmxzOiBVcmxPcHRpb25zO1xuICBhbGxvd2VkTWV0aG9kczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZW5kT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RPcHRpb25zV2l0aFVybHMsIFJlcXVlc3RJbml0IHtcbiAgYWxsb3dlZE1ldGhvZHM6IHN0cmluZ1tdO1xuICBtZXRob2Q6IHN0cmluZztcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnRlcmZhY2Uge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsLCBvcHRpb25zPzogUGFydGlhbDxTZW5kT3B0aW9ucz4pOiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldzogKGJhc2VVcmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSA9PiBSZXF1ZXN0SW50ZXJmYWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgc2V0T3B0aW9uczogKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB2b2lkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0T3B0aW9uczogKGtleT86IHN0cmluZykgPT4gUmVxdWVzdE9wdGlvbnMgfCB2b2lkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0OiAodXJsOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcG9zdDogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHB1dDogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHBhdGNoOiAodXJsOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZGVsZXRlOiAodXJsOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgaGVhZDogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG9wdGlvbnM6ICh1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55IHwgUmVzcG9uc2U7XG4gIFtrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueTtcbn1cblxuLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXJpYWxpemUgYW4gb2JqZWN0IGludG8gYSBxdWVyeSBzdHJpbmcuXG5mdW5jdGlvbiBzZXJpYWxpemUob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVmaXg6IHN0cmluZyA9IFwiXCIpOiBVUkxTZWFyY2hQYXJhbXMge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG5cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChwcm9wOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9WyR7cHJvcH1dYCA6IHByb3A7XG4gICAgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCBzZXJpYWxpemUob2JqW3Byb3BdLCBrZXkpLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMuYXBwZW5kKGtleSwgb2JqW3Byb3BdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUZvcm1EYXRhKGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBGb3JtRGF0YSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhkYXRhKS5yZWR1Y2UoKGZkLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBmZC5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIGZkO1xuICB9LCBuZXcgRm9ybURhdGEoKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9uc1dpdGhVcmxzKSB7XG4gIGNvbnN0IHVybFdpdGhvdXRTbGFzaCA9IHVybC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpLnRyaW0oKTtcbiAgY29uc3QgdSA9IC9eaHR0cHM/L2dpLnRlc3QodXJsV2l0aG91dFNsYXNoKSA/IHVybFdpdGhvdXRTbGFzaCA6IGAke29wdGlvbnMudXJscy5iYXNlfSR7dXJsV2l0aG91dFNsYXNofWA7XG5cbiAgaWYgKGlzTm9kZUpzICYmIHR5cGVvZiBvcHRpb25zLnVybHMubm9kZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmxzLmFwaSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG5ldyBVUkwodS5yZXBsYWNlKG9wdGlvbnMudXJscy5hcGksIG9wdGlvbnMudXJscy5ub2RlKSk7XG4gICAgfVxuXG4gICAgaWYgKCEvXmh0dHBzPy9naS50ZXN0KHUpKSB7XG4gICAgICByZXR1cm4gbmV3IFVSTCh1LCBvcHRpb25zLnVybHMubm9kZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKC9eaHR0cHM/L2dpLnRlc3QodSkpIHtcbiAgICByZXR1cm4gbmV3IFVSTCh1KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVVJMKHUsIG9wdGlvbnMudXJscy5iYXNlKTtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0geyBhbGxvd2VkTWV0aG9kczogW1wiZ2V0XCIsIFwicG9zdFwiLCBcInB1dFwiLCBcInBhdGNoXCIsIFwiZGVsZXRlXCIsIFwiaGVhZFwiLCBcIm9wdGlvbnNcIl0gfTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbmZ1bmN0aW9uIFJlcXVlc3RlcihiYXNlVXJsID0gXCJcIiwgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucykge1xuICBjb25zdCB1cmwgPSBiYXNlVXJsLnJlcGxhY2UoL1xcLyQvZ2ksIFwiXCIpLnRyaW0oKTtcbiAgaWYgKCFvcHRpb25zLnVybHMpIHtcbiAgICBvcHRpb25zLnVybHMgPSB7XG4gICAgICBiYXNlOiBcIlwiLFxuICAgICAgbm9kZTogbnVsbCxcbiAgICAgIGFwaTogbnVsbFxuICAgIH07XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuYWxsb3dlZE1ldGhvZHMpIHtcbiAgICBvcHRpb25zLmFsbG93ZWRNZXRob2RzID0gZGVmYXVsdE9wdGlvbnMuYWxsb3dlZE1ldGhvZHM7XG4gIH1cblxuICBjb25zdCBvcHRzOiBSZXF1ZXN0T3B0aW9uc1dpdGhVcmxzID0ge1xuICAgIC4uLihvcHRpb25zIGFzIFJlcXVlc3RPcHRpb25zV2l0aFVybHMpLFxuICAgIHVybHM6IHtcbiAgICAgIG5vZGU6IG9wdGlvbnMudXJscy5ub2RlIHx8IG51bGwsXG4gICAgICBhcGk6IG9wdGlvbnMudXJscy5hcGkgfHwgbnVsbCxcbiAgICAgIGJhc2U6IG9wdGlvbnMudXJscy5iYXNlID8gb3B0aW9ucy51cmxzLmJhc2UgKyB1cmwgOiB1cmxcbiAgICB9XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgcmVxdWVzdCA9IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICApIHtcbiAgICBjb25zdCBpbm5lck9wdGlvbnM6IFNlbmRPcHRpb25zID0ge1xuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9IGFzIFNlbmRPcHRpb25zO1xuXG4gICAgaW5uZXJPcHRpb25zLmhlYWRlcnMgPSB7IC4uLmlubmVyT3B0aW9ucy5oZWFkZXJzLCAuLi5vcHRzLmhlYWRlcnMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gICAgaWYgKCFpbm5lck9wdGlvbnMuaGVhZGVycy5BY2NlcHQpIHtcbiAgICAgIGlubmVyT3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2VwdFR5cGUgPSBpbm5lck9wdGlvbnMuaGVhZGVycy5BY2NlcHQ7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBpbm5lck9wdGlvbnMuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSB8fCBpbm5lck9wdGlvbnMuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSB8fCBcIlwiO1xuXG4gICAgaWYgKCFpbm5lck9wdGlvbnMuYWxsb3dlZE1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRob2QgJHttZXRob2R9IG5vdCBhbGxvd2VkLiBBbGxvd2VkIG1ldGhvZHM6ICR7aW5uZXJPcHRpb25zLmFsbG93ZWRNZXRob2RzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgZmluYWxVcmw6IFVSTDtcbiAgICB0cnkge1xuICAgICAgZmluYWxVcmwgPSBwYXJzZVVybCh1cmwsIG9wdHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBVUkw6ICR7dXJsfWApO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBjb25zdCBpc0pzb24gPSAvanNvbi9naS50ZXN0KGNvbnRlbnRUeXBlKTtcblxuICAgICAgaWYgKGlubmVyT3B0aW9ucy5tZXRob2QgPT09IFwiR0VUXCIgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZmluYWxVcmwuc2VhcmNoID0gc2VyaWFsaXplKGRhdGEpLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKGlubmVyT3B0aW9ucy5tZXRob2QgIT09IFwiR0VUXCIpIHtcbiAgICAgICAgaW5uZXJPcHRpb25zLmJvZHkgPSBpc0pzb24gPyBKU09OLnN0cmluZ2lmeShkYXRhKSA6IHNlcmlhbGl6ZUZvcm1EYXRhKGRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmluYWxVcmwudG9TdHJpbmcoKSwgaW5uZXJPcHRpb25zKTtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKSBhcyBFcnJvciAmIHsgcmVzcG9uc2U/OiBhbnk7IGJvZHk/OiBhbnkgfTtcbiAgICAgIGVyci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKC90ZXh0L2dpLnRlc3QoYWNjZXB0VHlwZSkpIHtcbiAgICAgICAgZXJyLmJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgvanNvbi9naS50ZXN0KGFjY2VwdFR5cGUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXJyLmJvZHkgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyLmJvZHkgPSBudWxsO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlubmVyT3B0aW9ucy5yZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGlmICgvdGV4dC9naS50ZXN0KGFjY2VwdFR5cGUpKSB7XG4gICAgICBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gZWxzZSBpZiAoL2pzb24vZ2kudGVzdChhY2NlcHRUeXBlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlOlwiLCBlcnJvcik7XG4gICAgICAgIGJvZHkgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL2Jsb2IvZ2kudGVzdChhY2NlcHRUeXBlKSkge1xuICAgICAgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcbiAgICB9IGVsc2UgaWYgKC9hcnJheWJ1ZmZlci9naS50ZXN0KGFjY2VwdFR5cGUpKSB7XG4gICAgICBib2R5ID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keSA9IHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJldHVybiBib2R5IHx8IHJlc3BvbnNlO1xuICB9IGFzIHVua25vd24gYXMgUmVxdWVzdEludGVyZmFjZTtcblxuICByZXF1ZXN0Lm5ldyA9IChiYXNlVXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykgPT4gUmVxdWVzdGVyKGJhc2VVcmwsIHsgLi4ub3B0cywgLi4uKG9wdGlvbnMgfHwge30pIH0pO1xuXG4gIHJlcXVlc3Quc2V0T3B0aW9uID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgc2V0KG9wdHMsIGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBvcHRzO1xuICB9O1xuXG4gIHJlcXVlc3QuZ2V0T3B0aW9ucyA9IChrZXk/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KG9wdHMsIGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdHM7XG4gIH07XG5cbiAgT2JqZWN0LmFzc2lnbihcbiAgICByZXF1ZXN0LFxuICAgIG9wdHMuYWxsb3dlZE1ldGhvZHMucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIG1ldGhvZCkgPT4ge1xuICAgICAgYWNjW21ldGhvZF0gPSAodXJsOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+XG4gICAgICAgIHJlcXVlc3QobWV0aG9kLCB1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSlcbiAgKTtcblxuICByZXR1cm4gcmVxdWVzdDtcbn1cblxuZXhwb3J0IGNvbnN0IHJlcXVlc3QgPSBSZXF1ZXN0ZXIoKTtcbiJdLCJtYXBwaW5ncyI6ImdKQUFBQSxFQUFBLEcseURBQUFDLENBQUFELEVBQUEsQ0FBQUUsUUFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBSCxFLDBNQUFBSSxFQUF5QkMsUUFBQSxlQUN6QkMsRUFBeUJELFFBQUEscUJBcUR6QixTQUFTRSxFQUFVQyxFQUEwQkMsRUFBaUIsSUFDNUQsTUFBTUMsRUFBUyxJQUFJQyxnQkFXbkIsT0FUQUMsT0FBT0MsS0FBS0wsR0FBS00sUUFBU0MsSUFDeEIsTUFBTUMsRUFBTVAsRUFBUyxHQUFHQSxLQUFVTSxLQUFVQSxFQUNuQixpQkFBZFAsRUFBSU8sR0FDYkwsRUFBT08sT0FBT0QsRUFBS1QsRUFBVUMsRUFBSU8sR0FBT0MsR0FBS0UsWUFFN0NSLEVBQU9PLE9BQU9ELEVBQUtSLEVBQUlPLEdBQ3pCLEdBR0tMLENBQ1QsQ0E4QkEsSUFBTVMsRUFBaUMsQ0FBRUMsZUFBZ0IsQ0FBQyxNQUFPLE9BQVEsTUFBTyxRQUFTLFNBQVUsT0FBUSxZQWlKcEcsSUFBTWxCLEVBOUliLFNBQVNtQixFQUFVQyxFQUFVLEdBQUlDLEVBQTBCSixHQUN6RCxNQUFNSyxFQUFNRixFQUFRRyxRQUFRLFFBQVMsSUFBSUMsT0FDcENILEVBQVFJLE9BQ1hKLEVBQVFJLEtBQU8sQ0FDYkMsS0FBTSxHQUNOQyxLQUFNLEtBQ05DLElBQUssT0FJSlAsRUFBUUgsaUJBQ1hHLEVBQVFILGVBQWlCRCxFQUFlQyxnQkFHMUMsTUFBTVcsRUFBK0IsSUFDL0JSLEVBQ0pJLEtBQU0sQ0FDSkUsS0FBTU4sRUFBUUksS0FBS0UsTUFBUSxLQUMzQkMsSUFBS1AsRUFBUUksS0FBS0csS0FBTyxLQUN6QkYsS0FBTUwsRUFBUUksS0FBS0MsS0FBT0wsRUFBUUksS0FBS0MsS0FBT0osRUFBTUEsSUFLbER0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
@@ -1,29 +1,39 @@
1
1
  // lib/request/index.ts
2
2
  import { isNodeJs } from "valyrian.js";
3
+ import { get, set } from "valyrian.js/utils";
3
4
  function serialize(obj, prefix = "") {
4
- return Object.keys(obj).map((prop) => {
5
- const k = prefix ? `${prefix}[${prop}]` : prop;
6
- return typeof obj[prop] === "object" ? serialize(obj[prop], k) : `${encodeURIComponent(k)}=${encodeURIComponent(obj[prop])}`;
7
- }).join("&");
5
+ const params = new URLSearchParams();
6
+ Object.keys(obj).forEach((prop) => {
7
+ const key = prefix ? `${prefix}[${prop}]` : prop;
8
+ if (typeof obj[prop] === "object") {
9
+ params.append(key, serialize(obj[prop], key).toString());
10
+ } else {
11
+ params.append(key, obj[prop]);
12
+ }
13
+ });
14
+ return params;
15
+ }
16
+ function serializeFormData(data) {
17
+ return Object.entries(data).reduce((fd, [key, value]) => {
18
+ fd.append(key, value);
19
+ return fd;
20
+ }, new FormData());
8
21
  }
9
22
  function parseUrl(url, options) {
10
- let u = /^https?/gi.test(url) ? url : options.urls.base + url;
11
- const parts = u.split("?");
12
- u = parts[0].trim().replace(/^\/\//, "/").replace(/\/$/, "").trim();
13
- if (parts[1]) {
14
- u += `?${parts[1]}`;
15
- }
23
+ const urlWithoutSlash = url.replace(/\/+$/, "").trim();
24
+ const u = /^https?/gi.test(urlWithoutSlash) ? urlWithoutSlash : `${options.urls.base}${urlWithoutSlash}`;
16
25
  if (isNodeJs && typeof options.urls.node === "string") {
17
- options.urls.node = options.urls.node;
18
26
  if (typeof options.urls.api === "string") {
19
- options.urls.api = options.urls.api.replace(/\/$/gi, "").trim();
20
- u = u.replace(options.urls.api, options.urls.node);
27
+ return new URL(u.replace(options.urls.api, options.urls.node));
21
28
  }
22
29
  if (!/^https?/gi.test(u)) {
23
- u = options.urls.node + u;
30
+ return new URL(u, options.urls.node);
24
31
  }
25
32
  }
26
- return u;
33
+ if (/^https?/gi.test(u)) {
34
+ return new URL(u);
35
+ }
36
+ return new URL(u, options.urls.base);
27
37
  }
28
38
  var defaultOptions = { allowedMethods: ["get", "post", "put", "patch", "delete", "head", "options"] };
29
39
  function Requester(baseUrl = "", options = defaultOptions) {
@@ -54,39 +64,33 @@ function Requester(baseUrl = "", options = defaultOptions) {
54
64
  ...opts,
55
65
  ...options2
56
66
  };
67
+ innerOptions.headers = { ...innerOptions.headers, ...opts.headers, ...options2.headers };
57
68
  if (!innerOptions.headers.Accept) {
58
69
  innerOptions.headers.Accept = "application/json";
59
70
  }
60
71
  const acceptType = innerOptions.headers.Accept;
61
72
  const contentType = innerOptions.headers["Content-Type"] || innerOptions.headers["content-type"] || "";
62
- if (innerOptions.allowedMethods.indexOf(method) === -1) {
63
- throw new Error("Method not allowed");
73
+ if (!innerOptions.allowedMethods.includes(method)) {
74
+ throw new Error(`Method ${method} not allowed. Allowed methods: ${innerOptions.allowedMethods.join(", ")}`);
75
+ }
76
+ let finalUrl;
77
+ try {
78
+ finalUrl = parseUrl(url2, opts);
79
+ } catch (error) {
80
+ throw new Error(`Failed to parse URL: ${url2}`);
64
81
  }
65
82
  if (data) {
83
+ const isJson = /json/gi.test(contentType);
66
84
  if (innerOptions.method === "GET" && typeof data === "object") {
67
- url2 += `?${serialize(data)}`;
68
- }
69
- if (innerOptions.method !== "GET") {
70
- if (/json/gi.test(contentType)) {
71
- innerOptions.body = JSON.stringify(data);
72
- } else {
73
- let formData;
74
- if (data instanceof FormData) {
75
- formData = data;
76
- } else {
77
- formData = new FormData();
78
- for (const i in data) {
79
- formData.append(i, data[i]);
80
- }
81
- }
82
- innerOptions.body = formData;
83
- }
85
+ finalUrl.search = serialize(data).toString();
86
+ } else if (innerOptions.method !== "GET") {
87
+ innerOptions.body = isJson ? JSON.stringify(data) : serializeFormData(data);
84
88
  }
85
89
  }
86
- const response = await fetch(parseUrl(url2, opts), innerOptions);
90
+ const response = await fetch(finalUrl.toString(), innerOptions);
87
91
  let body = null;
88
92
  if (!response.ok) {
89
- const err = new Error(response.statusText);
93
+ const err = new Error(`${response.status}: ${response.statusText}`);
90
94
  err.response = response;
91
95
  if (/text/gi.test(acceptType)) {
92
96
  err.body = await response.text();
@@ -95,6 +99,8 @@ function Requester(baseUrl = "", options = defaultOptions) {
95
99
  try {
96
100
  err.body = await response.json();
97
101
  } catch (error) {
102
+ err.body = null;
103
+ console.warn("Failed to parse JSON response:", error);
98
104
  }
99
105
  }
100
106
  throw err;
@@ -104,66 +110,39 @@ function Requester(baseUrl = "", options = defaultOptions) {
104
110
  }
105
111
  if (/text/gi.test(acceptType)) {
106
112
  body = await response.text();
107
- return body;
108
- }
109
- if (/json/gi.test(acceptType)) {
113
+ } else if (/json/gi.test(acceptType)) {
110
114
  try {
111
115
  body = await response.json();
112
- return body;
113
116
  } catch (error) {
117
+ console.warn("Failed to parse JSON response:", error);
118
+ body = null;
114
119
  }
120
+ } else if (/blob/gi.test(acceptType)) {
121
+ body = await response.blob();
122
+ } else if (/arraybuffer/gi.test(acceptType)) {
123
+ body = await response.arrayBuffer();
124
+ } else {
125
+ body = response;
115
126
  }
116
- return response;
127
+ return body || response;
117
128
  };
118
129
  request2.new = (baseUrl2, options2) => Requester(baseUrl2, { ...opts, ...options2 || {} });
119
130
  request2.setOption = (key, value) => {
120
- let result = opts;
121
- const parsed = key.split(".");
122
- let next;
123
- while (parsed.length) {
124
- next = parsed.shift();
125
- const nextIsArray = next.indexOf("[") > -1;
126
- if (nextIsArray) {
127
- const idx = next.replace(/\D/gi, "");
128
- next = next.split("[")[0];
129
- parsed.unshift(idx);
130
- }
131
- if (parsed.length > 0 && typeof result[next] !== "object") {
132
- result[next] = nextIsArray ? [] : {};
133
- }
134
- if (parsed.length === 0 && typeof value !== "undefined") {
135
- result[next] = value;
136
- }
137
- result = result[next];
138
- }
139
- return result;
131
+ set(opts, key, value);
132
+ return opts;
140
133
  };
141
134
  request2.getOptions = (key) => {
142
- if (!key) {
143
- return opts;
144
- }
145
- let result = opts;
146
- const parsed = key.split(".");
147
- let next;
148
- while (parsed.length) {
149
- next = parsed.shift();
150
- const nextIsArray = next.indexOf("[") > -1;
151
- if (nextIsArray) {
152
- const idx = next.replace(/\D/gi, "");
153
- next = next.split("[")[0];
154
- parsed.unshift(idx);
155
- }
156
- if (parsed.length > 0 && typeof result[next] !== "object") {
157
- return null;
158
- }
159
- if (parsed.length === 0) {
160
- return result[next];
161
- }
162
- result = result[next];
135
+ if (key) {
136
+ return get(opts, key);
163
137
  }
138
+ return opts;
164
139
  };
165
- opts.allowedMethods.forEach(
166
- (method) => request2[method] = (url2, data, options2) => request2(method, url2, data, options2)
140
+ Object.assign(
141
+ request2,
142
+ opts.allowedMethods.reduce((acc, method) => {
143
+ acc[method] = (url2, data, options2) => request2(method, url2, data, options2);
144
+ return acc;
145
+ }, {})
167
146
  );
168
147
  return request2;
169
148
  }