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.
- 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 +267 -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 +246 -0
- package/dist/flux-store/index.mjs.map +7 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +35 -51
- package/dist/hooks/index.js.map +3 -3
- package/dist/hooks/index.min.js +1 -0
- package/dist/hooks/index.min.js.map +1 -0
- package/dist/hooks/index.mjs +36 -52
- package/dist/hooks/index.mjs.map +3 -3
- package/dist/index.d.ts +18 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -88
- 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 +107 -88
- 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 +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +125 -10
- package/dist/node/index.js.map +4 -4
- package/dist/node/index.mjs +125 -10
- package/dist/node/index.mjs.map +4 -4
- package/dist/node/node.sw.js +152 -0
- package/dist/node/utils/icons.d.ts +4 -5
- package/dist/node/utils/icons.d.ts.map +1 -1
- package/dist/node/utils/inline.d.ts +1 -1
- 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 +5 -1
- package/dist/node/utils/tree-adapter.d.ts.map +1 -1
- package/dist/pulse-store/index.d.ts +16 -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 +11 -11
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +63 -84
- 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 +63 -84
- package/dist/request/index.mjs.map +2 -2
- package/dist/router/index.d.ts +36 -33
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +247 -96
- 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 +247 -96
- 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 +312 -0
- package/lib/hooks/index.ts +39 -57
- package/lib/index.ts +135 -118
- package/lib/native-store/index.ts +106 -0
- package/lib/node/index.ts +3 -1
- package/lib/node/utils/icons.ts +4 -4
- package/lib/node/utils/inline.ts +2 -0
- package/lib/node/utils/node.sw.js +152 -0
- package/lib/node/utils/session-storage.ts +117 -0
- package/lib/node/utils/sw.ts +34 -10
- package/lib/node/utils/tree-adapter.ts +19 -1
- package/lib/pulse-store/index.ts +188 -0
- package/lib/request/index.ts +92 -122
- package/lib/router/index.ts +353 -164
- 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 +40 -57
- package/tsconfig.json +5 -4
- 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 -9
- package/dist/signal/index.d.ts.map +0 -1
- package/dist/signal/index.js +0 -76
- package/dist/signal/index.js.map +0 -7
- package/dist/signal/index.mjs +0 -55
- 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/node/utils/node.sw.tpl +0 -133
- package/lib/proxy-signal/index.ts +0 -187
- package/lib/signal/index.ts +0 -86
- package/lib/store/index.ts +0 -101
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"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"}
|
package/dist/request/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
const
|
|
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) {
|
|
@@ -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.
|
|
87
|
-
throw new Error(
|
|
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 (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(
|
|
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
|
-
|
|
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
|
-
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 (
|
|
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
|
-
|
|
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
|
|
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> | 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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
|
package/dist/request/index.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
const
|
|
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) {
|
|
@@ -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.
|
|
63
|
-
throw new Error(
|
|
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 (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(
|
|
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
|
-
|
|
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
|
-
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 (
|
|
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
|
-
|
|
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
|
}
|