@randajan/api-kit 2.0.0 → 3.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 +332 -72
- package/dist/cjs/client/index.cjs +236 -199
- package/dist/cjs/client/index.cjs.map +4 -4
- package/dist/cjs/index.cjs +263 -208
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/server/index.cjs +102 -56
- package/dist/cjs/server/index.cjs.map +4 -4
- package/dist/esm/chunk-4NYBELZF.js +309 -0
- package/dist/esm/chunk-4NYBELZF.js.map +7 -0
- package/dist/esm/{chunk-72RXZFQZ.js → chunk-IUVT7Q4N.js} +24 -6
- package/dist/esm/chunk-IUVT7Q4N.js.map +7 -0
- package/dist/esm/{chunk-7K2N7A5V.js → chunk-K7ZQO3VB.js} +97 -87
- package/dist/esm/chunk-K7ZQO3VB.js.map +7 -0
- package/dist/esm/client/index.mjs +4 -4
- package/dist/esm/index.mjs +7 -5
- package/dist/esm/server/index.mjs +4 -4
- package/package.json +1 -1
- package/dist/esm/chunk-72RXZFQZ.js.map +0 -7
- package/dist/esm/chunk-7K2N7A5V.js.map +0 -7
- package/dist/esm/chunk-CYUBH2V3.js +0 -280
- package/dist/esm/chunk-CYUBH2V3.js.map +0 -7
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FetchError,
|
|
3
|
+
Functionable,
|
|
4
|
+
HttpError,
|
|
5
|
+
__export,
|
|
6
|
+
configTrait,
|
|
7
|
+
end,
|
|
8
|
+
info,
|
|
9
|
+
info_default,
|
|
10
|
+
isFn,
|
|
11
|
+
mrgObj,
|
|
12
|
+
mrgStr,
|
|
13
|
+
start,
|
|
14
|
+
toStr
|
|
15
|
+
} from "./chunk-K7ZQO3VB.js";
|
|
16
|
+
|
|
17
|
+
// src/client/class/static.js
|
|
18
|
+
import { solid } from "@randajan/props";
|
|
19
|
+
|
|
20
|
+
// src/arc/types/kinds/json.js
|
|
21
|
+
var json_exports = {};
|
|
22
|
+
__export(json_exports, {
|
|
23
|
+
decode: () => decode,
|
|
24
|
+
encode: () => encode,
|
|
25
|
+
mime: () => mime
|
|
26
|
+
});
|
|
27
|
+
var mime = "application/json";
|
|
28
|
+
var decode = (body) => JSON.parse(body);
|
|
29
|
+
var encode = (body) => JSON.stringify(body);
|
|
30
|
+
|
|
31
|
+
// src/arc/types/kinds/form.js
|
|
32
|
+
var form_exports = {};
|
|
33
|
+
__export(form_exports, {
|
|
34
|
+
decode: () => decode2,
|
|
35
|
+
encode: () => encode2,
|
|
36
|
+
mime: () => mime2
|
|
37
|
+
});
|
|
38
|
+
var mime2 = "application/x-www-form-urlencoded";
|
|
39
|
+
var decode2 = (body) => Object.fromEntries(new URLSearchParams(body));
|
|
40
|
+
var encode2 = (body) => new URLSearchParams(body);
|
|
41
|
+
|
|
42
|
+
// src/arc/types/index.js
|
|
43
|
+
var _types = { json: json_exports, form: form_exports };
|
|
44
|
+
var joinTypeNames = (types = {}) => {
|
|
45
|
+
const native = Object.keys(_types);
|
|
46
|
+
const custom = typeof types === "object" ? Object.keys(types) : [];
|
|
47
|
+
return `'${[.../* @__PURE__ */ new Set([...native, ...custom])].join("', '")}'`;
|
|
48
|
+
};
|
|
49
|
+
var getType = (propertyName, reqFnName, opt) => {
|
|
50
|
+
const tn = opt[propertyName] || opt.type;
|
|
51
|
+
if (!tn) {
|
|
52
|
+
return json_exports;
|
|
53
|
+
}
|
|
54
|
+
const customType = opt.types?.[tn];
|
|
55
|
+
const type = customType || _types[tn];
|
|
56
|
+
if (!type) {
|
|
57
|
+
throw new Error(`Unknown config.${propertyName} '${tn}'. Must be one of: ${joinTypeNames(opt.types)}`);
|
|
58
|
+
}
|
|
59
|
+
if (!customType) {
|
|
60
|
+
return type;
|
|
61
|
+
}
|
|
62
|
+
if (!type.mime || typeof type.mime !== "string") {
|
|
63
|
+
throw new Error(`Type definition '${tn}' requires 'mime' to be a string`);
|
|
64
|
+
}
|
|
65
|
+
if (!isFn(type[reqFnName])) {
|
|
66
|
+
throw new Error(`Type definition '${tn}' requires '${reqFnName}' to be a function`);
|
|
67
|
+
}
|
|
68
|
+
return type;
|
|
69
|
+
};
|
|
70
|
+
var encodeBody = (opt) => {
|
|
71
|
+
const type = getType("requestType", "encode", opt);
|
|
72
|
+
opt.headers["Content-Type"] = type.mime;
|
|
73
|
+
opt.body = type.encode(opt.body);
|
|
74
|
+
};
|
|
75
|
+
var attachBodyDecoder = (opt) => {
|
|
76
|
+
const type = getType("responseType", "decode", opt);
|
|
77
|
+
opt.headers["Accept"] = type.mime;
|
|
78
|
+
opt.decodeBody = type.decode;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// src/client/url.js
|
|
82
|
+
var _regexp = /^https?:\/\//i;
|
|
83
|
+
var buildUrl = (inputUrl, params) => {
|
|
84
|
+
if (!params) {
|
|
85
|
+
return inputUrl;
|
|
86
|
+
}
|
|
87
|
+
const hasHost = _regexp.test(inputUrl);
|
|
88
|
+
const url = new URL(inputUrl, hasHost ? void 0 : "http://thisisonlyplaceholder.xyz");
|
|
89
|
+
url.hash = "";
|
|
90
|
+
for (const [key, value] of Object.entries(params)) {
|
|
91
|
+
if (value != null) {
|
|
92
|
+
url.searchParams.append(key, value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
;
|
|
96
|
+
return hasHost ? url.toString() : url.pathname + url.search;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// src/client/tool.js
|
|
100
|
+
var diffVersion = (version) => {
|
|
101
|
+
const v1 = toStr(info.version);
|
|
102
|
+
const v2 = toStr(version);
|
|
103
|
+
if (v1 === v2) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const f1 = v1.split(".");
|
|
107
|
+
const f2 = v2.split(".");
|
|
108
|
+
if (f1[0] !== f2[0]) {
|
|
109
|
+
return "major";
|
|
110
|
+
}
|
|
111
|
+
if (f1[1] !== f2[1]) {
|
|
112
|
+
return "minor";
|
|
113
|
+
}
|
|
114
|
+
if (f1[2] !== f2[2]) {
|
|
115
|
+
return "patch";
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
var failedError = (cause) => FetchError.code(1, "Failed", { cause });
|
|
119
|
+
var timeoutError = (_) => FetchError.code(2, "Timeout");
|
|
120
|
+
var abortError = (_) => FetchError.code(3, "Aborted");
|
|
121
|
+
var statusError = (resp) => HttpError.code(4, resp.statusText, resp.status, { exposeCause: true });
|
|
122
|
+
var unreadableError = (resp, cause) => resp.ok ? FetchError.code(5, "Unreadable", { cause }) : statusError(resp);
|
|
123
|
+
var undecodableError = (resp, cause, detail) => resp.ok ? FetchError.code(6, "Undecodable", { cause, detail }) : statusError(resp);
|
|
124
|
+
var parseHeaders = (resp, opt) => {
|
|
125
|
+
if (!resp || !opt.parseHeaders) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
return Object.freeze(Object.fromEntries(resp.headers.entries()));
|
|
129
|
+
};
|
|
130
|
+
var readText = async (resp) => {
|
|
131
|
+
try {
|
|
132
|
+
return await resp.text();
|
|
133
|
+
} catch (err) {
|
|
134
|
+
throw unreadableError(resp, err);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
var decodeText = (resp, opt, text) => {
|
|
138
|
+
try {
|
|
139
|
+
return opt.decodeBody(text);
|
|
140
|
+
} catch (err) {
|
|
141
|
+
throw undecodableError(resp, err, text);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
var normalizeClientError = (any, opt) => {
|
|
145
|
+
let err = any;
|
|
146
|
+
if (!FetchError.is(err)) {
|
|
147
|
+
let custom = isFn(opt.normalizeError);
|
|
148
|
+
if (custom) {
|
|
149
|
+
try {
|
|
150
|
+
err = opt.normalizeError(err, opt);
|
|
151
|
+
} catch {
|
|
152
|
+
custom = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!custom || !FetchError.is(err)) {
|
|
156
|
+
err = FetchError.code(0, "Unknown", { cause: any });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return err.rise(0).rise(0);
|
|
160
|
+
};
|
|
161
|
+
var reconstructApiError = (remoteErr) => {
|
|
162
|
+
if (!remoteErr) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const { message, code, httpStatusCode, cause, detail } = remoteErr;
|
|
166
|
+
return HttpError.code(code, message, httpStatusCode, { cause, detail, exposeCause: true });
|
|
167
|
+
};
|
|
168
|
+
var mrgOpt = (a, b) => {
|
|
169
|
+
const opt = mrgObj(a, b);
|
|
170
|
+
opt.body = mrgObj(a?.body, b?.body);
|
|
171
|
+
opt.params = mrgObj(a?.params, b?.params);
|
|
172
|
+
opt.headers = mrgObj(a?.headers, b?.headers, {});
|
|
173
|
+
return opt;
|
|
174
|
+
};
|
|
175
|
+
var prepareOpt = (url, opt, method) => {
|
|
176
|
+
start(opt);
|
|
177
|
+
opt.url = buildUrl(mrgStr(opt.url, url), opt.params);
|
|
178
|
+
if (method) {
|
|
179
|
+
opt.method = method;
|
|
180
|
+
}
|
|
181
|
+
if (opt.body) {
|
|
182
|
+
encodeBody(opt);
|
|
183
|
+
}
|
|
184
|
+
attachBodyDecoder(opt);
|
|
185
|
+
const hasTimeout = opt.timeout > 0;
|
|
186
|
+
if (opt.isAbortable || hasTimeout) {
|
|
187
|
+
opt.abortController = new AbortController();
|
|
188
|
+
opt.signal = opt.abortController.signal;
|
|
189
|
+
}
|
|
190
|
+
if (hasTimeout) {
|
|
191
|
+
opt.timeoutId = setTimeout(() => opt.abortController?.abort(timeoutError()), opt.timeout);
|
|
192
|
+
}
|
|
193
|
+
if (isFn(opt.trait)) {
|
|
194
|
+
opt = opt.trait(opt) || opt;
|
|
195
|
+
}
|
|
196
|
+
return opt;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// src/client/class/static.js
|
|
200
|
+
var localReject = (err, opt) => ({ error: normalizeClientError(FetchError.is(err) ? err : failedError(err), opt) });
|
|
201
|
+
var remoteReject = (err, opt) => ({ isRemote: true, error: normalizeClientError(err, opt) });
|
|
202
|
+
var remoteResolve = async (resp, opt) => {
|
|
203
|
+
const text = await readText(resp);
|
|
204
|
+
if (!text) {
|
|
205
|
+
if (resp.ok || resp.status === 304) {
|
|
206
|
+
return { isRemote: true };
|
|
207
|
+
}
|
|
208
|
+
throw statusError(resp);
|
|
209
|
+
}
|
|
210
|
+
const body = decodeText(resp, opt, text);
|
|
211
|
+
const ver = body?.[info_default.name];
|
|
212
|
+
if (!ver) {
|
|
213
|
+
if (resp.ok) {
|
|
214
|
+
return { isRemote: true, result: body };
|
|
215
|
+
}
|
|
216
|
+
throw statusError(resp);
|
|
217
|
+
}
|
|
218
|
+
body.isRemote = true;
|
|
219
|
+
body.isApiKit = true;
|
|
220
|
+
body.apiKitDiff = diffVersion(ver);
|
|
221
|
+
body.error = reconstructApiError(body.error);
|
|
222
|
+
return body;
|
|
223
|
+
};
|
|
224
|
+
var fetchBody = async (_fetch, opt) => {
|
|
225
|
+
let resp, body;
|
|
226
|
+
try {
|
|
227
|
+
resp = await _fetch(opt.url, opt);
|
|
228
|
+
} catch (err2) {
|
|
229
|
+
body = localReject(err2, opt);
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
body = body || await remoteResolve(resp, opt);
|
|
233
|
+
} catch (err2) {
|
|
234
|
+
body = remoteReject(err2, opt);
|
|
235
|
+
}
|
|
236
|
+
const err = body.error;
|
|
237
|
+
body.isOk = !err;
|
|
238
|
+
body.isRemote = !!body.isRemote;
|
|
239
|
+
body.isApiKit = !!body.isApiKit;
|
|
240
|
+
body.statusCode = err?.httpStatusCode || resp?.status;
|
|
241
|
+
body.headers = parseHeaders(resp, opt);
|
|
242
|
+
body = end(body, opt);
|
|
243
|
+
return opt.resultOnly ? body.result : body;
|
|
244
|
+
};
|
|
245
|
+
var executeFetch = (_fetch, url, opt, method) => {
|
|
246
|
+
opt = prepareOpt(url, opt, method);
|
|
247
|
+
const prom = fetchBody(_fetch, opt);
|
|
248
|
+
if (opt.timeoutId) {
|
|
249
|
+
prom.finally((_) => clearTimeout(opt.timeoutId));
|
|
250
|
+
}
|
|
251
|
+
if (!opt.isAbortable) {
|
|
252
|
+
return prom;
|
|
253
|
+
}
|
|
254
|
+
return solid(prom, "abort", (_) => opt.abortController?.abort(abortError()));
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// src/client/class/Fetch.js
|
|
258
|
+
import { solid as solid2 } from "@randajan/props";
|
|
259
|
+
var Fetch = class _Fetch extends Functionable {
|
|
260
|
+
static create(config = {}) {
|
|
261
|
+
return new _Fetch(config);
|
|
262
|
+
}
|
|
263
|
+
constructor(config = {}) {
|
|
264
|
+
const _fetch = config.fetch || globalThis.fetch;
|
|
265
|
+
if (!_fetch) {
|
|
266
|
+
throw new Error("Missing fetch function. Please provide it in config");
|
|
267
|
+
}
|
|
268
|
+
configTrait(config);
|
|
269
|
+
delete config.fetch;
|
|
270
|
+
super((url, opt, method) => executeFetch(_fetch, url, mrgOpt(config, opt), method));
|
|
271
|
+
Object.freeze(config);
|
|
272
|
+
solid2(this, "config", config);
|
|
273
|
+
}
|
|
274
|
+
extend(config) {
|
|
275
|
+
return new _Fetch(mrgOpt(this.config, config));
|
|
276
|
+
}
|
|
277
|
+
get(url, opt) {
|
|
278
|
+
return this(url, opt, "GET");
|
|
279
|
+
}
|
|
280
|
+
post(url, opt) {
|
|
281
|
+
return this(url, opt, "POST");
|
|
282
|
+
}
|
|
283
|
+
put(url, opt) {
|
|
284
|
+
return this(url, opt, "PUT");
|
|
285
|
+
}
|
|
286
|
+
delete(url, opt) {
|
|
287
|
+
return this(url, opt, "DELETE");
|
|
288
|
+
}
|
|
289
|
+
patch(url, opt) {
|
|
290
|
+
return this(url, opt, "PATCH");
|
|
291
|
+
}
|
|
292
|
+
head(url, opt) {
|
|
293
|
+
return this(url, opt, "HEAD");
|
|
294
|
+
}
|
|
295
|
+
options(url, opt) {
|
|
296
|
+
return this(url, opt, "OPTIONS");
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
// src/client/index.js
|
|
301
|
+
var createFetch = Fetch.create;
|
|
302
|
+
var client_default = createFetch;
|
|
303
|
+
|
|
304
|
+
export {
|
|
305
|
+
Fetch,
|
|
306
|
+
createFetch,
|
|
307
|
+
client_default
|
|
308
|
+
};
|
|
309
|
+
//# sourceMappingURL=chunk-4NYBELZF.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client/class/static.js", "../../src/arc/types/kinds/json.js", "../../src/arc/types/kinds/form.js", "../../src/arc/types/index.js", "../../src/client/url.js", "../../src/client/tool.js", "../../src/client/class/Fetch.js", "../../src/client/index.js"],
|
|
4
|
+
"sourcesContent": ["import info from \"@randajan/simple-lib/info\";\nimport { solid } from \"@randajan/props\";\nimport { end } from \"../../arc/opt\";\nimport { diffVersion, abortError, decodeText, failedError, normalizeClientError, parseHeaders, prepareOpt, readText, reconstructApiError, statusError } from \"../tool\";\nimport { FetchError } from \"../../arc/class/FetchError\";\n\n\nconst localReject = (err, opt)=>({ error:normalizeClientError(FetchError.is(err) ? err : failedError(err), opt) });\nconst remoteReject = (err, opt)=>({ isRemote:true, error:normalizeClientError(err, opt) });\n\nconst remoteResolve = async (resp, opt)=>{\n const text = await readText(resp);\n\n //empty response\n if (!text) {\n if (resp.ok || resp.status === 304) { return { isRemote:true }; }\n throw statusError(resp);\n }\n\n const body = decodeText(resp, opt, text);\n const ver = body?.[info.name];\n\n //foreign response\n if (!ver) {\n if (resp.ok) { return { isRemote:true, result:body } }\n throw statusError(resp);\n }\n\n //apikit response\n body.isRemote = true;\n body.isApiKit = true;\n body.apiKitDiff = diffVersion(ver);\n body.error = reconstructApiError(body.error);\n\n return body;\n}\n\n\nconst fetchBody = async (_fetch, opt) => {\n let resp, body;\n\n try { resp = await _fetch(opt.url, opt); }\n catch (err) { body = localReject(err, opt); }\n\n try { body = body || await remoteResolve(resp, opt); }\n catch (err) { body = remoteReject(err, opt); }\n\n const err = body.error;\n\n body.isOk = !err;\n body.isRemote = !!body.isRemote;\n body.isApiKit = !!body.isApiKit;\n body.statusCode = err?.httpStatusCode || resp?.status;\n body.headers = parseHeaders(resp, opt);\n\n body = end(body, opt);\n\n return opt.resultOnly ? body.result : body;\n};\n\n\nexport const executeFetch = (_fetch, url, opt, method)=>{\n opt = prepareOpt(url, opt, method);\n\n const prom = fetchBody(_fetch, opt);\n\n if (opt.timeoutId) { prom.finally(_=>clearTimeout(opt.timeoutId)); }\n if (!opt.isAbortable) { return prom; }\n\n return solid(prom, \"abort\", _=>opt.abortController?.abort(abortError()));\n}\n", "\r\n\r\nexport const mime = \"application/json\";\r\nexport const decode = body=>JSON.parse(body);\r\nexport const encode = body=>JSON.stringify(body);", "\r\n\r\nexport const mime = 'application/x-www-form-urlencoded';\r\nexport const decode = body=>Object.fromEntries(new URLSearchParams(body));\r\nexport const encode = body=>new URLSearchParams(body);\r\n\r\n", "import * as json from \"./kinds/json\";\r\nimport * as form from \"./kinds/form\";\r\nimport { isFn } from \"../tool\";\r\n\r\n\r\nconst _types = { json, form };\r\n\r\nconst joinTypeNames = (types={})=>{\n const native = Object.keys(_types);\n const custom = typeof types === \"object\" ? Object.keys(types) : [];\n\n return `'${[...(new Set([...native, ...custom]))].join(\"', '\")}'`;\n}\n\r\n\r\nconst getType = (propertyName, reqFnName, opt)=>{\r\n const tn = (opt[propertyName] || opt.type);\r\n if (!tn) { return json; }\r\n\r\n const customType = opt.types?.[tn];\r\n const type = customType || _types[tn];\n\n if (!type) {\n throw new Error(`Unknown config.${propertyName} '${tn}'. Must be one of: ${joinTypeNames(opt.types)}`);\n }\n\n if (!customType) { return type; }\n\n if (!type.mime || typeof type.mime !== \"string\") {\r\n throw new Error(`Type definition '${tn}' requires 'mime' to be a string`);\r\n }\r\n\r\n if (!isFn(type[reqFnName])) { throw new Error(`Type definition '${tn}' requires '${reqFnName}' to be a function`); }\r\n\r\n return type;\r\n}\r\n\r\n\r\nexport const encodeBody = (opt)=>{\n const type = getType(\"requestType\", \"encode\", opt);\n\n opt.headers[\"Content-Type\"] = type.mime;\n opt.body = type.encode(opt.body);\n}\n\nexport const attachBodyDecoder = (opt)=>{\n const type = getType(\"responseType\", \"decode\", opt);\n\r\n opt.headers['Accept'] = type.mime;\r\n opt.decodeBody = type.decode;\r\n}\n", "let _regexp = /^https?:\\/\\//i;\r\n\r\nexport const buildUrl = (inputUrl, params)=>{\r\n if (!params) { return inputUrl; }\r\n\r\n const hasHost = _regexp.test(inputUrl);\r\n const url = new URL(inputUrl, hasHost ? undefined : \"http://thisisonlyplaceholder.xyz\");\r\n url.hash = \"\";\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value != null) { url.searchParams.append(key, value); }\r\n };\r\n\r\n return hasHost ? url.toString() : url.pathname + url.search;\r\n}", "import { info } from \"@randajan/simple-lib/info\";\nimport { FetchError } from \"../arc/class/FetchError\";\nimport { HttpError } from \"../arc/class/HttpError\";\nimport { start } from \"../arc/opt\";\nimport { isFn, mrgObj, mrgStr, toStr } from \"../arc/tool\";\nimport { attachBodyDecoder, encodeBody } from \"../arc/types\";\nimport { buildUrl } from \"./url\";\n\nexport const diffVersion = (version)=>{\n const v1 = toStr(info.version);\n const v2 = toStr(version);\n\n if (v1 === v2) { return }\n\n const f1 = v1.split(\".\");\n const f2 = v2.split(\".\");\n\n if (f1[0] !== f2[0]) { return \"major\"; }\n if (f1[1] !== f2[1]) { return \"minor\"; }\n if (f1[2] !== f2[2]) { return \"patch\"; }\n}\n\n\nexport const failedError = cause=>FetchError.code(1, \"Failed\", { cause });\nexport const timeoutError = _=>FetchError.code(2, \"Timeout\");\nexport const abortError = _=>FetchError.code(3, \"Aborted\");\nexport const statusError = resp=>HttpError.code(4, resp.statusText, resp.status, { exposeCause:true });\nexport const unreadableError = (resp, cause)=>resp.ok ? FetchError.code(5, \"Unreadable\", { cause }) : statusError(resp);\nexport const undecodableError = (resp, cause, detail)=>resp.ok ? FetchError.code(6, \"Undecodable\", { cause, detail }) : statusError(resp);\n\nexport const parseHeaders = (resp, opt)=>{\n if (!resp || !opt.parseHeaders) { return; }\n return Object.freeze(Object.fromEntries(resp.headers.entries()));\n}\n\nexport const readText = async resp=>{\n try { return await resp.text(); }\n catch(err) { throw unreadableError(resp, err); }\n}\n\nexport const decodeText = (resp, opt, text)=>{\n try { return opt.decodeBody(text); }\n catch(err) { throw undecodableError(resp, err, text); }\n}\n\nexport const normalizeClientError = (any, opt)=>{\n let err = any;\n\n if (!FetchError.is(err)) {\n let custom = isFn(opt.normalizeError);\n if (custom) {\n try { err = opt.normalizeError(err, opt); }\n catch { custom = false; }\n }\n if (!custom || !FetchError.is(err)) {\n err = FetchError.code(0, \"Unknown\", { cause:any });\n }\n }\n\n return err.rise(0).rise(0);\n}\n\nexport const reconstructApiError = (remoteErr)=>{\n if (!remoteErr) { return; }\n const { message, code, httpStatusCode, cause, detail } = remoteErr;\n return HttpError.code(code, message, httpStatusCode, { cause, detail, exposeCause:true });\n}\n\nexport const mrgOpt = (a, b)=>{\n const opt = mrgObj(a, b);\n\n opt.body = mrgObj(a?.body, b?.body);\n opt.params = mrgObj(a?.params, b?.params);\n opt.headers = mrgObj(a?.headers, b?.headers, {});\n\n return opt;\n}\n\nexport const prepareOpt = (url, opt, method)=>{\n\n start(opt);\n\n opt.url = buildUrl( mrgStr(opt.url, url), opt.params);\n if (method) { opt.method = method; }\n\n if (opt.body) { encodeBody(opt); }\n\n attachBodyDecoder(opt);\n\n const hasTimeout = opt.timeout > 0;\n if (opt.isAbortable || hasTimeout) {\n opt.abortController = new AbortController();\n opt.signal = opt.abortController.signal;\n }\n\n if (hasTimeout) {\n opt.timeoutId = setTimeout(() => opt.abortController?.abort(timeoutError()), opt.timeout);\n }\n\n if (isFn(opt.trait)) { opt = opt.trait(opt) || opt; }\n\n return opt;\n}\n", "import { executeFetch } from \"./static\";\r\nimport { Functionable } from \"../../arc/class/Functionable\";\r\nimport { solid } from \"@randajan/props\";\r\nimport { mrgOpt } from \"../tool\";\r\nimport { configTrait } from \"../../arc/opt\";\r\n\r\n\r\nexport class Fetch extends Functionable {\r\n\r\n static create(config={}) { return new Fetch(config) }\r\n\r\n constructor(config = {}) {\r\n \r\n const _fetch = config.fetch || globalThis.fetch;\r\n\r\n if (!_fetch) { throw new Error(\"Missing fetch function. Please provide it in config\"); }\n\r\n configTrait(config);\r\n\r\n delete config.fetch;\r\n\r\n super((url, opt, method) =>executeFetch(_fetch, url, mrgOpt(config, opt), method));\r\n\r\n Object.freeze(config);\r\n solid(this, \"config\", config);\r\n }\r\n\r\n extend(config) { return new Fetch(mrgOpt(this.config, config)); }\r\n\r\n get(url, opt) { return this(url, opt, \"GET\"); }\r\n post(url, opt) { return this(url, opt, \"POST\"); }\r\n put(url, opt) { return this(url, opt, \"PUT\"); }\r\n delete(url, opt) { return this(url, opt, \"DELETE\"); }\r\n patch(url, opt) { return this(url, opt, \"PATCH\"); }\r\n head(url, opt) { return this(url, opt, \"HEAD\"); }\r\n options(url, opt) { return this(url, opt, \"OPTIONS\"); }\r\n}\n", "import { FetchError } from \"../arc/class/FetchError\";\nimport { Fetch } from \"./class/Fetch\";\n\nexport const createFetch = Fetch.create;\nexport default createFetch;\n\nexport {\n Fetch,\n FetchError\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AACA,SAAS,aAAa;;;ACDtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,OAAO;AACb,IAAM,SAAS,UAAM,KAAK,MAAM,IAAI;AACpC,IAAM,SAAS,UAAM,KAAK,UAAU,IAAI;;;ACJ/C;AAAA;AAAA,gBAAAA;AAAA,EAAA,cAAAC;AAAA,EAAA,YAAAC;AAAA;AAEO,IAAMC,QAAO;AACb,IAAMC,UAAS,UAAM,OAAO,YAAY,IAAI,gBAAgB,IAAI,CAAC;AACjE,IAAMC,UAAS,UAAM,IAAI,gBAAgB,IAAI;;;ACCpD,IAAM,SAAS,EAAE,oBAAM,mBAAK;AAE5B,IAAM,gBAAgB,CAAC,QAAM,CAAC,MAAI;AAC9B,QAAM,SAAS,OAAO,KAAK,MAAM;AACjC,QAAM,SAAS,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,CAAC;AAEjE,SAAO,IAAI,CAAC,GAAI,oBAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAE,EAAE,KAAK,MAAM,CAAC;AAClE;AAGA,IAAM,UAAU,CAAC,cAAc,WAAW,QAAM;AAC5C,QAAM,KAAM,IAAI,YAAY,KAAK,IAAI;AACrC,MAAI,CAAC,IAAI;AAAE,WAAO;AAAA,EAAM;AAExB,QAAM,aAAa,IAAI,QAAQ,EAAE;AACjC,QAAM,OAAO,cAAc,OAAO,EAAE;AAEpC,MAAI,CAAC,MAAM;AACP,UAAM,IAAI,MAAM,kBAAkB,YAAY,KAAK,EAAE,sBAAsB,cAAc,IAAI,KAAK,CAAC,EAAE;AAAA,EACzG;AAEA,MAAI,CAAC,YAAY;AAAE,WAAO;AAAA,EAAM;AAEhC,MAAI,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,UAAU;AAC7C,UAAM,IAAI,MAAM,oBAAoB,EAAE,kCAAkC;AAAA,EAC5E;AAEA,MAAI,CAAC,KAAK,KAAK,SAAS,CAAC,GAAG;AAAE,UAAM,IAAI,MAAM,oBAAoB,EAAE,eAAe,SAAS,oBAAoB;AAAA,EAAG;AAEnH,SAAO;AACX;AAGO,IAAM,aAAa,CAAC,QAAM;AAC7B,QAAM,OAAO,QAAQ,eAAe,UAAU,GAAG;AAEjD,MAAI,QAAQ,cAAc,IAAI,KAAK;AACnC,MAAI,OAAO,KAAK,OAAO,IAAI,IAAI;AACnC;AAEO,IAAM,oBAAoB,CAAC,QAAM;AACpC,QAAM,OAAO,QAAQ,gBAAgB,UAAU,GAAG;AAElD,MAAI,QAAQ,QAAQ,IAAI,KAAK;AAC7B,MAAI,aAAa,KAAK;AAC1B;;;AClDA,IAAI,UAAU;AAEP,IAAM,WAAW,CAAC,UAAU,WAAS;AACxC,MAAI,CAAC,QAAQ;AAAE,WAAO;AAAA,EAAU;AAEhC,QAAM,UAAU,QAAQ,KAAK,QAAQ;AACrC,QAAM,MAAM,IAAI,IAAI,UAAU,UAAU,SAAY,kCAAkC;AACtF,MAAI,OAAO;AAEX,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,QAAI,SAAS,MAAM;AAAE,UAAI,aAAa,OAAO,KAAK,KAAK;AAAA,IAAG;AAAA,EAC9D;AAAC;AAED,SAAO,UAAU,IAAI,SAAS,IAAI,IAAI,WAAW,IAAI;AACzD;;;ACNO,IAAM,cAAc,CAAC,YAAU;AAClC,QAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,QAAM,KAAK,MAAM,OAAO;AAExB,MAAI,OAAO,IAAI;AAAE;AAAA,EAAO;AAExB,QAAM,KAAK,GAAG,MAAM,GAAG;AACvB,QAAM,KAAK,GAAG,MAAM,GAAG;AAEvB,MAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG;AAAE,WAAO;AAAA,EAAS;AACvC,MAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG;AAAE,WAAO;AAAA,EAAS;AACvC,MAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG;AAAE,WAAO;AAAA,EAAS;AAC3C;AAGO,IAAM,cAAc,WAAO,WAAW,KAAK,GAAG,UAAU,EAAE,MAAM,CAAC;AACjE,IAAM,eAAe,OAAG,WAAW,KAAK,GAAG,SAAS;AACpD,IAAM,aAAa,OAAG,WAAW,KAAK,GAAG,SAAS;AAClD,IAAM,cAAc,UAAM,UAAU,KAAK,GAAG,KAAK,YAAY,KAAK,QAAQ,EAAE,aAAY,KAAK,CAAC;AAC9F,IAAM,kBAAkB,CAAC,MAAM,UAAQ,KAAK,KAAK,WAAW,KAAK,GAAG,cAAc,EAAE,MAAM,CAAC,IAAI,YAAY,IAAI;AAC/G,IAAM,mBAAmB,CAAC,MAAM,OAAO,WAAS,KAAK,KAAK,WAAW,KAAK,GAAG,eAAe,EAAE,OAAO,OAAO,CAAC,IAAI,YAAY,IAAI;AAEjI,IAAM,eAAe,CAAC,MAAM,QAAM;AACrC,MAAI,CAAC,QAAQ,CAAC,IAAI,cAAc;AAAE;AAAA,EAAQ;AAC1C,SAAO,OAAO,OAAO,OAAO,YAAY,KAAK,QAAQ,QAAQ,CAAC,CAAC;AACnE;AAEO,IAAM,WAAW,OAAM,SAAM;AAChC,MAAI;AAAE,WAAO,MAAM,KAAK,KAAK;AAAA,EAAG,SAC1B,KAAK;AAAE,UAAM,gBAAgB,MAAM,GAAG;AAAA,EAAG;AACnD;AAEO,IAAM,aAAa,CAAC,MAAM,KAAK,SAAO;AACzC,MAAI;AAAE,WAAO,IAAI,WAAW,IAAI;AAAA,EAAG,SAC7B,KAAK;AAAE,UAAM,iBAAiB,MAAM,KAAK,IAAI;AAAA,EAAG;AAC1D;AAEO,IAAM,uBAAuB,CAAC,KAAK,QAAM;AAC5C,MAAI,MAAM;AAEV,MAAI,CAAC,WAAW,GAAG,GAAG,GAAG;AACrB,QAAI,SAAS,KAAK,IAAI,cAAc;AACpC,QAAI,QAAQ;AACR,UAAI;AAAE,cAAM,IAAI,eAAe,KAAK,GAAG;AAAA,MAAG,QACpC;AAAE,iBAAS;AAAA,MAAO;AAAA,IAC5B;AACA,QAAI,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,GAAG;AAC/B,YAAM,WAAW,KAAK,GAAG,WAAW,EAAE,OAAM,IAAI,CAAC;AAAA,IACtD;AAAA,EACJ;AAEA,SAAO,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC;AAC7B;AAEO,IAAM,sBAAsB,CAAC,cAAY;AAC5C,MAAI,CAAC,WAAW;AAAE;AAAA,EAAQ;AAC1B,QAAM,EAAE,SAAS,MAAM,gBAAgB,OAAO,OAAO,IAAI;AACzD,SAAO,UAAU,KAAK,MAAM,SAAS,gBAAgB,EAAE,OAAO,QAAQ,aAAY,KAAK,CAAC;AAC5F;AAEO,IAAM,SAAS,CAAC,GAAG,MAAI;AAC1B,QAAM,MAAM,OAAO,GAAG,CAAC;AAEvB,MAAI,OAAO,OAAO,GAAG,MAAM,GAAG,IAAI;AAClC,MAAI,SAAS,OAAO,GAAG,QAAQ,GAAG,MAAM;AACxC,MAAI,UAAU,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;AAE/C,SAAO;AACX;AAEO,IAAM,aAAa,CAAC,KAAK,KAAK,WAAS;AAE1C,QAAM,GAAG;AAET,MAAI,MAAM,SAAU,OAAO,IAAI,KAAK,GAAG,GAAG,IAAI,MAAM;AACpD,MAAI,QAAQ;AAAE,QAAI,SAAS;AAAA,EAAQ;AAEnC,MAAI,IAAI,MAAM;AAAE,eAAW,GAAG;AAAA,EAAG;AAEjC,oBAAkB,GAAG;AAErB,QAAM,aAAa,IAAI,UAAU;AACjC,MAAI,IAAI,eAAe,YAAY;AAC/B,QAAI,kBAAkB,IAAI,gBAAgB;AAC1C,QAAI,SAAS,IAAI,gBAAgB;AAAA,EACrC;AAEA,MAAI,YAAY;AACZ,QAAI,YAAY,WAAW,MAAM,IAAI,iBAAiB,MAAM,aAAa,CAAC,GAAG,IAAI,OAAO;AAAA,EAC5F;AAEA,MAAI,KAAK,IAAI,KAAK,GAAG;AAAE,UAAM,IAAI,MAAM,GAAG,KAAK;AAAA,EAAK;AAEpD,SAAO;AACX;;;AL/FA,IAAM,cAAc,CAAC,KAAK,SAAO,EAAE,OAAM,qBAAqB,WAAW,GAAG,GAAG,IAAI,MAAM,YAAY,GAAG,GAAG,GAAG,EAAE;AAChH,IAAM,eAAe,CAAC,KAAK,SAAO,EAAE,UAAS,MAAM,OAAM,qBAAqB,KAAK,GAAG,EAAE;AAExF,IAAM,gBAAgB,OAAO,MAAM,QAAM;AACrC,QAAM,OAAO,MAAM,SAAS,IAAI;AAGhC,MAAI,CAAC,MAAM;AACP,QAAI,KAAK,MAAM,KAAK,WAAW,KAAK;AAAE,aAAO,EAAE,UAAS,KAAK;AAAA,IAAG;AAChE,UAAM,YAAY,IAAI;AAAA,EAC1B;AAEA,QAAM,OAAO,WAAW,MAAM,KAAK,IAAI;AACvC,QAAM,MAAM,OAAO,aAAK,IAAI;AAG5B,MAAI,CAAC,KAAK;AACN,QAAI,KAAK,IAAI;AAAE,aAAO,EAAE,UAAS,MAAM,QAAO,KAAK;AAAA,IAAE;AACrD,UAAM,YAAY,IAAI;AAAA,EAC1B;AAGA,OAAK,WAAW;AAChB,OAAK,WAAW;AAChB,OAAK,aAAa,YAAY,GAAG;AACjC,OAAK,QAAQ,oBAAoB,KAAK,KAAK;AAE3C,SAAO;AACX;AAGA,IAAM,YAAY,OAAO,QAAQ,QAAQ;AACrC,MAAI,MAAM;AAEV,MAAI;AAAE,WAAO,MAAM,OAAO,IAAI,KAAK,GAAG;AAAA,EAAG,SAClCC,MAAK;AAAE,WAAO,YAAYA,MAAK,GAAG;AAAA,EAAG;AAE5C,MAAI;AAAE,WAAO,QAAQ,MAAM,cAAc,MAAM,GAAG;AAAA,EAAG,SAC9CA,MAAK;AAAE,WAAO,aAAaA,MAAK,GAAG;AAAA,EAAG;AAE7C,QAAM,MAAM,KAAK;AAEjB,OAAK,OAAO,CAAC;AACb,OAAK,WAAW,CAAC,CAAC,KAAK;AACvB,OAAK,WAAW,CAAC,CAAC,KAAK;AACvB,OAAK,aAAa,KAAK,kBAAkB,MAAM;AAC/C,OAAK,UAAU,aAAa,MAAM,GAAG;AAErC,SAAO,IAAI,MAAM,GAAG;AAEpB,SAAO,IAAI,aAAa,KAAK,SAAS;AAC1C;AAGO,IAAM,eAAe,CAAC,QAAQ,KAAK,KAAK,WAAS;AACpD,QAAM,WAAW,KAAK,KAAK,MAAM;AAEjC,QAAM,OAAO,UAAU,QAAQ,GAAG;AAElC,MAAI,IAAI,WAAW;AAAE,SAAK,QAAQ,OAAG,aAAa,IAAI,SAAS,CAAC;AAAA,EAAG;AACnE,MAAI,CAAC,IAAI,aAAa;AAAE,WAAO;AAAA,EAAM;AAErC,SAAO,MAAM,MAAM,SAAS,OAAG,IAAI,iBAAiB,MAAM,WAAW,CAAC,CAAC;AAC3E;;;AMpEA,SAAS,SAAAC,cAAa;AAKf,IAAM,QAAN,MAAM,eAAc,aAAa;AAAA,EAEpC,OAAO,OAAO,SAAO,CAAC,GAAG;AAAE,WAAO,IAAI,OAAM,MAAM;AAAA,EAAE;AAAA,EAEpD,YAAY,SAAS,CAAC,GAAG;AAErB,UAAM,SAAS,OAAO,SAAS,WAAW;AAE1C,QAAI,CAAC,QAAQ;AAAE,YAAM,IAAI,MAAM,qDAAqD;AAAA,IAAG;AAEvF,gBAAY,MAAM;AAElB,WAAO,OAAO;AAEd,UAAM,CAAC,KAAK,KAAK,WAAU,aAAa,QAAQ,KAAK,OAAO,QAAQ,GAAG,GAAG,MAAM,CAAC;AAEjF,WAAO,OAAO,MAAM;AACpB,IAAAC,OAAM,MAAM,UAAU,MAAM;AAAA,EAChC;AAAA,EAEA,OAAO,QAAQ;AAAE,WAAO,IAAI,OAAM,OAAO,KAAK,QAAQ,MAAM,CAAC;AAAA,EAAG;AAAA,EAEhE,IAAI,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,KAAK;AAAA,EAAG;AAAA,EAC9C,KAAK,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EAAG;AAAA,EAChD,IAAI,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,KAAK;AAAA,EAAG;AAAA,EAC9C,OAAO,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,QAAQ;AAAA,EAAG;AAAA,EACpD,MAAM,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,OAAO;AAAA,EAAG;AAAA,EAClD,KAAK,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EAAG;AAAA,EAChD,QAAQ,KAAK,KAAK;AAAE,WAAO,KAAK,KAAK,KAAK,SAAS;AAAA,EAAG;AAC1D;;;ACjCO,IAAM,cAAc,MAAM;AACjC,IAAO,iBAAQ;",
|
|
6
|
+
"names": ["decode", "encode", "mime", "mime", "decode", "encode", "err", "solid", "solid"]
|
|
7
|
+
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
ApiError,
|
|
3
2
|
Functionable,
|
|
3
|
+
HttpError,
|
|
4
4
|
configTrait,
|
|
5
5
|
doFn,
|
|
6
6
|
end,
|
|
7
7
|
info_default,
|
|
8
8
|
isErr,
|
|
9
|
+
isFn,
|
|
9
10
|
isProm,
|
|
10
11
|
mrgObj,
|
|
11
12
|
start
|
|
12
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-K7ZQO3VB.js";
|
|
13
14
|
|
|
14
15
|
// src/server/class/Api.js
|
|
15
16
|
import { solid } from "@randajan/props";
|
|
@@ -38,15 +39,32 @@ var tryFn = (any) => {
|
|
|
38
39
|
}
|
|
39
40
|
return r.result.then(wrapResult).catch(wrapError);
|
|
40
41
|
};
|
|
42
|
+
var normalizeServerError = (any, opt) => {
|
|
43
|
+
let err = any;
|
|
44
|
+
if (!HttpError.is(err)) {
|
|
45
|
+
let custom = isFn(opt.normalizeError);
|
|
46
|
+
if (custom) {
|
|
47
|
+
try {
|
|
48
|
+
err = opt.normalizeError(err, opt);
|
|
49
|
+
} catch {
|
|
50
|
+
custom = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!custom || !HttpError.is(err)) {
|
|
54
|
+
err = HttpError.code(0, "Unknown", 500, { cause: any });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return err.rise(1).rise(opt.code);
|
|
58
|
+
};
|
|
41
59
|
|
|
42
60
|
// src/server/class/static.js
|
|
43
61
|
var apiExit = (resp, opt) => {
|
|
44
|
-
const {
|
|
62
|
+
const { exposeCause } = opt;
|
|
45
63
|
resp.statusCode = 200;
|
|
46
64
|
if (resp.error) {
|
|
47
|
-
resp.error =
|
|
65
|
+
resp.error = normalizeServerError(resp.error, opt);
|
|
48
66
|
resp.statusCode = resp.error.httpStatusCode;
|
|
49
|
-
resp.error.
|
|
67
|
+
resp.error.exposeCause(!!exposeCause);
|
|
50
68
|
}
|
|
51
69
|
resp[info_default.name] = info_default.version;
|
|
52
70
|
return end(resp, opt);
|
|
@@ -94,4 +112,4 @@ export {
|
|
|
94
112
|
createApi,
|
|
95
113
|
server_default
|
|
96
114
|
};
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
115
|
+
//# sourceMappingURL=chunk-IUVT7Q4N.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/server/class/Api.js", "../../src/server/tool.js", "../../src/server/class/static.js", "../../src/server/index.js"],
|
|
4
|
+
"sourcesContent": ["import { solid } from \"@randajan/props\";\r\nimport { Functionable } from \"../../arc/class/Functionable\";\r\nimport { apiResolve } from \"./static\";\r\nimport { mrgObj } from \"../../arc/tool\";\r\nimport { configTrait } from \"../../arc/opt\";\r\n\r\nexport class Api extends Functionable {\r\n\r\n static create(config={}) { return new Api(config); }\r\n\r\n constructor(config={}) {\r\n\r\n configTrait(config);\r\n \r\n super((exe, opt)=>apiResolve(exe, mrgObj(config, opt)));\r\n\r\n Object.freeze(config);\r\n solid(this, \"config\", config);\r\n }\r\n\r\n code(code, exe, opt={}) {\r\n opt.code = code;\r\n return this(exe, opt);\r\n }\r\n\r\n extend(config) { return new Api(mrgObj(this.config, config)); }\r\n}", "import { HttpError } from \"../arc/class/HttpError\";\r\nimport { doFn, isErr, isFn, isProm } from \"../arc/tool\";\r\n\r\nconst wrapResult = r=>({[isErr(r) ? \"error\" : \"result\"]:r});\r\nconst wrapError = error=>({error});\r\n\r\nexport const tryFnSync = any=>{\r\n try { return wrapResult(doFn(any)); }\r\n catch(error) { return {error}; }\r\n}\r\n\r\nexport const tryFnAsync = async any=>{\r\n try { return wrapResult(await doFn(any)); }\r\n catch(error) { return {error}; }\r\n}\r\n\r\nexport const tryFn = any=>{\r\n const r = tryFnSync(any);\r\n if (!isProm(r.result)) { return r; }\r\n return r.result.then(wrapResult).catch(wrapError);\r\n}\r\n\r\n\r\nexport const normalizeServerError = (any, opt)=>{\r\n let err = any;\r\n\r\n if (!HttpError.is(err)) {\r\n let custom = isFn(opt.normalizeError);\r\n if (custom) {\r\n try { err = opt.normalizeError(err, opt); }\r\n catch { custom = false; }\r\n }\r\n if (!custom || !HttpError.is(err)) {\r\n err = HttpError.code(0, \"Unknown\", 500, { cause:any });\r\n }\r\n }\r\n\r\n return err.rise(1).rise(opt.code);\r\n}\r\n", "import info from \"@randajan/simple-lib/info\";\r\nimport { start, end } from \"../../arc/opt\";\r\nimport { isProm } from \"../../arc/tool\";\r\nimport { normalizeServerError, tryFn, tryFnAsync } from \"../tool\";\r\n\r\n\r\n\r\nconst apiExit = (resp, opt)=>{\r\n const { exposeCause } = opt;\r\n\r\n resp.statusCode = 200;\r\n\r\n if (resp.error) {\r\n resp.error = normalizeServerError(resp.error, opt);\r\n resp.statusCode = resp.error.httpStatusCode;\r\n resp.error.exposeCause(!!exposeCause);\r\n }\r\n\r\n resp[info.name] = info.version;\r\n\r\n return end(resp, opt);\r\n}\r\n\r\nconst apiAsync = async (exe, opt)=>apiExit(await tryFnAsync(exe), opt);\r\n\r\nexport const apiResolve = (exe, opt)=>{\r\n start(opt);\r\n\r\n opt = opt.trait(opt) || opt;\r\n\r\n if (opt.isAsync) { return apiAsync(exe, opt); }\r\n\r\n const resp = tryFn(exe);\r\n if (!isProm(resp)) { return apiExit(resp, opt); }\r\n return resp.then((resp)=>apiExit(resp, opt));\r\n}\r\n", "import { HttpError } from \"../arc/class/HttpError\";\r\nimport { Api } from \"./class/Api\";\r\n\r\nexport const createApi = Api.create;\r\nexport default createApi;\r\nexport {\r\n Api,\r\n HttpError\r\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["resp"]
|
|
7
|
+
}
|
|
@@ -5,10 +5,10 @@ var __export = (target, all) => {
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
// <define:__slib_info>
|
|
8
|
-
var define_slib_info_default = { isBuild: true, name: "@randajan/api-kit", description: "A lightweight wrapper around fetch that always returns a structured JSON response, handling errors and network issues gracefully", version: "
|
|
8
|
+
var define_slib_info_default = { isBuild: true, name: "@randajan/api-kit", description: "A lightweight wrapper around fetch that always returns a structured JSON response, handling errors and network issues gracefully", version: "2.0.0", author: { name: "Jan Randa", email: "jnranda@gmail.com", url: "https://www.linkedin.com/in/randajan/" }, env: "development", mode: "web", port: 3e3, dir: { root: "C:\\dev\\lib\\api-kit", dist: "dist" } };
|
|
9
9
|
|
|
10
|
-
// src/arc/class/
|
|
11
|
-
import { safe
|
|
10
|
+
// src/arc/class/FetchError.js
|
|
11
|
+
import { safe } from "@randajan/props";
|
|
12
12
|
|
|
13
13
|
// src/arc/tool.js
|
|
14
14
|
var mrgObj = (a, b, def) => {
|
|
@@ -34,44 +34,34 @@ var doFn = (any) => isFn(any) ? any() : any;
|
|
|
34
34
|
var isProm = (any) => any instanceof Promise;
|
|
35
35
|
var isErr = (any) => any instanceof Error;
|
|
36
36
|
|
|
37
|
-
// src/arc/class/
|
|
38
|
-
var
|
|
39
|
-
static create(code, message, httpStatusCode = 400, remoteStack = void 0) {
|
|
40
|
-
return new _ApiError(code, message, httpStatusCode, remoteStack);
|
|
41
|
-
}
|
|
37
|
+
// src/arc/class/FetchError.js
|
|
38
|
+
var FetchError = class _FetchError extends Error {
|
|
42
39
|
static is(any) {
|
|
43
|
-
return any instanceof
|
|
40
|
+
return any && any instanceof _FetchError;
|
|
44
41
|
}
|
|
45
|
-
static
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
const msg = toStr(any?.message || any) || "Unknown";
|
|
50
|
-
const apierr = _ApiError.create(code, msg, httpStatusCode);
|
|
51
|
-
return solid(apierr, "stack", any?.stack);
|
|
42
|
+
static code(code, message, opt = {}) {
|
|
43
|
+
opt.code = code;
|
|
44
|
+
return new _FetchError(message, opt);
|
|
52
45
|
}
|
|
53
|
-
constructor(
|
|
54
|
-
|
|
46
|
+
constructor(message, options = {}) {
|
|
47
|
+
const { code, ...opt } = options || {};
|
|
48
|
+
super(message, opt);
|
|
55
49
|
safe(this, {}, "code", (t, f) => mrgStr(t, f, "."));
|
|
56
|
-
solid(this, "httpStatusCode", httpStatusCode ?? 400, true);
|
|
57
|
-
solid(this, "remoteStack", remoteStack);
|
|
58
50
|
this.rise(code);
|
|
59
51
|
}
|
|
60
|
-
rise(code
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
solid(this, "_exposeStack", !!exposeStack, false, true);
|
|
52
|
+
rise(code) {
|
|
53
|
+
if (code == null) {
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
this.code = code;
|
|
66
57
|
return this;
|
|
67
58
|
}
|
|
68
59
|
toJSON() {
|
|
69
|
-
const { message,
|
|
60
|
+
const { message, cause } = this;
|
|
70
61
|
const body = { message, ...this };
|
|
71
|
-
if (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
delete body.stack;
|
|
62
|
+
if (cause) {
|
|
63
|
+
const { message: message2, stack } = cause;
|
|
64
|
+
body.cause = { message: message2, stack };
|
|
75
65
|
}
|
|
76
66
|
return body;
|
|
77
67
|
}
|
|
@@ -81,6 +71,45 @@ var ApiError = class _ApiError extends Error {
|
|
|
81
71
|
}
|
|
82
72
|
};
|
|
83
73
|
|
|
74
|
+
// src/arc/class/HttpError.js
|
|
75
|
+
import { safe as safe2 } from "@randajan/props";
|
|
76
|
+
var HttpError = class _HttpError extends FetchError {
|
|
77
|
+
static is(any) {
|
|
78
|
+
return any && any instanceof _HttpError;
|
|
79
|
+
}
|
|
80
|
+
static code(code, message, httpStatusCode = 400, opt = {}) {
|
|
81
|
+
opt.code = code;
|
|
82
|
+
return new _HttpError(message, httpStatusCode, opt);
|
|
83
|
+
}
|
|
84
|
+
constructor(message, httpStatusCode = 400, options = {}) {
|
|
85
|
+
const { detail, exposeCause, ...opt } = options || {};
|
|
86
|
+
const http = httpStatusCode ?? 400;
|
|
87
|
+
const msg = message || `HTTP:${http}`;
|
|
88
|
+
super(msg, opt);
|
|
89
|
+
safe2(this, {}, "_exposeCause", (t) => !!t, void 0, false);
|
|
90
|
+
this.detail = detail;
|
|
91
|
+
this.httpStatusCode = http;
|
|
92
|
+
this._exposeCause = exposeCause;
|
|
93
|
+
}
|
|
94
|
+
exposeCause(exposeCause = true) {
|
|
95
|
+
this._exposeCause = exposeCause;
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
toJSON() {
|
|
99
|
+
const { message, cause, _exposeCause } = this;
|
|
100
|
+
const body = { message, ...this };
|
|
101
|
+
if (_exposeCause && cause) {
|
|
102
|
+
const { message: message2, stack } = cause;
|
|
103
|
+
body.cause = { message: message2, stack, ...cause };
|
|
104
|
+
}
|
|
105
|
+
return body;
|
|
106
|
+
}
|
|
107
|
+
toString() {
|
|
108
|
+
const { httpStatusCode } = this;
|
|
109
|
+
return super.toString() + ` [${httpStatusCode}]`;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
84
113
|
// src/arc/class/Functionable.js
|
|
85
114
|
var Functionable = class extends Function {
|
|
86
115
|
constructor(self) {
|
|
@@ -90,45 +119,9 @@ var Functionable = class extends Function {
|
|
|
90
119
|
};
|
|
91
120
|
|
|
92
121
|
// src/arc/opt.js
|
|
93
|
-
var createTrait = (trait) => {
|
|
94
|
-
if (!trait) {
|
|
95
|
-
return (opt) => opt;
|
|
96
|
-
}
|
|
97
|
-
if (isFn(trait)) {
|
|
98
|
-
return trait;
|
|
99
|
-
}
|
|
100
|
-
throw new Error("config.trait should be a function");
|
|
101
|
-
};
|
|
102
|
-
var configTrait = (config) => {
|
|
103
|
-
config.trait = createTrait(config.trait);
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// node_modules/@randajan/simple-lib/dist/chunk-XM4YD4K6.js
|
|
107
|
-
var enumerable = true;
|
|
108
|
-
var lockObject = (o) => {
|
|
109
|
-
if (typeof o !== "object") {
|
|
110
|
-
return o;
|
|
111
|
-
}
|
|
112
|
-
const r = {};
|
|
113
|
-
for (const i in o) {
|
|
114
|
-
const descriptor = { enumerable };
|
|
115
|
-
let val = o[i];
|
|
116
|
-
if (val instanceof Array) {
|
|
117
|
-
descriptor.get = (_) => [...val];
|
|
118
|
-
} else {
|
|
119
|
-
descriptor.value = lockObject(val);
|
|
120
|
-
}
|
|
121
|
-
Object.defineProperty(r, i, descriptor);
|
|
122
|
-
}
|
|
123
|
-
return r;
|
|
124
|
-
};
|
|
125
|
-
var info = lockObject(define_slib_info_default);
|
|
126
|
-
var info_default = info;
|
|
127
|
-
|
|
128
|
-
// src/arc/main.js
|
|
129
122
|
import { solids } from "@randajan/props";
|
|
130
123
|
var start = (opt) => {
|
|
131
|
-
if (opt.
|
|
124
|
+
if (opt.timetrack) {
|
|
132
125
|
return opt.startAt = Date.now();
|
|
133
126
|
}
|
|
134
127
|
};
|
|
@@ -160,46 +153,63 @@ var end = (body, opt) => {
|
|
|
160
153
|
if (isFn(opt.onError)) {
|
|
161
154
|
opt.onError(body, opt);
|
|
162
155
|
}
|
|
163
|
-
if (opt.throwError
|
|
156
|
+
if (opt.throwError) {
|
|
164
157
|
throw body.error;
|
|
165
158
|
}
|
|
166
159
|
}
|
|
167
|
-
return
|
|
160
|
+
return Object.freeze(body);
|
|
168
161
|
};
|
|
169
|
-
var
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (v1 === v2) {
|
|
173
|
-
return;
|
|
162
|
+
var createTrait = (trait) => {
|
|
163
|
+
if (!trait) {
|
|
164
|
+
return (opt) => opt;
|
|
174
165
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (f1[0] !== f2[0]) {
|
|
178
|
-
return "major";
|
|
166
|
+
if (isFn(trait)) {
|
|
167
|
+
return trait;
|
|
179
168
|
}
|
|
180
|
-
|
|
181
|
-
|
|
169
|
+
throw new Error("config.trait should be a function");
|
|
170
|
+
};
|
|
171
|
+
var configTrait = (config) => {
|
|
172
|
+
config.trait = createTrait(config.trait);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// node_modules/@randajan/simple-lib/dist/chunk-XM4YD4K6.js
|
|
176
|
+
var enumerable = true;
|
|
177
|
+
var lockObject = (o) => {
|
|
178
|
+
if (typeof o !== "object") {
|
|
179
|
+
return o;
|
|
182
180
|
}
|
|
183
|
-
|
|
184
|
-
|
|
181
|
+
const r = {};
|
|
182
|
+
for (const i in o) {
|
|
183
|
+
const descriptor = { enumerable };
|
|
184
|
+
let val = o[i];
|
|
185
|
+
if (val instanceof Array) {
|
|
186
|
+
descriptor.get = (_) => [...val];
|
|
187
|
+
} else {
|
|
188
|
+
descriptor.value = lockObject(val);
|
|
189
|
+
}
|
|
190
|
+
Object.defineProperty(r, i, descriptor);
|
|
185
191
|
}
|
|
192
|
+
return r;
|
|
186
193
|
};
|
|
194
|
+
var info = lockObject(define_slib_info_default);
|
|
195
|
+
var info_default = info;
|
|
187
196
|
|
|
188
197
|
export {
|
|
189
198
|
__export,
|
|
190
199
|
mrgObj,
|
|
200
|
+
toStr,
|
|
191
201
|
mrgStr,
|
|
192
202
|
isFn,
|
|
193
203
|
doFn,
|
|
194
204
|
isProm,
|
|
195
205
|
isErr,
|
|
196
|
-
|
|
206
|
+
FetchError,
|
|
207
|
+
HttpError,
|
|
197
208
|
Functionable,
|
|
209
|
+
info,
|
|
198
210
|
info_default,
|
|
199
211
|
start,
|
|
200
212
|
end,
|
|
201
|
-
diffVersion,
|
|
202
|
-
createTrait,
|
|
203
213
|
configTrait
|
|
204
214
|
};
|
|
205
|
-
//# sourceMappingURL=chunk-
|
|
215
|
+
//# sourceMappingURL=chunk-K7ZQO3VB.js.map
|