valyrian.js 7.2.11 → 8.0.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/README.md +6 -6
- package/dist/flux-store/index.d.ts +32 -0
- package/dist/flux-store/index.d.ts.map +1 -0
- package/dist/flux-store/index.js +258 -0
- package/dist/flux-store/index.js.map +7 -0
- package/dist/flux-store/index.min.js +1 -0
- package/dist/flux-store/index.min.js.map +1 -0
- package/dist/flux-store/index.mjs +237 -0
- package/dist/flux-store/index.mjs.map +7 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +42 -75
- package/dist/hooks/index.js.map +2 -2
- package/dist/hooks/index.min.js +1 -0
- package/dist/hooks/index.min.js.map +1 -0
- package/dist/hooks/index.mjs +43 -76
- package/dist/hooks/index.mjs.map +2 -2
- package/dist/index.d.ts +52 -54
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +397 -328
- package/dist/index.js.map +3 -3
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +397 -328
- package/dist/index.mjs.map +3 -3
- package/dist/native-store/index.d.ts +14 -0
- package/dist/native-store/index.d.ts.map +1 -0
- package/dist/native-store/index.js +103 -0
- package/dist/native-store/index.js.map +7 -0
- package/dist/native-store/index.min.js +1 -0
- package/dist/native-store/index.min.js.map +1 -0
- package/dist/native-store/index.mjs +82 -0
- package/dist/native-store/index.mjs.map +7 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +223 -86
- package/dist/node/index.js.map +4 -4
- package/dist/node/index.mjs +223 -86
- package/dist/node/index.mjs.map +4 -4
- package/dist/node/node.sw.js +152 -0
- package/dist/node/utils/inline.d.ts.map +1 -1
- package/dist/node/utils/node.sw.js +152 -0
- package/dist/node/utils/session-storage.d.ts +22 -0
- package/dist/node/utils/session-storage.d.ts.map +1 -0
- package/dist/node/utils/sw.d.ts.map +1 -1
- package/dist/node/utils/tree-adapter.d.ts +9 -0
- package/dist/node/utils/tree-adapter.d.ts.map +1 -1
- package/dist/pulse-store/index.d.ts +13 -0
- package/dist/pulse-store/index.d.ts.map +1 -0
- package/dist/pulse-store/index.js +143 -0
- package/dist/pulse-store/index.js.map +7 -0
- package/dist/pulse-store/index.min.js +1 -0
- package/dist/pulse-store/index.min.js.map +1 -0
- package/dist/pulse-store/index.mjs +122 -0
- package/dist/pulse-store/index.mjs.map +7 -0
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +68 -89
- package/dist/request/index.js.map +2 -2
- package/dist/request/index.min.js +1 -0
- package/dist/request/index.min.js.map +1 -0
- package/dist/request/index.mjs +68 -89
- package/dist/request/index.mjs.map +2 -2
- package/dist/router/index.d.ts +32 -31
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +256 -104
- package/dist/router/index.js.map +3 -3
- package/dist/router/index.min.js +1 -0
- package/dist/router/index.min.js.map +1 -0
- package/dist/router/index.mjs +256 -104
- package/dist/router/index.mjs.map +3 -3
- package/dist/signals/index.d.ts +6 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/index.js +92 -0
- package/dist/signals/index.js.map +7 -0
- package/dist/signals/index.min.js +1 -0
- package/dist/signals/index.min.js.map +1 -0
- package/dist/signals/index.mjs +71 -0
- package/dist/signals/index.mjs.map +7 -0
- package/dist/suspense/index.d.ts +6 -0
- package/dist/suspense/index.d.ts.map +1 -0
- package/dist/suspense/index.js +67 -0
- package/dist/suspense/index.js.map +7 -0
- package/dist/suspense/index.min.js +1 -0
- package/dist/suspense/index.min.js.map +1 -0
- package/dist/suspense/index.mjs +46 -0
- package/dist/suspense/index.mjs.map +7 -0
- package/dist/sw/index.min.js +1 -0
- package/dist/sw/index.min.js.map +1 -0
- package/dist/translate/index.d.ts +19 -0
- package/dist/translate/index.d.ts.map +1 -0
- package/dist/translate/index.js +150 -0
- package/dist/translate/index.js.map +7 -0
- package/dist/translate/index.min.js +1 -0
- package/dist/translate/index.min.js.map +1 -0
- package/dist/translate/index.mjs +129 -0
- package/dist/translate/index.mjs.map +7 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/deep-freeze.d.ts +3 -0
- package/dist/utils/deep-freeze.d.ts.map +1 -0
- package/dist/utils/getter-setter.d.ts +3 -0
- package/dist/utils/getter-setter.d.ts.map +1 -0
- package/dist/utils/has-changed.d.ts +2 -0
- package/dist/utils/has-changed.d.ts.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +138 -0
- package/dist/utils/index.js.map +7 -0
- package/dist/utils/index.min.js +1 -0
- package/dist/utils/index.min.js.map +1 -0
- package/dist/utils/index.mjs +115 -0
- package/dist/utils/index.mjs.map +7 -0
- package/lib/flux-store/index.ts +301 -0
- package/lib/hooks/index.ts +52 -101
- package/lib/index.ts +479 -719
- package/lib/native-store/index.ts +106 -0
- package/lib/node/index.ts +5 -3
- package/lib/node/utils/icons.ts +5 -5
- package/lib/node/utils/inline.ts +17 -17
- package/lib/node/utils/node.sw.js +152 -0
- package/lib/node/utils/session-storage.ts +117 -0
- package/lib/node/utils/sw.ts +35 -11
- package/lib/node/utils/tree-adapter.ts +99 -52
- package/lib/pulse-store/index.ts +181 -0
- package/lib/request/index.ts +86 -116
- package/lib/router/index.ts +358 -170
- package/lib/signals/index.ts +98 -0
- package/lib/suspense/index.ts +57 -0
- package/lib/translate/index.ts +156 -0
- package/lib/utils/deep-freeze.ts +54 -0
- package/lib/utils/getter-setter.ts +40 -0
- package/lib/utils/has-changed.ts +43 -0
- package/lib/utils/index.ts +3 -0
- package/package.json +38 -50
- package/tsconfig.json +1 -1
- package/dist/dataset/index.d.ts +0 -24
- package/dist/dataset/index.d.ts.map +0 -1
- package/dist/dataset/index.js +0 -178
- package/dist/dataset/index.js.map +0 -7
- package/dist/dataset/index.mjs +0 -157
- package/dist/dataset/index.mjs.map +0 -7
- package/dist/node/node.sw.tpl +0 -133
- package/dist/node/utils/node.sw.tpl +0 -133
- package/dist/proxy-signal/index.d.ts +0 -23
- package/dist/proxy-signal/index.d.ts.map +0 -1
- package/dist/proxy-signal/index.js +0 -138
- package/dist/proxy-signal/index.js.map +0 -7
- package/dist/proxy-signal/index.mjs +0 -117
- package/dist/proxy-signal/index.mjs.map +0 -7
- package/dist/signal/index.d.ts +0 -20
- package/dist/signal/index.d.ts.map +0 -1
- package/dist/signal/index.js +0 -95
- package/dist/signal/index.js.map +0 -7
- package/dist/signal/index.mjs +0 -74
- package/dist/signal/index.mjs.map +0 -7
- package/dist/store/index.d.ts +0 -16
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -93
- package/dist/store/index.js.map +0 -7
- package/dist/store/index.mjs +0 -72
- package/dist/store/index.mjs.map +0 -7
- package/lib/dataset/index.ts +0 -193
- package/lib/index.d.ts +0 -0
- package/lib/interfaces.ts.bak +0 -141
- package/lib/node/utils/node.sw.tpl +0 -133
- package/lib/proxy-signal/index.ts +0 -187
- package/lib/signal/index.ts +0 -161
- package/lib/store/index.ts +0 -101
package/dist/request/index.js
CHANGED
|
@@ -24,34 +24,44 @@ __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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
35
|
-
|
|
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
|
|
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
|
|
54
|
+
return new URL(u, options.urls.node);
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
|
-
|
|
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) {
|
|
54
|
-
|
|
64
|
+
const url = baseUrl.replace(/\/$/gi, "").trim();
|
|
55
65
|
if (!options.urls) {
|
|
56
66
|
options.urls = {
|
|
57
67
|
base: "",
|
|
@@ -62,7 +72,7 @@ function Requester(baseUrl = "", options = defaultOptions) {
|
|
|
62
72
|
if (!options.allowedMethods) {
|
|
63
73
|
options.allowedMethods = defaultOptions.allowedMethods;
|
|
64
74
|
}
|
|
65
|
-
|
|
75
|
+
const opts = {
|
|
66
76
|
...options,
|
|
67
77
|
urls: {
|
|
68
78
|
node: options.urls.node || null,
|
|
@@ -71,46 +81,40 @@ function Requester(baseUrl = "", options = defaultOptions) {
|
|
|
71
81
|
}
|
|
72
82
|
};
|
|
73
83
|
const request2 = async function request3(method, url2, data, options2 = {}) {
|
|
74
|
-
|
|
84
|
+
const innerOptions = {
|
|
75
85
|
method: method.toUpperCase(),
|
|
76
86
|
headers: {},
|
|
77
87
|
resolveWithFullResponse: false,
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
if (innerOptions.allowedMethods.
|
|
87
|
-
throw new Error(
|
|
95
|
+
const acceptType = innerOptions.headers.Accept;
|
|
96
|
+
const contentType = innerOptions.headers["Content-Type"] || innerOptions.headers["content-type"] || "";
|
|
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
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
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 (let 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
|
-
|
|
114
|
+
const response = await fetch(finalUrl.toString(), innerOptions);
|
|
111
115
|
let body = null;
|
|
112
116
|
if (!response.ok) {
|
|
113
|
-
|
|
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
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
let next;
|
|
147
|
-
while (parsed.length) {
|
|
148
|
-
next = parsed.shift();
|
|
149
|
-
let nextIsArray = next.indexOf("[") > -1;
|
|
150
|
-
if (nextIsArray) {
|
|
151
|
-
let 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 (
|
|
167
|
-
return opts;
|
|
168
|
-
}
|
|
169
|
-
let result = opts;
|
|
170
|
-
let parsed = key.split(".");
|
|
171
|
-
let next;
|
|
172
|
-
while (parsed.length) {
|
|
173
|
-
next = parsed.shift();
|
|
174
|
-
let nextIsArray = next.indexOf("[") > -1;
|
|
175
|
-
if (nextIsArray) {
|
|
176
|
-
let 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
|
-
|
|
190
|
-
|
|
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 = \"\"):
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB;AAqDzB,SAAS,UAAU,KAA0B,SAAiB,
|
|
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>, 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 = \"\"): 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>,\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>, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1ZXN0X2V4cG9ydHMiLCJfX2V4cG9ydCIsInJlcXVlc3QiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJzZXJpYWxpemUiLCJvYmoiLCJwcmVmaXgiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsInByb3AiLCJrZXkiLCJhcHBlbmQiLCJ0b1N0cmluZyIsImRlZmF1bHRPcHRpb25zIiwiYWxsb3dlZE1ldGhvZHMiLCJSZXF1ZXN0ZXIiLCJiYXNlVXJsIiwib3B0aW9ucyIsInVybCIsInJlcGxhY2UiLCJ0cmltIiwidXJscyIsImJhc2UiLCJub2RlIiwiYXBpIiwib3B0cyIsImFzeW5jIiwibWV0aG9kIiwiZGF0YSIsImlubmVyT3B0aW9ucyIsInRvVXBwZXJDYXNlIiwiaGVhZGVycyIsInJlc29sdmVXaXRoRnVsbFJlc3BvbnNlIiwiQWNjZXB0IiwiYWNjZXB0VHlwZSIsImNvbnRlbnRUeXBlIiwiaW5jbHVkZXMiLCJFcnJvciIsImpvaW4iLCJmaW5hbFVybCIsInVybFdpdGhvdXRTbGFzaCIsInUiLCJ0ZXN0IiwiaXNOb2RlSnMiLCJVUkwiLCJwYXJzZVVybCIsImVycm9yIiwiaXNKc29uIiwic2VhcmNoIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlbnRyaWVzIiwicmVkdWNlIiwiZmQiLCJ2YWx1ZSIsIkZvcm1EYXRhIiwic2VyaWFsaXplRm9ybURhdGEiLCJyZXNwb25zZSIsImZldGNoIiwib2siLCJlcnIiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwidGV4dCIsImpzb24iLCJjb25zb2xlIiwid2FybiIsImJsb2IiLCJhcnJheUJ1ZmZlciIsIm5ldyIsInNldE9wdGlvbiIsInNldCIsImdldE9wdGlvbnMiLCJnZXQiLCJhc3NpZ24iLCJhY2MiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcmVxdWVzdC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGVKcyB9IGZyb20gXCJ2YWx5cmlhbi5qc1wiO1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tIFwidmFseXJpYW4uanMvdXRpbHNcIjtcblxuaW50ZXJmYWNlIFVybE9wdGlvbnMge1xuICBiYXNlOiBzdHJpbmc7IC8vIFVzZWQgdG8gcHJlZml4IHRoZSB1cmwgZm9yIHNjb3BlZCByZXF1ZXN0cy5cbiAgbm9kZTogc3RyaW5nIHwgbnVsbDsgLy8gVXNlZCB0byByZWRpcmVjdCBsb2NhbCByZXF1ZXN0cyB0byBub2RlIHNlcnZlciBmb3Igc2VydmVyIHNpZGUgcmVuZGVyaW5nLlxuICBhcGk6IHN0cmluZyB8IG51bGw7IC8vIFVzZWQgdG8gcmVkaXJlY3QgYXBpIHJlcXVlc3RzIHRvIG5vZGUgc2VydmVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcuXG59XG5cbmludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIGFsbG93ZWRNZXRob2RzPzogc3RyaW5nW107XG4gIHVybHM/OiBVcmxPcHRpb25zO1xuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0T3B0aW9uc1dpdGhVcmxzIGV4dGVuZHMgUmVxdWVzdE9wdGlvbnMge1xuICB1cmxzOiBVcmxPcHRpb25zO1xuICBhbGxvd2VkTWV0aG9kczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZW5kT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RPcHRpb25zV2l0aFVybHMsIFJlcXVlc3RJbml0IHtcbiAgYWxsb3dlZE1ldGhvZHM6IHN0cmluZ1tdO1xuICBtZXRob2Q6IHN0cmluZztcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnRlcmZhY2Uge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBQYXJ0aWFsPFNlbmRPcHRpb25zPik6IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgbmV3OiAoYmFzZVVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpID0+IFJlcXVlc3RJbnRlcmZhY2U7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBzZXRPcHRpb25zOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBnZXRPcHRpb25zOiAoa2V5Pzogc3RyaW5nKSA9PiBSZXF1ZXN0T3B0aW9ucyB8IHZvaWQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBnZXQ6ICh1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHBvc3Q6ICh1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHB1dDogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcGF0Y2g6ICh1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkgfCBSZXNwb25zZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGRlbGV0ZTogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgaGVhZDogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgb3B0aW9uczogKHVybDogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSB8IFJlc3BvbnNlO1xuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbi8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuIG9iamVjdCBpbnRvIGEgcXVlcnkgc3RyaW5nLlxuZnVuY3Rpb24gc2VyaWFsaXplKG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcHJlZml4OiBzdHJpbmcgPSBcIlwiKTogVVJMU2VhcmNoUGFyYW1zIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgocHJvcDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fVske3Byb3B9XWAgOiBwcm9wO1xuICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBwYXJhbXMuYXBwZW5kKGtleSwgc2VyaWFsaXplKG9ialtwcm9wXSwga2V5KS50b1N0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLmFwcGVuZChrZXksIG9ialtwcm9wXSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVGb3JtRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogRm9ybURhdGEge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZGF0YSkucmVkdWNlKChmZCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgZmQuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBmZDtcbiAgfSwgbmV3IEZvcm1EYXRhKCkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVVybCh1cmw6IHN0cmluZywgb3B0aW9uczogUmVxdWVzdE9wdGlvbnNXaXRoVXJscykge1xuICBjb25zdCB1cmxXaXRob3V0U2xhc2ggPSB1cmwucmVwbGFjZSgvXFwvKyQvLCBcIlwiKS50cmltKCk7XG4gIGNvbnN0IHUgPSAvXmh0dHBzPy9naS50ZXN0KHVybFdpdGhvdXRTbGFzaCkgPyB1cmxXaXRob3V0U2xhc2ggOiBgJHtvcHRpb25zLnVybHMuYmFzZX0ke3VybFdpdGhvdXRTbGFzaH1gO1xuXG4gIGlmIChpc05vZGVKcyAmJiB0eXBlb2Ygb3B0aW9ucy51cmxzLm5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudXJscy5hcGkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKHUucmVwbGFjZShvcHRpb25zLnVybHMuYXBpLCBvcHRpb25zLnVybHMubm9kZSkpO1xuICAgIH1cblxuICAgIGlmICghL15odHRwcz8vZ2kudGVzdCh1KSkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwodSwgb3B0aW9ucy51cmxzLm5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICgvXmh0dHBzPy9naS50ZXN0KHUpKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFVSTCh1LCBvcHRpb25zLnVybHMuYmFzZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHsgYWxsb3dlZE1ldGhvZHM6IFtcImdldFwiLCBcInBvc3RcIiwgXCJwdXRcIiwgXCJwYXRjaFwiLCBcImRlbGV0ZVwiLCBcImhlYWRcIiwgXCJvcHRpb25zXCJdIH07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG5mdW5jdGlvbiBSZXF1ZXN0ZXIoYmFzZVVybCA9IFwiXCIsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0gZGVmYXVsdE9wdGlvbnMpIHtcbiAgY29uc3QgdXJsID0gYmFzZVVybC5yZXBsYWNlKC9cXC8kL2dpLCBcIlwiKS50cmltKCk7XG4gIGlmICghb3B0aW9ucy51cmxzKSB7XG4gICAgb3B0aW9ucy51cmxzID0ge1xuICAgICAgYmFzZTogXCJcIixcbiAgICAgIG5vZGU6IG51bGwsXG4gICAgICBhcGk6IG51bGxcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFvcHRpb25zLmFsbG93ZWRNZXRob2RzKSB7XG4gICAgb3B0aW9ucy5hbGxvd2VkTWV0aG9kcyA9IGRlZmF1bHRPcHRpb25zLmFsbG93ZWRNZXRob2RzO1xuICB9XG5cbiAgY29uc3Qgb3B0czogUmVxdWVzdE9wdGlvbnNXaXRoVXJscyA9IHtcbiAgICAuLi4ob3B0aW9ucyBhcyBSZXF1ZXN0T3B0aW9uc1dpdGhVcmxzKSxcbiAgICB1cmxzOiB7XG4gICAgICBub2RlOiBvcHRpb25zLnVybHMubm9kZSB8fCBudWxsLFxuICAgICAgYXBpOiBvcHRpb25zLnVybHMuYXBpIHx8IG51bGwsXG4gICAgICBiYXNlOiBvcHRpb25zLnVybHMuYmFzZSA/IG9wdGlvbnMudXJscy5iYXNlICsgdXJsIDogdXJsXG4gICAgfVxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IHJlcXVlc3QgPSBhc3luYyBmdW5jdGlvbiByZXF1ZXN0KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICApIHtcbiAgICBjb25zdCBpbm5lck9wdGlvbnM6IFNlbmRPcHRpb25zID0ge1xuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9IGFzIFNlbmRPcHRpb25zO1xuXG4gICAgaW5uZXJPcHRpb25zLmhlYWRlcnMgPSB7IC4uLmlubmVyT3B0aW9ucy5oZWFkZXJzLCAuLi5vcHRzLmhlYWRlcnMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gICAgaWYgKCFpbm5lck9wdGlvbnMuaGVhZGVycy5BY2NlcHQpIHtcbiAgICAgIGlubmVyT3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2VwdFR5cGUgPSBpbm5lck9wdGlvbnMuaGVhZGVycy5BY2NlcHQ7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBpbm5lck9wdGlvbnMuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSB8fCBpbm5lck9wdGlvbnMuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSB8fCBcIlwiO1xuXG4gICAgaWYgKCFpbm5lck9wdGlvbnMuYWxsb3dlZE1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRob2QgJHttZXRob2R9IG5vdCBhbGxvd2VkLiBBbGxvd2VkIG1ldGhvZHM6ICR7aW5uZXJPcHRpb25zLmFsbG93ZWRNZXRob2RzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgZmluYWxVcmw6IFVSTDtcbiAgICB0cnkge1xuICAgICAgZmluYWxVcmwgPSBwYXJzZVVybCh1cmwsIG9wdHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBVUkw6ICR7dXJsfWApO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBjb25zdCBpc0pzb24gPSAvanNvbi9naS50ZXN0KGNvbnRlbnRUeXBlKTtcblxuICAgICAgaWYgKGlubmVyT3B0aW9ucy5tZXRob2QgPT09IFwiR0VUXCIgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZmluYWxVcmwuc2VhcmNoID0gc2VyaWFsaXplKGRhdGEpLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKGlubmVyT3B0aW9ucy5tZXRob2QgIT09IFwiR0VUXCIpIHtcbiAgICAgICAgaW5uZXJPcHRpb25zLmJvZHkgPSBpc0pzb24gPyBKU09OLnN0cmluZ2lmeShkYXRhKSA6IHNlcmlhbGl6ZUZvcm1EYXRhKGRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmluYWxVcmwudG9TdHJpbmcoKSwgaW5uZXJPcHRpb25zKTtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKSBhcyBFcnJvciAmIHsgcmVzcG9uc2U/OiBhbnk7IGJvZHk/OiBhbnkgfTtcbiAgICAgIGVyci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKC90ZXh0L2dpLnRlc3QoYWNjZXB0VHlwZSkpIHtcbiAgICAgICAgZXJyLmJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgvanNvbi9naS50ZXN0KGFjY2VwdFR5cGUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXJyLmJvZHkgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyLmJvZHkgPSBudWxsO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlubmVyT3B0aW9ucy5yZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGlmICgvdGV4dC9naS50ZXN0KGFjY2VwdFR5cGUpKSB7XG4gICAgICBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gZWxzZSBpZiAoL2pzb24vZ2kudGVzdChhY2NlcHRUeXBlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlOlwiLCBlcnJvcik7XG4gICAgICAgIGJvZHkgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL2Jsb2IvZ2kudGVzdChhY2NlcHRUeXBlKSkge1xuICAgICAgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcbiAgICB9IGVsc2UgaWYgKC9hcnJheWJ1ZmZlci9naS50ZXN0KGFjY2VwdFR5cGUpKSB7XG4gICAgICBib2R5ID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keSA9IHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJldHVybiBib2R5IHx8IHJlc3BvbnNlO1xuICB9IGFzIHVua25vd24gYXMgUmVxdWVzdEludGVyZmFjZTtcblxuICByZXF1ZXN0Lm5ldyA9IChiYXNlVXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykgPT4gUmVxdWVzdGVyKGJhc2VVcmwsIHsgLi4ub3B0cywgLi4uKG9wdGlvbnMgfHwge30pIH0pO1xuXG4gIHJlcXVlc3Quc2V0T3B0aW9uID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgc2V0KG9wdHMsIGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBvcHRzO1xuICB9O1xuXG4gIHJlcXVlc3QuZ2V0T3B0aW9ucyA9IChrZXk/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KG9wdHMsIGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdHM7XG4gIH07XG5cbiAgT2JqZWN0LmFzc2lnbihcbiAgICByZXF1ZXN0LFxuICAgIG9wdHMuYWxsb3dlZE1ldGhvZHMucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIG1ldGhvZCkgPT4ge1xuICAgICAgYWNjW21ldGhvZF0gPSAodXJsOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT5cbiAgICAgICAgcmVxdWVzdChtZXRob2QsIHVybCwgZGF0YSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KVxuICApO1xuXG4gIHJldHVybiByZXF1ZXN0O1xufVxu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
|
package/dist/request/index.mjs
CHANGED
|
@@ -1,33 +1,43 @@
|
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
30
|
+
return new URL(u, options.urls.node);
|
|
24
31
|
}
|
|
25
32
|
}
|
|
26
|
-
|
|
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) {
|
|
30
|
-
|
|
40
|
+
const url = baseUrl.replace(/\/$/gi, "").trim();
|
|
31
41
|
if (!options.urls) {
|
|
32
42
|
options.urls = {
|
|
33
43
|
base: "",
|
|
@@ -38,7 +48,7 @@ function Requester(baseUrl = "", options = defaultOptions) {
|
|
|
38
48
|
if (!options.allowedMethods) {
|
|
39
49
|
options.allowedMethods = defaultOptions.allowedMethods;
|
|
40
50
|
}
|
|
41
|
-
|
|
51
|
+
const opts = {
|
|
42
52
|
...options,
|
|
43
53
|
urls: {
|
|
44
54
|
node: options.urls.node || null,
|
|
@@ -47,46 +57,40 @@ function Requester(baseUrl = "", options = defaultOptions) {
|
|
|
47
57
|
}
|
|
48
58
|
};
|
|
49
59
|
const request2 = async function request3(method, url2, data, options2 = {}) {
|
|
50
|
-
|
|
60
|
+
const innerOptions = {
|
|
51
61
|
method: method.toUpperCase(),
|
|
52
62
|
headers: {},
|
|
53
63
|
resolveWithFullResponse: false,
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
if (innerOptions.allowedMethods.
|
|
63
|
-
throw new Error(
|
|
71
|
+
const acceptType = innerOptions.headers.Accept;
|
|
72
|
+
const contentType = innerOptions.headers["Content-Type"] || innerOptions.headers["content-type"] || "";
|
|
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
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
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 (let 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
|
-
|
|
90
|
+
const response = await fetch(finalUrl.toString(), innerOptions);
|
|
87
91
|
let body = null;
|
|
88
92
|
if (!response.ok) {
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
let next;
|
|
123
|
-
while (parsed.length) {
|
|
124
|
-
next = parsed.shift();
|
|
125
|
-
let nextIsArray = next.indexOf("[") > -1;
|
|
126
|
-
if (nextIsArray) {
|
|
127
|
-
let 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 (
|
|
143
|
-
return opts;
|
|
144
|
-
}
|
|
145
|
-
let result = opts;
|
|
146
|
-
let parsed = key.split(".");
|
|
147
|
-
let next;
|
|
148
|
-
while (parsed.length) {
|
|
149
|
-
next = parsed.shift();
|
|
150
|
-
let nextIsArray = next.indexOf("[") > -1;
|
|
151
|
-
if (nextIsArray) {
|
|
152
|
-
let 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
|
-
|
|
166
|
-
|
|
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
|
}
|