@defjs/core 0.0.0-test-002 → 0.0.0-test-004
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/index.d.ts +292 -226
- package/index.js +257 -289
- package/index.min.js +587 -0
- package/package.json +1 -4
- package/index.es.min.js +0 -1
package/index.js
CHANGED
|
@@ -1,48 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var ERR_UNKNOWN = new Error("ERR_UNKNOWN");
|
|
13
|
-
|
|
1
|
+
const ERR_ABORTED = new Error("ERR_ABORTED");
|
|
2
|
+
const ERR_TIMEOUT = new Error("ERR_TIMEOUT");
|
|
3
|
+
const ERR_NETWORK = new Error("ERR_NETWORK");
|
|
4
|
+
const ERR_NOT_FOUND_HANDLER = new Error("ERR_NOT_FOUND_HANDLER");
|
|
5
|
+
const ERR_OBSERVE = new Error("ERR_OBSERVE");
|
|
6
|
+
const ERR_NOT_SET_ALIAS = new Error("ERR_NOT_SET_ALIAS");
|
|
7
|
+
const ERR_UNSUPPORTED_FIELD_TYPE = new Error("ERR_UNSUPPORTED_FIELD_TYPE");
|
|
8
|
+
const ERR_INVALID_CLIENT = new Error("ERR_INVALID_CLIENT");
|
|
9
|
+
const ERR_NOT_FOUND_GLOBAL_CLIENT = new Error("ERR_NOT_FOUND_GLOBAL_CLIENT");
|
|
10
|
+
const ERR_INVALID_HTTP_CONTEXT_TOKEN = new Error("ERR_INVALID_HTTP_CONTEXT_TOKEN");
|
|
11
|
+
const ERR_UNKNOWN = new Error("ERR_UNKNOWN");
|
|
14
12
|
class HttpErrorResponse extends Error {
|
|
15
13
|
status;
|
|
16
14
|
statusText;
|
|
17
15
|
url;
|
|
18
16
|
headers;
|
|
19
|
-
ok;
|
|
20
17
|
body;
|
|
21
18
|
constructor(init) {
|
|
22
|
-
const status = init
|
|
23
|
-
const statusText = init
|
|
19
|
+
const status = init?.status ?? 0;
|
|
20
|
+
const statusText = init?.statusText ?? "";
|
|
24
21
|
const ok = status >= 200 && status < 300;
|
|
25
|
-
const headers = init
|
|
26
|
-
const url = init
|
|
27
|
-
const body = init
|
|
22
|
+
const headers = init?.headers ?? new Headers();
|
|
23
|
+
const url = init?.url ?? "";
|
|
24
|
+
const body = init?.body ?? null;
|
|
28
25
|
let message;
|
|
29
26
|
if (ok) {
|
|
30
|
-
message = `Http failure during parsing for ${
|
|
27
|
+
message = `Http failure during parsing for ${url}`;
|
|
31
28
|
} else {
|
|
32
|
-
message = `Http failure response for ${
|
|
29
|
+
message = `Http failure response for ${url || "(unknown url)"}: ${status}`;
|
|
30
|
+
if (statusText) {
|
|
31
|
+
message += ` - ${statusText}`;
|
|
32
|
+
}
|
|
33
33
|
}
|
|
34
|
-
super(message, { cause: init
|
|
34
|
+
super(message, { cause: init?.error });
|
|
35
35
|
super.name = "HttpErrorResponse";
|
|
36
36
|
this.statusText = statusText;
|
|
37
37
|
this.url = url;
|
|
38
38
|
this.headers = headers;
|
|
39
39
|
this.status = status;
|
|
40
|
-
this.ok = ok;
|
|
41
40
|
this.body = body;
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
|
|
44
|
+
function __getContentLength(headers) {
|
|
45
|
+
const value = headers.get("Content-Length");
|
|
46
|
+
if (!value) {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
const num = Number(value);
|
|
50
|
+
if (isNaN(num)) {
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
return num;
|
|
54
|
+
}
|
|
55
|
+
function __getContentType(headers) {
|
|
56
|
+
return headers.get("Content-Type") || "";
|
|
57
|
+
}
|
|
58
|
+
function __parseBody(params) {
|
|
59
|
+
const { request, content, contentType } = params;
|
|
60
|
+
const responseType = request.responseType;
|
|
61
|
+
switch (responseType) {
|
|
62
|
+
case "json": {
|
|
63
|
+
const text = new TextDecoder().decode(content);
|
|
64
|
+
if (text === "") {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return JSON.parse(text);
|
|
68
|
+
}
|
|
69
|
+
case "text":
|
|
70
|
+
return new TextDecoder().decode(content);
|
|
71
|
+
case "blob": {
|
|
72
|
+
return new Blob([content], { type: contentType });
|
|
73
|
+
}
|
|
74
|
+
case "arraybuffer":
|
|
75
|
+
return content.buffer;
|
|
76
|
+
default:
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function __concatChunks(chunks, totalLength) {
|
|
81
|
+
const chunksAll = new Uint8Array(totalLength);
|
|
82
|
+
let position = 0;
|
|
83
|
+
for (const chunk of chunks) {
|
|
84
|
+
chunksAll.set(chunk, position);
|
|
85
|
+
position += chunk.length;
|
|
86
|
+
}
|
|
87
|
+
return chunksAll;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const HTTP_CONTEXT_TOKEN = Symbol("HttpContextToken");
|
|
46
91
|
function makeHttpContextToken(defaultValue) {
|
|
47
92
|
Object.defineProperty(defaultValue, HTTP_CONTEXT_TOKEN, { value: defaultValue });
|
|
48
93
|
return defaultValue;
|
|
@@ -50,8 +95,28 @@ function makeHttpContextToken(defaultValue) {
|
|
|
50
95
|
function isHttpContextToken(value) {
|
|
51
96
|
return typeof value === "function" && HTTP_CONTEXT_TOKEN in value;
|
|
52
97
|
}
|
|
53
|
-
|
|
54
|
-
|
|
98
|
+
const HTTP_CONTEXT = Symbol("HttpContext");
|
|
99
|
+
function isHttpContext(value) {
|
|
100
|
+
return typeof value === "object" && value !== null && HTTP_CONTEXT in value;
|
|
101
|
+
}
|
|
102
|
+
function makeHttpContext(entries) {
|
|
103
|
+
const ctx = /* @__PURE__ */ new Map();
|
|
104
|
+
switch (true) {
|
|
105
|
+
case Array.isArray(entries): {
|
|
106
|
+
for (const [token, value] of entries) {
|
|
107
|
+
if (isHttpContextToken(token)) {
|
|
108
|
+
ctx.set(token, value);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case isHttpContext(entries): {
|
|
114
|
+
for (const [token, value] of entries[HTTP_CONTEXT]) {
|
|
115
|
+
ctx.set(token, value);
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
55
120
|
return {
|
|
56
121
|
set(token, value) {
|
|
57
122
|
if (!isHttpContextToken(token)) {
|
|
@@ -78,15 +143,30 @@ function makeHttpContext() {
|
|
|
78
143
|
},
|
|
79
144
|
keys() {
|
|
80
145
|
return ctx.keys();
|
|
81
|
-
}
|
|
146
|
+
},
|
|
147
|
+
get length() {
|
|
148
|
+
return Array.from(ctx.keys()).length;
|
|
149
|
+
},
|
|
150
|
+
[HTTP_CONTEXT]: ctx
|
|
82
151
|
};
|
|
83
152
|
}
|
|
84
|
-
var HTTP_CONTEXT_TOKEN = Symbol("HttpContextToken");
|
|
85
153
|
|
|
86
|
-
|
|
154
|
+
const FIELD = Symbol("field");
|
|
155
|
+
var FieldType = /* @__PURE__ */ ((FieldType2) => {
|
|
156
|
+
FieldType2[FieldType2["Json"] = 0] = "Json";
|
|
157
|
+
FieldType2[FieldType2["Query"] = 1] = "Query";
|
|
158
|
+
FieldType2[FieldType2["Param"] = 2] = "Param";
|
|
159
|
+
FieldType2[FieldType2["Header"] = 3] = "Header";
|
|
160
|
+
FieldType2[FieldType2["Form"] = 4] = "Form";
|
|
161
|
+
FieldType2[FieldType2["Body"] = 5] = "Body";
|
|
162
|
+
FieldType2[FieldType2["UrlForm"] = 6] = "UrlForm";
|
|
163
|
+
return FieldType2;
|
|
164
|
+
})(FieldType || {});
|
|
87
165
|
function field(defaultValue) {
|
|
88
166
|
const meta = {
|
|
89
|
-
|
|
167
|
+
// todo
|
|
168
|
+
required: typeof defaultValue !== "undefined",
|
|
169
|
+
alias: /* @__PURE__ */ new Map(),
|
|
90
170
|
validators: [],
|
|
91
171
|
asyncValidator: []
|
|
92
172
|
};
|
|
@@ -95,31 +175,31 @@ function field(defaultValue) {
|
|
|
95
175
|
value: meta
|
|
96
176
|
});
|
|
97
177
|
getter.withJson = (alias) => {
|
|
98
|
-
meta.alias.set(
|
|
178
|
+
meta.alias.set(0 /* Json */, alias);
|
|
99
179
|
return getter;
|
|
100
180
|
};
|
|
101
181
|
getter.withForm = (alias) => {
|
|
102
|
-
meta.alias.set(
|
|
182
|
+
meta.alias.set(4 /* Form */, alias);
|
|
103
183
|
return getter;
|
|
104
184
|
};
|
|
105
185
|
getter.withQuery = (alias) => {
|
|
106
|
-
meta.alias.set(
|
|
186
|
+
meta.alias.set(1 /* Query */, alias);
|
|
107
187
|
return getter;
|
|
108
188
|
};
|
|
109
189
|
getter.withParam = (alias) => {
|
|
110
|
-
meta.alias.set(
|
|
190
|
+
meta.alias.set(2 /* Param */, alias);
|
|
111
191
|
return getter;
|
|
112
192
|
};
|
|
113
193
|
getter.withHeader = (alias) => {
|
|
114
|
-
meta.alias.set(
|
|
194
|
+
meta.alias.set(3 /* Header */, alias);
|
|
115
195
|
return getter;
|
|
116
196
|
};
|
|
117
197
|
getter.withUrlForm = (alias) => {
|
|
118
|
-
meta.alias.set(
|
|
198
|
+
meta.alias.set(6 /* UrlForm */, alias);
|
|
119
199
|
return getter;
|
|
120
200
|
};
|
|
121
201
|
getter.withBody = () => {
|
|
122
|
-
meta.alias.set(
|
|
202
|
+
meta.alias.set(5 /* Body */, void 0);
|
|
123
203
|
return getter;
|
|
124
204
|
};
|
|
125
205
|
getter.withValidators = (...fn) => {
|
|
@@ -135,21 +215,8 @@ function field(defaultValue) {
|
|
|
135
215
|
function __getFieldMetadata(field2) {
|
|
136
216
|
return field2[FIELD];
|
|
137
217
|
}
|
|
138
|
-
function
|
|
139
|
-
|
|
140
|
-
const err = fn(value);
|
|
141
|
-
if (err) {
|
|
142
|
-
throw err;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
async function asyncValidatorField(asyncValidator, value) {
|
|
147
|
-
for (const fn of asyncValidator) {
|
|
148
|
-
const err = await fn(value);
|
|
149
|
-
if (err) {
|
|
150
|
-
throw err;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
218
|
+
async function doValid(validators, value) {
|
|
219
|
+
await Promise.all(validators.map((validator) => validator(value)));
|
|
153
220
|
}
|
|
154
221
|
function isField(value) {
|
|
155
222
|
return !!value && typeof value === "function" && FIELD in value;
|
|
@@ -157,26 +224,25 @@ function isField(value) {
|
|
|
157
224
|
function isFieldGroup(value) {
|
|
158
225
|
return !!value && typeof value === "object" && Object.entries(value).every(([, v]) => isField(v));
|
|
159
226
|
}
|
|
160
|
-
var FIELD = Symbol("field");
|
|
161
227
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
var getGlobalHttpHandler = () => globalHttpHandler;
|
|
228
|
+
let globalHttpHandler = void 0;
|
|
229
|
+
const getGlobalHttpHandler = () => globalHttpHandler;
|
|
165
230
|
|
|
166
|
-
// src/interceptor/interceptor.ts
|
|
167
231
|
function makeInterceptorChain(interceptors) {
|
|
168
|
-
return interceptors.reduceRight(
|
|
169
|
-
|
|
170
|
-
|
|
232
|
+
return interceptors.reduceRight(
|
|
233
|
+
(fn, interceptor) => {
|
|
234
|
+
return (initReq, finalHandlerFn) => interceptor(initReq, (req) => fn(req, finalHandlerFn));
|
|
235
|
+
},
|
|
236
|
+
(req, fn) => fn(req)
|
|
237
|
+
);
|
|
171
238
|
}
|
|
172
239
|
|
|
173
|
-
// src/response.ts
|
|
174
240
|
function __makeResponse(options) {
|
|
175
|
-
const status = options
|
|
176
|
-
const statusText = options
|
|
177
|
-
const url = options
|
|
178
|
-
const headers = options
|
|
179
|
-
const body = options
|
|
241
|
+
const status = options?.status ?? 0;
|
|
242
|
+
const statusText = options?.statusText ?? "";
|
|
243
|
+
const url = options?.url ?? "";
|
|
244
|
+
const headers = options?.headers ?? new Headers();
|
|
245
|
+
const body = options?.body ?? null;
|
|
180
246
|
return {
|
|
181
247
|
status,
|
|
182
248
|
statusText,
|
|
@@ -186,7 +252,6 @@ function __makeResponse(options) {
|
|
|
186
252
|
};
|
|
187
253
|
}
|
|
188
254
|
|
|
189
|
-
// src/request.ts
|
|
190
255
|
function __serializeBody(body) {
|
|
191
256
|
switch (true) {
|
|
192
257
|
case body instanceof FormData:
|
|
@@ -232,19 +297,19 @@ function __buildFieldDefaultValue(input) {
|
|
|
232
297
|
}
|
|
233
298
|
if (isFieldGroup(input)) {
|
|
234
299
|
const obj = {};
|
|
235
|
-
for (const [key,
|
|
236
|
-
obj[key] =
|
|
300
|
+
for (const [key, field] of Object.entries(input)) {
|
|
301
|
+
obj[key] = field();
|
|
237
302
|
}
|
|
238
303
|
return obj;
|
|
239
304
|
}
|
|
240
|
-
return;
|
|
305
|
+
return void 0;
|
|
241
306
|
}
|
|
242
307
|
function defineRequest(method, endpoint) {
|
|
243
308
|
let requiredInput = false;
|
|
244
|
-
let
|
|
309
|
+
let field;
|
|
245
310
|
let interceptors = [];
|
|
246
311
|
let responseType = "json";
|
|
247
|
-
let
|
|
312
|
+
let context;
|
|
248
313
|
let observe = "body";
|
|
249
314
|
let withCredentials = false;
|
|
250
315
|
let validators = [];
|
|
@@ -253,7 +318,7 @@ function defineRequest(method, endpoint) {
|
|
|
253
318
|
let uploadProgress;
|
|
254
319
|
let downloadProgress;
|
|
255
320
|
let abortSignal;
|
|
256
|
-
const getInitValue = () => __buildFieldDefaultValue(
|
|
321
|
+
const getInitValue = () => __buildFieldDefaultValue(field);
|
|
257
322
|
const setUploadProgress = (fn2) => {
|
|
258
323
|
uploadProgress = fn2;
|
|
259
324
|
};
|
|
@@ -288,41 +353,41 @@ function defineRequest(method, endpoint) {
|
|
|
288
353
|
} else if (timeout > 0) {
|
|
289
354
|
abortSignal = AbortSignal.timeout(timeout);
|
|
290
355
|
}
|
|
291
|
-
const
|
|
292
|
-
const clientOptions = getClientConfig(
|
|
356
|
+
const client = isClient(doRequestOptions?.client) ? doRequestOptions.client : getGlobalClient();
|
|
357
|
+
const clientOptions = getClientConfig(client);
|
|
293
358
|
const req = {
|
|
294
359
|
host: clientOptions?.host,
|
|
295
360
|
method,
|
|
296
361
|
endpoint,
|
|
297
|
-
queryParams: new URLSearchParams,
|
|
298
|
-
headers: new Headers,
|
|
299
|
-
body:
|
|
362
|
+
queryParams: new URLSearchParams(),
|
|
363
|
+
headers: new Headers(),
|
|
364
|
+
body: void 0,
|
|
300
365
|
withCredentials,
|
|
301
366
|
responseType,
|
|
302
|
-
context:
|
|
367
|
+
context: context || makeHttpContext(),
|
|
303
368
|
observe,
|
|
304
369
|
uploadProgress,
|
|
305
370
|
downloadProgress,
|
|
306
371
|
timeout,
|
|
307
372
|
abort: abortSignal
|
|
308
373
|
};
|
|
309
|
-
const
|
|
310
|
-
if (!
|
|
374
|
+
const handler = doRequestOptions?.handler || clientOptions?.handler || getGlobalHttpHandler();
|
|
375
|
+
if (!handler) {
|
|
311
376
|
throw ERR_NOT_FOUND_HANDLER;
|
|
312
377
|
}
|
|
313
|
-
if (requiredInput) {
|
|
314
|
-
await __fillRequestFromField(req,
|
|
378
|
+
if (requiredInput && field) {
|
|
379
|
+
await __fillRequestFromField(req, field, input);
|
|
315
380
|
}
|
|
316
381
|
const chain = makeInterceptorChain([...interceptors]);
|
|
317
|
-
let res = await chain(req,
|
|
382
|
+
let res = await chain(req, handler);
|
|
318
383
|
if (typeof transformResponse === "function") {
|
|
319
384
|
try {
|
|
320
385
|
res = __makeResponse({
|
|
321
386
|
...res,
|
|
322
387
|
body: transformResponse(res)
|
|
323
388
|
});
|
|
324
|
-
} catch (
|
|
325
|
-
throw new HttpErrorResponse({ error
|
|
389
|
+
} catch (error) {
|
|
390
|
+
throw new HttpErrorResponse({ error });
|
|
326
391
|
}
|
|
327
392
|
}
|
|
328
393
|
switch (req.observe) {
|
|
@@ -342,7 +407,7 @@ function defineRequest(method, endpoint) {
|
|
|
342
407
|
};
|
|
343
408
|
};
|
|
344
409
|
fn.withField = (value) => {
|
|
345
|
-
|
|
410
|
+
field = value;
|
|
346
411
|
requiredInput = true;
|
|
347
412
|
return fn;
|
|
348
413
|
};
|
|
@@ -351,7 +416,7 @@ function defineRequest(method, endpoint) {
|
|
|
351
416
|
return fn;
|
|
352
417
|
};
|
|
353
418
|
fn.withContext = (value) => {
|
|
354
|
-
|
|
419
|
+
context = value;
|
|
355
420
|
return fn;
|
|
356
421
|
};
|
|
357
422
|
fn.withCredentials = (value) => {
|
|
@@ -360,7 +425,6 @@ function defineRequest(method, endpoint) {
|
|
|
360
425
|
};
|
|
361
426
|
fn.withValidators = (value) => {
|
|
362
427
|
validators = value;
|
|
363
|
-
console.log(validators);
|
|
364
428
|
return fn;
|
|
365
429
|
};
|
|
366
430
|
fn.withTransformResponse = (value) => {
|
|
@@ -383,15 +447,6 @@ function __fillUrl(endpoint, params) {
|
|
|
383
447
|
});
|
|
384
448
|
}
|
|
385
449
|
async function __fillRequestFromField(request, fieldOrFieldGroup, input) {
|
|
386
|
-
async function doValid(validators, value) {
|
|
387
|
-
for (const validator of validators) {
|
|
388
|
-
const err = await validator(value);
|
|
389
|
-
if (err) {
|
|
390
|
-
return err;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
450
|
function inputIsObject(input2) {
|
|
396
451
|
return typeof input2 === "object" && input2 !== null;
|
|
397
452
|
}
|
|
@@ -428,57 +483,64 @@ async function __fillRequestFromField(request, fieldOrFieldGroup, input) {
|
|
|
428
483
|
sp.set(key, serializeToString(value));
|
|
429
484
|
return sp;
|
|
430
485
|
}
|
|
486
|
+
function getValidValue(value, defaultValue) {
|
|
487
|
+
switch (true) {
|
|
488
|
+
case typeof value === "undefined":
|
|
489
|
+
return defaultValue;
|
|
490
|
+
case (typeof value === "object" && value === null):
|
|
491
|
+
return value;
|
|
492
|
+
default:
|
|
493
|
+
return value;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
431
496
|
if (isField(fieldOrFieldGroup)) {
|
|
432
497
|
let params;
|
|
433
498
|
let queryParams;
|
|
434
499
|
let headers;
|
|
435
|
-
let body =
|
|
436
|
-
const
|
|
500
|
+
let body = void 0;
|
|
501
|
+
const validValue = getValidValue(input, fieldOrFieldGroup());
|
|
437
502
|
const meta = __getFieldMetadata(fieldOrFieldGroup);
|
|
438
|
-
|
|
439
|
-
if (err) {
|
|
440
|
-
throw err;
|
|
441
|
-
}
|
|
503
|
+
await doValid([...meta.validators, ...meta.asyncValidator], validValue);
|
|
442
504
|
for (const [type, aliasName] of meta.alias) {
|
|
443
505
|
switch (type) {
|
|
444
|
-
case
|
|
506
|
+
case FieldType.Query: {
|
|
445
507
|
if (!aliasName) {
|
|
446
508
|
throw ERR_NOT_SET_ALIAS;
|
|
447
509
|
}
|
|
448
|
-
queryParams = appendValue(new URLSearchParams, aliasName,
|
|
510
|
+
queryParams = appendValue(new URLSearchParams(), aliasName, validValue);
|
|
449
511
|
break;
|
|
450
512
|
}
|
|
451
|
-
case
|
|
513
|
+
case FieldType.Param: {
|
|
452
514
|
if (!aliasName) {
|
|
453
515
|
throw ERR_NOT_SET_ALIAS;
|
|
454
516
|
}
|
|
455
|
-
params = setValue(new Map, aliasName,
|
|
517
|
+
params = setValue(/* @__PURE__ */ new Map(), aliasName, validValue);
|
|
456
518
|
break;
|
|
457
519
|
}
|
|
458
|
-
case
|
|
520
|
+
case FieldType.Header: {
|
|
459
521
|
if (!aliasName) {
|
|
460
522
|
throw ERR_NOT_SET_ALIAS;
|
|
461
523
|
}
|
|
462
|
-
headers = appendValue(new Headers, aliasName,
|
|
524
|
+
headers = appendValue(new Headers(), aliasName, validValue);
|
|
463
525
|
break;
|
|
464
526
|
}
|
|
465
|
-
case
|
|
527
|
+
case FieldType.Form: {
|
|
466
528
|
if (!aliasName) {
|
|
467
529
|
throw ERR_NOT_SET_ALIAS;
|
|
468
530
|
}
|
|
469
|
-
body = appendValue(new FormData, aliasName,
|
|
531
|
+
body = appendValue(new FormData(), aliasName, validValue);
|
|
470
532
|
break;
|
|
471
533
|
}
|
|
472
|
-
case
|
|
534
|
+
case FieldType.UrlForm: {
|
|
473
535
|
if (!aliasName) {
|
|
474
536
|
throw ERR_NOT_SET_ALIAS;
|
|
475
537
|
}
|
|
476
|
-
body = appendValue(new URLSearchParams, aliasName,
|
|
538
|
+
body = appendValue(new URLSearchParams(), aliasName, validValue);
|
|
477
539
|
break;
|
|
478
540
|
}
|
|
479
|
-
case
|
|
480
|
-
case
|
|
481
|
-
body =
|
|
541
|
+
case FieldType.Json:
|
|
542
|
+
case FieldType.Body:
|
|
543
|
+
body = validValue;
|
|
482
544
|
break;
|
|
483
545
|
}
|
|
484
546
|
}
|
|
@@ -491,55 +553,52 @@ async function __fillRequestFromField(request, fieldOrFieldGroup, input) {
|
|
|
491
553
|
return;
|
|
492
554
|
}
|
|
493
555
|
if (isFieldGroup(fieldOrFieldGroup) && inputIsObject(input)) {
|
|
494
|
-
let params = new Map;
|
|
495
|
-
let queryParams = new URLSearchParams;
|
|
496
|
-
let headers = new Headers;
|
|
497
|
-
let urlForm = new URLSearchParams;
|
|
498
|
-
let formData = new FormData;
|
|
556
|
+
let params = /* @__PURE__ */ new Map();
|
|
557
|
+
let queryParams = new URLSearchParams();
|
|
558
|
+
let headers = new Headers();
|
|
559
|
+
let urlForm = new URLSearchParams();
|
|
560
|
+
let formData = new FormData();
|
|
499
561
|
const json = {};
|
|
500
|
-
let body =
|
|
562
|
+
let body = void 0;
|
|
501
563
|
let lastBodyField;
|
|
502
|
-
for (const [propertyKey,
|
|
503
|
-
const meta = __getFieldMetadata(
|
|
564
|
+
for (const [propertyKey, field] of Object.entries(fieldOrFieldGroup)) {
|
|
565
|
+
const meta = __getFieldMetadata(field);
|
|
504
566
|
for (const [type, aliasName] of meta.alias) {
|
|
505
567
|
const valueKey = aliasName || propertyKey;
|
|
506
|
-
const value = input[propertyKey]
|
|
507
|
-
|
|
508
|
-
if (err) {
|
|
509
|
-
throw err;
|
|
510
|
-
}
|
|
568
|
+
const value = getValidValue(input[propertyKey], field());
|
|
569
|
+
await doValid([...meta.validators, ...meta.asyncValidator], value);
|
|
511
570
|
switch (type) {
|
|
512
|
-
case
|
|
571
|
+
case FieldType.Json: {
|
|
513
572
|
Object.defineProperty(json, valueKey, {
|
|
514
573
|
value,
|
|
515
574
|
writable: true,
|
|
516
575
|
enumerable: true
|
|
517
576
|
});
|
|
518
|
-
lastBodyField =
|
|
577
|
+
lastBodyField = FieldType.Json;
|
|
519
578
|
break;
|
|
520
579
|
}
|
|
521
|
-
case
|
|
580
|
+
case FieldType.Query:
|
|
522
581
|
queryParams = appendValue(queryParams, valueKey, value);
|
|
523
582
|
break;
|
|
524
|
-
case
|
|
583
|
+
case FieldType.Param:
|
|
525
584
|
params = setValue(params, valueKey, value);
|
|
526
585
|
break;
|
|
527
|
-
case
|
|
586
|
+
case FieldType.Header:
|
|
528
587
|
headers = appendValue(headers, valueKey, value);
|
|
529
588
|
break;
|
|
530
|
-
case
|
|
589
|
+
case FieldType.Form: {
|
|
531
590
|
formData = appendValue(formData, valueKey, value);
|
|
532
|
-
lastBodyField =
|
|
591
|
+
lastBodyField = FieldType.Form;
|
|
533
592
|
break;
|
|
534
593
|
}
|
|
535
|
-
case
|
|
594
|
+
case FieldType.UrlForm: {
|
|
536
595
|
urlForm = appendValue(urlForm, valueKey, value);
|
|
537
|
-
lastBodyField =
|
|
596
|
+
lastBodyField = FieldType.UrlForm;
|
|
538
597
|
break;
|
|
539
598
|
}
|
|
540
|
-
case
|
|
599
|
+
case FieldType.Body: {
|
|
541
600
|
body = value;
|
|
542
|
-
lastBodyField =
|
|
601
|
+
lastBodyField = FieldType.Body;
|
|
543
602
|
break;
|
|
544
603
|
}
|
|
545
604
|
}
|
|
@@ -549,16 +608,16 @@ async function __fillRequestFromField(request, fieldOrFieldGroup, input) {
|
|
|
549
608
|
request.queryParams = queryParams;
|
|
550
609
|
request.headers = headers;
|
|
551
610
|
switch (lastBodyField) {
|
|
552
|
-
case
|
|
611
|
+
case FieldType.Body:
|
|
553
612
|
request.body = body;
|
|
554
613
|
break;
|
|
555
|
-
case
|
|
614
|
+
case FieldType.Form:
|
|
556
615
|
request.body = formData;
|
|
557
616
|
break;
|
|
558
|
-
case
|
|
617
|
+
case FieldType.UrlForm:
|
|
559
618
|
request.body = urlForm;
|
|
560
619
|
break;
|
|
561
|
-
case
|
|
620
|
+
case FieldType.Json:
|
|
562
621
|
request.body = json;
|
|
563
622
|
break;
|
|
564
623
|
}
|
|
@@ -567,66 +626,14 @@ async function __fillRequestFromField(request, fieldOrFieldGroup, input) {
|
|
|
567
626
|
throw ERR_UNSUPPORTED_FIELD_TYPE;
|
|
568
627
|
}
|
|
569
628
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
return 0;
|
|
629
|
+
function __createRequest(request) {
|
|
630
|
+
const url = new URL(request.endpoint, request.host);
|
|
631
|
+
if (request.queryParams) {
|
|
632
|
+
url.search = request.queryParams.toString();
|
|
575
633
|
}
|
|
576
|
-
const
|
|
577
|
-
if (isNaN(num)) {
|
|
578
|
-
return 0;
|
|
579
|
-
}
|
|
580
|
-
return num;
|
|
581
|
-
}
|
|
582
|
-
function __getContentType(headers) {
|
|
583
|
-
return headers.get("Content-Type") || "";
|
|
584
|
-
}
|
|
585
|
-
function __parseBody(params) {
|
|
586
|
-
const { request, content, contentType } = params;
|
|
587
|
-
const responseType = request.responseType;
|
|
588
|
-
if (!responseType) {
|
|
589
|
-
return null;
|
|
590
|
-
}
|
|
591
|
-
switch (responseType) {
|
|
592
|
-
case "json": {
|
|
593
|
-
const text = new TextDecoder().decode(content);
|
|
594
|
-
if (text === "") {
|
|
595
|
-
return null;
|
|
596
|
-
}
|
|
597
|
-
console.log(text);
|
|
598
|
-
return JSON.parse(text);
|
|
599
|
-
}
|
|
600
|
-
case "text":
|
|
601
|
-
return new TextDecoder().decode(content);
|
|
602
|
-
case "blob": {
|
|
603
|
-
return new Blob([content], { type: contentType });
|
|
604
|
-
}
|
|
605
|
-
case "arraybuffer":
|
|
606
|
-
return content.buffer;
|
|
607
|
-
default:
|
|
608
|
-
return null;
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
function __concatChunks(chunks, totalLength) {
|
|
612
|
-
const chunksAll = new Uint8Array(totalLength);
|
|
613
|
-
let position = 0;
|
|
614
|
-
for (const chunk of chunks) {
|
|
615
|
-
chunksAll.set(chunk, position);
|
|
616
|
-
position += chunk.length;
|
|
617
|
-
}
|
|
618
|
-
return chunksAll;
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
// src/handler/fetch/fetch.ts
|
|
622
|
-
function __createRequest(request2) {
|
|
623
|
-
const url = new URL(request2.endpoint, request2.host);
|
|
624
|
-
if (request2.queryParams) {
|
|
625
|
-
url.search = request2.queryParams.toString();
|
|
626
|
-
}
|
|
627
|
-
const headers = request2.headers ?? new Headers;
|
|
634
|
+
const headers = request.headers ?? new Headers();
|
|
628
635
|
if (!headers.has("Content-Type")) {
|
|
629
|
-
const detectedType = __detectContentTypeHeader(
|
|
636
|
+
const detectedType = __detectContentTypeHeader(request.body);
|
|
630
637
|
if (detectedType) {
|
|
631
638
|
headers.set("Content-Type", detectedType);
|
|
632
639
|
}
|
|
@@ -634,41 +641,40 @@ function __createRequest(request2) {
|
|
|
634
641
|
if (!headers.has("Accept")) {
|
|
635
642
|
headers.set("Accept", "application/json, text/plain, */*");
|
|
636
643
|
}
|
|
637
|
-
const credentials =
|
|
638
|
-
const fetchConfig = request2.context?.get(FETCH_CONFIG_KEY) || {};
|
|
644
|
+
const credentials = request.withCredentials ? "include" : void 0;
|
|
639
645
|
return new Request(url, {
|
|
640
|
-
...fetchConfig,
|
|
641
646
|
headers,
|
|
642
|
-
method:
|
|
643
|
-
body: __serializeBody(
|
|
644
|
-
signal:
|
|
647
|
+
method: request.method,
|
|
648
|
+
body: __serializeBody(request.body),
|
|
649
|
+
signal: request.abort,
|
|
645
650
|
credentials
|
|
646
651
|
});
|
|
647
652
|
}
|
|
648
653
|
async function fetchHandler(httpRequest) {
|
|
649
654
|
const downloadProgress = httpRequest.downloadProgress;
|
|
650
|
-
const
|
|
651
|
-
|
|
655
|
+
const request = __createRequest(httpRequest);
|
|
656
|
+
const abortSignal = httpRequest.abort;
|
|
657
|
+
let response;
|
|
652
658
|
try {
|
|
653
|
-
|
|
654
|
-
} catch (
|
|
655
|
-
if (
|
|
659
|
+
response = await globalThis.fetch(request);
|
|
660
|
+
} catch (error) {
|
|
661
|
+
if (abortSignal?.aborted && abortSignal.reason instanceof Error) {
|
|
656
662
|
switch (true) {
|
|
657
|
-
case
|
|
663
|
+
case abortSignal.reason.name === "AbortError":
|
|
658
664
|
throw new HttpErrorResponse({ error: ERR_ABORTED });
|
|
659
|
-
case
|
|
665
|
+
case abortSignal.reason.name === "TimeoutError":
|
|
660
666
|
throw new HttpErrorResponse({ error: ERR_TIMEOUT });
|
|
661
667
|
}
|
|
662
668
|
}
|
|
663
|
-
throw new HttpErrorResponse({ error
|
|
669
|
+
throw new HttpErrorResponse({ error });
|
|
664
670
|
}
|
|
665
|
-
const { ok, headers, status, statusText, url } =
|
|
671
|
+
const { ok, headers, status, statusText, url } = response;
|
|
666
672
|
const contentLength = __getContentLength(headers);
|
|
667
673
|
const contentType = __getContentType(headers);
|
|
668
674
|
let body = null;
|
|
669
|
-
if (
|
|
675
|
+
if (response.body) {
|
|
670
676
|
const chunks = [];
|
|
671
|
-
const reader =
|
|
677
|
+
const reader = response.body.getReader();
|
|
672
678
|
let receivedLength = 0;
|
|
673
679
|
while (true) {
|
|
674
680
|
const { done, value } = await reader.read();
|
|
@@ -690,9 +696,9 @@ async function fetchHandler(httpRequest) {
|
|
|
690
696
|
content: chunksAll,
|
|
691
697
|
contentType
|
|
692
698
|
});
|
|
693
|
-
} catch (
|
|
699
|
+
} catch (error) {
|
|
694
700
|
throw new HttpErrorResponse({
|
|
695
|
-
error
|
|
701
|
+
error,
|
|
696
702
|
status,
|
|
697
703
|
statusText,
|
|
698
704
|
headers,
|
|
@@ -717,20 +723,22 @@ async function fetchHandler(httpRequest) {
|
|
|
717
723
|
body
|
|
718
724
|
});
|
|
719
725
|
}
|
|
720
|
-
|
|
721
|
-
|
|
726
|
+
|
|
727
|
+
const CLIENT = Symbol("Client");
|
|
728
|
+
let globalClient;
|
|
722
729
|
function isClient(value) {
|
|
723
730
|
return typeof value === "object" && value !== null && CLIENT in value;
|
|
724
731
|
}
|
|
725
|
-
function getClientConfig(
|
|
726
|
-
if (!isClient(
|
|
732
|
+
function getClientConfig(client) {
|
|
733
|
+
if (!isClient(client)) {
|
|
727
734
|
throw ERR_INVALID_CLIENT;
|
|
728
735
|
}
|
|
729
|
-
return
|
|
736
|
+
return client[CLIENT];
|
|
730
737
|
}
|
|
731
738
|
function createClient(options) {
|
|
732
739
|
const conf = {
|
|
733
740
|
host: options.host,
|
|
741
|
+
strict: options.strict ?? true,
|
|
734
742
|
interceptors: options.interceptors ?? [],
|
|
735
743
|
handler: options.handler || fetchHandler
|
|
736
744
|
};
|
|
@@ -738,8 +746,8 @@ function createClient(options) {
|
|
|
738
746
|
[CLIENT]: conf
|
|
739
747
|
};
|
|
740
748
|
}
|
|
741
|
-
function cloneClient(
|
|
742
|
-
const preConf = getClientConfig(
|
|
749
|
+
function cloneClient(client, options) {
|
|
750
|
+
const preConf = getClientConfig(client);
|
|
743
751
|
const conf = {
|
|
744
752
|
...preConf,
|
|
745
753
|
...options
|
|
@@ -754,70 +762,68 @@ function getGlobalClient() {
|
|
|
754
762
|
}
|
|
755
763
|
return globalClient;
|
|
756
764
|
}
|
|
757
|
-
function setGlobalClient(
|
|
758
|
-
globalClient =
|
|
765
|
+
function setGlobalClient(client) {
|
|
766
|
+
globalClient = client;
|
|
759
767
|
}
|
|
760
768
|
function restGlobalClient() {
|
|
761
|
-
globalClient =
|
|
769
|
+
globalClient = void 0;
|
|
762
770
|
}
|
|
763
771
|
function createGlobalClient(options) {
|
|
764
772
|
globalClient = createClient(options);
|
|
765
773
|
}
|
|
766
|
-
|
|
767
|
-
var globalClient;
|
|
768
|
-
// src/interceptor/authorization/basic_auth_interceptor.ts
|
|
774
|
+
|
|
769
775
|
function basicAuthInterceptor(fn, options) {
|
|
770
776
|
let encode = options?.encode;
|
|
771
777
|
if (!encode) {
|
|
772
|
-
const btoa =
|
|
778
|
+
const btoa = globalThis.btoa;
|
|
773
779
|
if (typeof btoa !== "function") {
|
|
774
780
|
throw new Error("BasicAuthInterceptor is not supported in this environment");
|
|
775
781
|
}
|
|
776
782
|
encode = (data) => btoa(`${data.username}:${data.password}`);
|
|
777
783
|
}
|
|
778
784
|
return (req, next) => {
|
|
779
|
-
const headers = req.headers || new Headers;
|
|
785
|
+
const headers = req.headers || new Headers();
|
|
780
786
|
headers.set("Authorization", `Basic ${encode(fn())}`);
|
|
781
787
|
req.headers = headers;
|
|
782
788
|
return next(req);
|
|
783
789
|
};
|
|
784
790
|
}
|
|
785
|
-
|
|
786
|
-
|
|
791
|
+
|
|
792
|
+
const required = (value) => {
|
|
787
793
|
if (!value) {
|
|
788
794
|
return new Error("required");
|
|
789
795
|
}
|
|
790
796
|
return null;
|
|
791
797
|
};
|
|
792
|
-
|
|
798
|
+
const requiredTrue = (value) => {
|
|
793
799
|
if (typeof value !== "boolean" || !value) {
|
|
794
800
|
return new Error("requiredTrue");
|
|
795
801
|
}
|
|
796
802
|
return null;
|
|
797
803
|
};
|
|
798
|
-
|
|
804
|
+
const minLength = (min2) => {
|
|
799
805
|
return (value) => {
|
|
800
806
|
if (typeof value !== "string") {
|
|
801
807
|
return new Error("invalid string");
|
|
802
808
|
}
|
|
803
|
-
if (value.length <
|
|
804
|
-
return new Error(`minLength ${
|
|
809
|
+
if (value.length < min2) {
|
|
810
|
+
return new Error(`minLength ${min2}`);
|
|
805
811
|
}
|
|
806
812
|
return null;
|
|
807
813
|
};
|
|
808
814
|
};
|
|
809
|
-
|
|
815
|
+
const maxLength = (max2) => {
|
|
810
816
|
return (value) => {
|
|
811
817
|
if (typeof value !== "string") {
|
|
812
818
|
return new Error("invalid string");
|
|
813
819
|
}
|
|
814
|
-
if (value.length >
|
|
815
|
-
return new Error(`maxLength ${
|
|
820
|
+
if (value.length > max2) {
|
|
821
|
+
return new Error(`maxLength ${max2}`);
|
|
816
822
|
}
|
|
817
823
|
return null;
|
|
818
824
|
};
|
|
819
825
|
};
|
|
820
|
-
|
|
826
|
+
const min = (min2) => {
|
|
821
827
|
return (value) => {
|
|
822
828
|
if (typeof value !== "number" || isNaN(value)) {
|
|
823
829
|
return new Error("invalid number");
|
|
@@ -828,7 +834,7 @@ var min = (min2) => {
|
|
|
828
834
|
return null;
|
|
829
835
|
};
|
|
830
836
|
};
|
|
831
|
-
|
|
837
|
+
const max = (max2) => {
|
|
832
838
|
return (value) => {
|
|
833
839
|
if (typeof value !== "number" || isNaN(value)) {
|
|
834
840
|
return new Error("invalid number");
|
|
@@ -839,7 +845,7 @@ var max = (max2) => {
|
|
|
839
845
|
return null;
|
|
840
846
|
};
|
|
841
847
|
};
|
|
842
|
-
|
|
848
|
+
const pattern = (pattern2) => {
|
|
843
849
|
return (value) => {
|
|
844
850
|
if (typeof value !== "string") {
|
|
845
851
|
return new Error("invalid string");
|
|
@@ -850,43 +856,5 @@ var pattern = (pattern2) => {
|
|
|
850
856
|
return null;
|
|
851
857
|
};
|
|
852
858
|
};
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
setGlobalClient,
|
|
856
|
-
restGlobalClient,
|
|
857
|
-
requiredTrue,
|
|
858
|
-
required,
|
|
859
|
-
pattern,
|
|
860
|
-
minLength,
|
|
861
|
-
min,
|
|
862
|
-
maxLength,
|
|
863
|
-
max,
|
|
864
|
-
makeHttpContextToken,
|
|
865
|
-
makeHttpContext,
|
|
866
|
-
isHttpContextToken,
|
|
867
|
-
isFieldGroup,
|
|
868
|
-
isField,
|
|
869
|
-
isClient,
|
|
870
|
-
getGlobalClient,
|
|
871
|
-
field,
|
|
872
|
-
fetchHandler,
|
|
873
|
-
defineRequest,
|
|
874
|
-
createGlobalClient,
|
|
875
|
-
createClient,
|
|
876
|
-
cloneClient,
|
|
877
|
-
basicAuthInterceptor,
|
|
878
|
-
asyncValidatorField,
|
|
879
|
-
HttpErrorResponse,
|
|
880
|
-
FETCH_CONFIG_KEY,
|
|
881
|
-
ERR_UNSUPPORTED_FIELD_TYPE,
|
|
882
|
-
ERR_UNKNOWN,
|
|
883
|
-
ERR_TIMEOUT,
|
|
884
|
-
ERR_OBSERVE,
|
|
885
|
-
ERR_NOT_SET_ALIAS,
|
|
886
|
-
ERR_NOT_FOUND_HANDLER,
|
|
887
|
-
ERR_NOT_FOUND_GLOBAL_CLIENT,
|
|
888
|
-
ERR_NETWORK,
|
|
889
|
-
ERR_INVALID_HTTP_CONTEXT_TOKEN,
|
|
890
|
-
ERR_INVALID_CLIENT,
|
|
891
|
-
ERR_ABORTED
|
|
892
|
-
};
|
|
859
|
+
|
|
860
|
+
export { ERR_ABORTED, ERR_INVALID_CLIENT, ERR_INVALID_HTTP_CONTEXT_TOKEN, ERR_NETWORK, ERR_NOT_FOUND_GLOBAL_CLIENT, ERR_NOT_FOUND_HANDLER, ERR_NOT_SET_ALIAS, ERR_OBSERVE, ERR_TIMEOUT, ERR_UNKNOWN, ERR_UNSUPPORTED_FIELD_TYPE, HttpErrorResponse, basicAuthInterceptor, cloneClient, createClient, createGlobalClient, defineRequest, doValid, fetchHandler, field, getGlobalClient, isClient, isField, isFieldGroup, isHttpContextToken, makeHttpContext, makeHttpContextToken, max, maxLength, min, minLength, pattern, required, requiredTrue, restGlobalClient, setGlobalClient };
|