@basmilius/http-client 1.13.0 → 2.2.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.
Files changed (91) hide show
  1. package/README.md +12 -34
  2. package/dist/decorator/dto/clone.d.ts +0 -3
  3. package/dist/decorator/dto/fill.d.ts +0 -3
  4. package/dist/decorator/dto/helper/areEqual.d.ts +0 -4
  5. package/dist/decorator/dto/helper/assertDto.d.ts +0 -3
  6. package/dist/decorator/dto/helper/cloneDto.d.ts +0 -3
  7. package/dist/decorator/dto/helper/executeIfDtoDirtyAndMarkClean.d.ts +0 -3
  8. package/dist/decorator/dto/helper/isDto.d.ts +0 -3
  9. package/dist/decorator/dto/helper/isDtoClean.d.ts +0 -3
  10. package/dist/decorator/dto/helper/isDtoDirty.d.ts +0 -3
  11. package/dist/decorator/dto/helper/relateDtoTo.d.ts +0 -3
  12. package/dist/decorator/dto/helper/relateValueTo.d.ts +0 -3
  13. package/dist/decorator/dto/helper/trackDto.d.ts +0 -3
  14. package/dist/decorator/dto/helper/unrelateDtoFrom.d.ts +0 -3
  15. package/dist/decorator/dto/helper/unrelateValueFrom.d.ts +0 -3
  16. package/dist/decorator/dto/index.d.ts +1 -4
  17. package/dist/decorator/dto/toJSON.d.ts +0 -3
  18. package/dist/decorator/index.d.ts +1 -1
  19. package/dist/dto/Paginated.d.ts +2 -2
  20. package/dist/index.js +4 -0
  21. package/dist/{http-client.js.map → index.js.map} +4 -4
  22. package/package.json +14 -13
  23. package/src/adapter/HttpAdapter.ts +67 -0
  24. package/src/adapter/index.ts +1 -0
  25. package/src/decorator/adapter.ts +10 -0
  26. package/src/decorator/bound.ts +5 -0
  27. package/src/decorator/debounce.ts +30 -0
  28. package/src/decorator/dto/arrayProxy.ts +65 -0
  29. package/src/decorator/dto/classProxy.ts +49 -0
  30. package/src/decorator/dto/clone.ts +24 -0
  31. package/src/decorator/dto/constant.ts +7 -0
  32. package/src/decorator/dto/fill.ts +18 -0
  33. package/src/decorator/dto/helper/areEqual.ts +13 -0
  34. package/src/decorator/dto/helper/assertDto.ts +11 -0
  35. package/src/decorator/dto/helper/circularProtect.ts +35 -0
  36. package/src/decorator/dto/helper/cloneDto.ts +9 -0
  37. package/src/decorator/dto/helper/executeIfDtoDirtyAndMarkClean.ts +16 -0
  38. package/src/decorator/dto/helper/index.ts +37 -0
  39. package/src/decorator/dto/helper/instance.ts +5 -0
  40. package/src/decorator/dto/helper/isDto.ts +9 -0
  41. package/src/decorator/dto/helper/isDtoClean.ts +10 -0
  42. package/src/decorator/dto/helper/isDtoDirty.ts +10 -0
  43. package/src/decorator/dto/helper/markDtoClean.ts +29 -0
  44. package/src/decorator/dto/helper/markDtoDirty.ts +26 -0
  45. package/src/decorator/dto/helper/relateDtoTo.ts +13 -0
  46. package/src/decorator/dto/helper/relateValueTo.ts +22 -0
  47. package/src/decorator/dto/helper/trackDto.ts +13 -0
  48. package/src/decorator/dto/helper/triggerDto.ts +18 -0
  49. package/src/decorator/dto/helper/unrelateDtoFrom.ts +15 -0
  50. package/src/decorator/dto/helper/unrelateValueFrom.ts +22 -0
  51. package/src/decorator/dto/index.ts +78 -0
  52. package/src/decorator/dto/instance.ts +33 -0
  53. package/src/decorator/dto/instanceProxy.ts +89 -0
  54. package/src/decorator/dto/map.ts +4 -0
  55. package/src/decorator/dto/refProxy.ts +61 -0
  56. package/src/decorator/dto/serialize/deserialize.ts +5 -0
  57. package/src/decorator/dto/serialize/deserializeArray.ts +5 -0
  58. package/src/decorator/dto/serialize/deserializeDateTime.ts +6 -0
  59. package/src/decorator/dto/serialize/deserializeDto.ts +28 -0
  60. package/src/decorator/dto/serialize/deserializeObject.ts +9 -0
  61. package/src/decorator/dto/serialize/deserializeUnknown.ts +31 -0
  62. package/src/decorator/dto/serialize/index.ts +7 -0
  63. package/src/decorator/dto/serialize/isSerializedDateTime.ts +5 -0
  64. package/src/decorator/dto/serialize/isSerializedDto.ts +5 -0
  65. package/src/decorator/dto/serialize/serialize.ts +5 -0
  66. package/src/decorator/dto/serialize/serializeArray.ts +19 -0
  67. package/src/decorator/dto/serialize/serializeDateTime.ts +9 -0
  68. package/src/decorator/dto/serialize/serializeDto.ts +21 -0
  69. package/src/decorator/dto/serialize/serializeObject.ts +9 -0
  70. package/src/decorator/dto/serialize/serializeUnknown.ts +34 -0
  71. package/src/decorator/dto/serialize/types.ts +3 -0
  72. package/src/decorator/dto/serialize/uuid.ts +3 -0
  73. package/src/decorator/dto/symbols.ts +11 -0
  74. package/src/decorator/dto/toJSON.ts +20 -0
  75. package/src/decorator/index.ts +31 -0
  76. package/src/dto/BlobResponse.ts +20 -0
  77. package/src/dto/Paginated.ts +38 -0
  78. package/src/dto/RequestError.ts +33 -0
  79. package/src/dto/ValidationError.ts +38 -0
  80. package/src/dto/index.ts +4 -0
  81. package/src/http/BaseResponse.ts +31 -0
  82. package/src/http/BaseService.ts +8 -0
  83. package/src/http/HttpClient.ts +41 -0
  84. package/src/http/QueryString.ts +75 -0
  85. package/src/http/RequestBuilder.ts +222 -0
  86. package/src/http/helpers.ts +17 -0
  87. package/src/http/index.ts +19 -0
  88. package/src/index.ts +5 -0
  89. package/src/type/index.ts +74 -0
  90. package/LICENSE +0 -21
  91. package/dist/http-client.js +0 -1095
@@ -1,1095 +0,0 @@
1
- var __legacyDecorateClassTS = function(decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
4
- r = Reflect.decorate(decorators, target, key, desc);
5
- else
6
- for (var i = decorators.length - 1;i >= 0; i--)
7
- if (d = decorators[i])
8
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
- return c > 3 && r && Object.defineProperty(target, key, r), r;
10
- };
11
-
12
- // src/adapter/HttpAdapter.ts
13
- import { DateTime as DateTime4 } from "luxon";
14
-
15
- // src/decorator/adapter.ts
16
- function adapter_default(Parent) {
17
- return class extends Parent {
18
- constructor(...args) {
19
- throw new Error("@adapter: cannot create instance of class.");
20
- }
21
- };
22
- }
23
-
24
- // src/decorator/bound.ts
25
- function bound_default() {
26
- return (target, method) => {
27
- target[method] = target[method].bind(target);
28
- };
29
- }
30
-
31
- // src/decorator/debounce.ts
32
- function debounce_default(interval) {
33
- return (target, _, descriptor) => {
34
- descriptor.value = debounce(descriptor.value, interval, target);
35
- };
36
- }
37
- function debounce(fn, interval, $this) {
38
- let resolvers = [], rejecters = [], timeout = null;
39
- return (...args) => {
40
- clearTimeout(timeout);
41
- timeout = setTimeout(async () => {
42
- try {
43
- let result = await fn.apply($this, args);
44
- resolvers.forEach((resolve) => resolve(result));
45
- } catch (err) {
46
- rejecters.forEach((reject) => reject(err));
47
- }
48
- resolvers = [];
49
- rejecters = [];
50
- }, interval);
51
- return new Promise((resolve, reject) => {
52
- resolvers.push(resolve);
53
- rejecters.push(reject);
54
- });
55
- };
56
- }
57
-
58
- // src/decorator/dto/index.ts
59
- import { getPrototypeChain, setObjectMethod, setObjectValue } from "@basmilius/utils";
60
-
61
- // src/decorator/dto/constant.ts
62
- var ENABLE_CIRCULAR_LOGGING = false;
63
- var ENABLE_DIRTY_LOGGING = false;
64
- var ENABLE_REACTIVE_LOGGING = false;
65
- var ENABLE_GET_LOGGING = false;
66
- var ENABLE_SET_LOGGING = false;
67
- var ENABLE_SERIALIZATION_LOGGING = false;
68
- var OVERRIDE_CONSOLE_LOG = false;
69
-
70
- // src/decorator/dto/symbols.ts
71
- var ARGS = Symbol();
72
- var CHILDREN = Symbol();
73
- var DESCRIPTORS = Symbol();
74
- var DIRTY = Symbol();
75
- var NAME = Symbol();
76
- var PARENT = Symbol();
77
- var PARENT_KEY = Symbol();
78
- var PROPERTIES = Symbol();
79
- var PROXY = Symbol();
80
- var TRACK = Symbol();
81
- var TRIGGER = Symbol();
82
-
83
- // src/decorator/dto/helper/isDto.ts
84
- function isDto_default(obj) {
85
- return obj && typeof obj === "object" && !!obj[NAME];
86
- }
87
-
88
- // src/decorator/dto/helper/areEqual.ts
89
- function areEqual_default(a, b) {
90
- if (!isDto_default(a) || !isDto_default(b)) {
91
- return a === b;
92
- }
93
- return JSON.stringify(a) === JSON.stringify(b);
94
- }
95
-
96
- // src/decorator/dto/helper/assertDto.ts
97
- function assertDto_default(obj) {
98
- if (!isDto_default(obj)) {
99
- throw new Error("@dto assert given object is not a class decorated with @Dto.");
100
- }
101
- }
102
-
103
- // src/decorator/dto/helper/circularProtect.ts
104
- var CIRCULAR_MAP = Symbol();
105
- function circularProtect_default(fn, arg1 = 0, arg2) {
106
- return function(...args) {
107
- const hasMap = CIRCULAR_MAP in fn;
108
- const map = fn[CIRCULAR_MAP] ??= new WeakMap;
109
- const primary = args[arg1];
110
- const secondary = arg2 !== undefined ? args[arg2] : "self";
111
- if (typeof primary !== "object") {
112
- return fn.call(this, ...args);
113
- }
114
- if (!map.has(primary)) {
115
- map.set(primary, []);
116
- }
117
- if (map.get(primary).includes(secondary)) {
118
- ENABLE_CIRCULAR_LOGGING && console.log(`%c@dto %ccircular protect %cdetected a circular reference`, "color: #0891b2", "color: #059669", "color: #1d4ed8", { fn, primary, secondary });
119
- return;
120
- }
121
- map.get(primary).push(secondary);
122
- const result = fn.call(this, ...args);
123
- !hasMap && delete fn[CIRCULAR_MAP];
124
- return result;
125
- };
126
- }
127
-
128
- // src/decorator/dto/helper/cloneDto.ts
129
- function cloneDto_default(obj) {
130
- assertDto_default(obj);
131
- return obj.clone();
132
- }
133
-
134
- // src/decorator/dto/helper/isDtoDirty.ts
135
- function isDtoDirty_default(obj) {
136
- assertDto_default(obj);
137
- return obj[DIRTY];
138
- }
139
-
140
- // src/decorator/dto/helper/triggerDto.ts
141
- var triggerDto = circularProtect_default(function(dto, key, value, oldValue) {
142
- const trigger = dto[TRIGGER];
143
- trigger(dto, key, value, oldValue);
144
- ENABLE_REACTIVE_LOGGING && console.log(`%c@dto %c${dto[NAME]} %ctrigger`, "color: #0891b2", "color: #059669", "color: #1d4ed8", key, { dto, value, oldValue });
145
- dto[PARENT] && triggerDto(dto[PARENT], dto[PARENT_KEY], dto[PARENT][dto[PARENT_KEY]]);
146
- }, 0, 1);
147
- var triggerDto_default = triggerDto;
148
-
149
- // src/decorator/dto/helper/markDtoClean.ts
150
- var markDtoClean = circularProtect_default(function(obj) {
151
- assertDto_default(obj);
152
- if (obj[DIRTY]) {
153
- obj[DIRTY] = false;
154
- ENABLE_DIRTY_LOGGING && console.log(`%c@dto %c${obj[NAME]} %cdirty`, "color: #0891b2", "color: #059669", "color: #1d4ed8", "marked clean", { obj });
155
- triggerDto_default(obj, DIRTY, false, true);
156
- }
157
- if (!obj[CHILDREN] || obj[CHILDREN].length === 0) {
158
- return;
159
- }
160
- obj[CHILDREN].filter(isDtoDirty_default).forEach(markDtoClean);
161
- });
162
- var markDtoClean_default = markDtoClean;
163
-
164
- // src/decorator/dto/helper/executeIfDtoDirtyAndMarkClean.ts
165
- async function executeIfDtoDirtyAndMarkClean_default(obj, fn) {
166
- if (!isDto_default(obj) || !isDtoDirty_default(obj)) {
167
- return;
168
- }
169
- await fn(obj);
170
- markDtoClean_default(obj);
171
- }
172
-
173
- // src/decorator/dto/helper/instance.ts
174
- function instance_default(dto) {
175
- return dto?.value ?? dto;
176
- }
177
-
178
- // src/decorator/dto/helper/isDtoClean.ts
179
- function isDtoClean_default(obj) {
180
- assertDto_default(obj);
181
- return !obj[DIRTY];
182
- }
183
-
184
- // src/decorator/dto/helper/markDtoDirty.ts
185
- var markDtoDirty = circularProtect_default(function(obj, key) {
186
- assertDto_default(obj);
187
- if (!obj[DIRTY]) {
188
- obj[DIRTY] = true;
189
- ENABLE_DIRTY_LOGGING && console.log(`%c@dto %c${obj[NAME]} %cdirty`, "color: #0891b2", "color: #059669", "color: #1d4ed8", "marked dirty", { obj, key });
190
- triggerDto_default(obj, DIRTY, true, false);
191
- }
192
- if (!obj[PARENT]) {
193
- return;
194
- }
195
- markDtoDirty(obj[PARENT], obj[PARENT_KEY]);
196
- });
197
- var markDtoDirty_default = markDtoDirty;
198
-
199
- // src/decorator/dto/helper/relateDtoTo.ts
200
- function relateDtoTo_default(dto, parent, key) {
201
- parent[CHILDREN] ??= [];
202
- !parent[CHILDREN].includes(dto) && parent[CHILDREN].push(dto);
203
- dto[PARENT] !== parent && (dto[PARENT] = parent);
204
- dto[PARENT_KEY] !== key && (dto[PARENT_KEY] = key);
205
- }
206
-
207
- // src/decorator/dto/helper/relateValueTo.ts
208
- function relateValueTo_default(dto, key, value) {
209
- if (isDto_default(value)) {
210
- relateDtoTo_default(value, dto, key);
211
- } else if (Array.isArray(value)) {
212
- if (value.some(isDto_default)) {
213
- value.filter(isDto_default).forEach((val) => relateDtoTo_default(val, dto, key));
214
- }
215
- value[PARENT] = dto;
216
- value[PARENT_KEY] = key;
217
- }
218
- }
219
-
220
- // src/decorator/dto/helper/trackDto.ts
221
- function trackDto(dto, key) {
222
- const track = dto[TRACK];
223
- track(dto, key);
224
- ENABLE_REACTIVE_LOGGING && console.log(`%c@dto %c${dto[NAME]} %ctrack`, "color: #0891b2", "color: #059669", "color: #1d4ed8", key, { dto });
225
- }
226
-
227
- // src/decorator/dto/helper/unrelateDtoFrom.ts
228
- function unrelateDtoFrom_default(dto, parent) {
229
- if (CHILDREN in parent) {
230
- const index = parent[CHILDREN].indexOf(dto);
231
- parent[CHILDREN].splice(index, 1);
232
- }
233
- dto[PARENT] = undefined;
234
- dto[PARENT_KEY] = undefined;
235
- }
236
-
237
- // src/decorator/dto/helper/unrelateValueFrom.ts
238
- function unrelateValueFrom_default(dto, value) {
239
- if (isDto_default(value)) {
240
- unrelateDtoFrom_default(value, dto);
241
- } else if (Array.isArray(value)) {
242
- if (value.some(isDto_default)) {
243
- value.filter(isDto_default).forEach((val) => unrelateDtoFrom_default(val, dto));
244
- }
245
- value[PARENT] = undefined;
246
- value[PARENT_KEY] = undefined;
247
- }
248
- }
249
-
250
- // src/decorator/dto/map.ts
251
- var DTO_CLASS_MAP = {};
252
-
253
- // src/decorator/dto/classProxy.ts
254
- import { customRef, markRaw } from "vue";
255
-
256
- // src/decorator/dto/arrayProxy.ts
257
- var arrayProxy_default = {
258
- deleteProperty(target, key) {
259
- Reflect.deleteProperty(target, key);
260
- if (ignored(target, key)) {
261
- return true;
262
- }
263
- const dto = target[PARENT];
264
- dto && triggerDto_default(dto, target[PARENT_KEY], dto[target[PARENT_KEY]]);
265
- dto && markDtoDirty_default(dto, target[PARENT_KEY]);
266
- return true;
267
- },
268
- get(target, key, receiver) {
269
- if (key === PROXY) {
270
- return true;
271
- }
272
- if (ignored(target, key)) {
273
- return Reflect.get(target, key, receiver);
274
- }
275
- const dto = target[PARENT];
276
- dto && trackDto(dto, target[PARENT_KEY]);
277
- return Reflect.get(target, key);
278
- },
279
- set(target, key, value, receiver) {
280
- if (ignored(target, key)) {
281
- return Reflect.set(target, key, value, receiver);
282
- }
283
- const dto = target[PARENT];
284
- dto && triggerDto_default(dto, target[PARENT_KEY], dto[target[PARENT_KEY]]);
285
- dto && markDtoDirty_default(dto, target[PARENT_KEY]);
286
- return Reflect.set(target, key, value);
287
- }
288
- };
289
- function ignored(target, key) {
290
- return typeof key === "symbol" || typeof target[key] === "function" || key === "length";
291
- }
292
-
293
- // src/decorator/dto/instanceProxy.ts
294
- var instanceProxy_default = {
295
- get(target, key, receiver) {
296
- if (key === PROXY) {
297
- return true;
298
- }
299
- if (typeof key === "symbol") {
300
- return Reflect.get(target, key, receiver);
301
- }
302
- const descriptor = target[DESCRIPTORS][key];
303
- if (!descriptor || !descriptor.get) {
304
- return Reflect.get(target, key, receiver);
305
- }
306
- const value = descriptor.get.call(target);
307
- ENABLE_GET_LOGGING && console.log(`%c@dto %c${target[NAME]} %cget`, "color: #0891b2", "color: #059669", "color: #1d4ed8", key);
308
- trackDto(target, key);
309
- relateValueTo_default(target, key, value);
310
- return value;
311
- },
312
- getOwnPropertyDescriptor(target, key) {
313
- return target[DESCRIPTORS][key];
314
- },
315
- ownKeys(target) {
316
- return target[PROPERTIES];
317
- },
318
- set(target, key, value, receiver) {
319
- if (typeof key === "symbol") {
320
- return Reflect.set(target, key, value, receiver);
321
- }
322
- const descriptor = target[DESCRIPTORS][key];
323
- if (!descriptor || !descriptor.set) {
324
- return Reflect.set(target, key, value, receiver);
325
- }
326
- const oldValue = descriptor.get?.call(target) ?? undefined;
327
- if (areEqual_default(value, oldValue)) {
328
- return true;
329
- }
330
- unrelateValueFrom_default(target, oldValue);
331
- if (Array.isArray(value) && !value[PROXY]) {
332
- value = new Proxy(value, arrayProxy_default);
333
- }
334
- ENABLE_SET_LOGGING && console.log(`%c@dto %c${target[NAME]} %cset`, "color: #0891b2", "color: #059669", "color: #1d4ed8", key, { value });
335
- descriptor.set.call(target, value);
336
- relateValueTo_default(target, key, value);
337
- markDtoDirty_default(target, key);
338
- triggerDto_default(target, key, value, oldValue);
339
- return true;
340
- }
341
- };
342
-
343
- // src/decorator/dto/refProxy.ts
344
- var refProxy_default = {
345
- get(target, key, receiver) {
346
- if (key === "__v_isRef") {
347
- return false;
348
- }
349
- if (key === PROXY) {
350
- return true;
351
- }
352
- if (key in target) {
353
- return Reflect.get(target, key, receiver);
354
- }
355
- return Reflect.get(target.value, key);
356
- },
357
- getOwnPropertyDescriptor(target, key) {
358
- return Reflect.getOwnPropertyDescriptor(target.value, key);
359
- },
360
- ownKeys(target) {
361
- return Reflect.ownKeys(target.value);
362
- },
363
- set(target, key, value, receiver) {
364
- if (key in target) {
365
- return Reflect.set(target, key, value, receiver);
366
- }
367
- return Reflect.set(target.value, key, value);
368
- }
369
- };
370
-
371
- // src/decorator/dto/classProxy.ts
372
- var classProxy_default = {
373
- construct(target, argsArray, newTarget) {
374
- argsArray = argsArray.map((arg) => {
375
- if (!Array.isArray(arg)) {
376
- return arg;
377
- }
378
- return new Proxy(arg, arrayProxy_default);
379
- });
380
- const ref = customRef((track, trigger) => {
381
- const instance = markRaw(Reflect.construct(target, argsArray, newTarget));
382
- instance[ARGS] = argsArray;
383
- instance[DIRTY] = false;
384
- instance[TRACK] = track;
385
- instance[TRIGGER] = trigger;
386
- const proxied = new Proxy(instance, instanceProxy_default);
387
- return {
388
- get: () => {
389
- track();
390
- return proxied;
391
- },
392
- set: () => {
393
- return;
394
- }
395
- };
396
- });
397
- return new Proxy(ref, refProxy_default);
398
- }
399
- };
400
-
401
- // src/decorator/dto/clone.ts
402
- function clone_default() {
403
- const instance = this;
404
- assertDto_default(instance);
405
- const clazz = DTO_CLASS_MAP[instance[NAME]];
406
- const clone = new clazz(...instance[ARGS]);
407
- Object.entries(this[DESCRIPTORS]).filter(([, descriptor]) => !!descriptor.set).map(([name]) => name).forEach((key) => clone[key] = isDto_default(this[key]) ? this[key].clone() : this[key]);
408
- return clone;
409
- }
410
-
411
- // src/decorator/dto/fill.ts
412
- function fill_default(data) {
413
- for (let key in data) {
414
- const descriptor = this[DESCRIPTORS][key];
415
- if (isDto_default(this[key]) && typeof data[key] === "object") {
416
- this[key].fill(data[key]);
417
- } else if (descriptor && descriptor.set) {
418
- this[key] = data[key];
419
- }
420
- }
421
- }
422
-
423
- // src/decorator/dto/toJSON.ts
424
- function toJSON_default() {
425
- return Object.fromEntries(this[PROPERTIES].map((property) => {
426
- let value = Reflect.get.call(this, this, property, this);
427
- if (isDto_default(value)) {
428
- value = value.toJSON();
429
- }
430
- return [property, value];
431
- }));
432
- }
433
-
434
- // src/decorator/dto/index.ts
435
- function dto_default(clazz) {
436
- validate(clazz);
437
- const descriptors = Object.freeze(getPrototypeChain(clazz));
438
- const properties = Object.keys(descriptors);
439
- setObjectValue(clazz.prototype, DESCRIPTORS, descriptors);
440
- setObjectValue(clazz.prototype, NAME, clazz.name);
441
- setObjectValue(clazz.prototype, PROPERTIES, properties);
442
- setObjectValue(clazz, Symbol.hasInstance, (instance) => typeof instance === "object" && instance?.[NAME] === clazz.name);
443
- setObjectMethod(clazz, "clone", clone_default);
444
- setObjectMethod(clazz, "fill", fill_default);
445
- setObjectMethod(clazz, "toJSON", toJSON_default);
446
- return proxy(clazz);
447
- }
448
- function proxy(clazz) {
449
- const proxied = new Proxy(clazz, classProxy_default);
450
- DTO_CLASS_MAP[clazz.name] = proxied;
451
- return proxied;
452
- }
453
- function validate(clazz) {
454
- const parent = Object.getPrototypeOf(clazz.prototype);
455
- if (NAME in parent) {
456
- throw new Error(`⛔️ @dto ${clazz.name} cannot extend parent class which is also decorated with @dto ${parent[NAME]}.`);
457
- }
458
- }
459
- if (OVERRIDE_CONSOLE_LOG) {
460
- const _error = console.error.bind(console);
461
- const _info = console.info.bind(console);
462
- const _log = console.log.bind(console);
463
- const _warn = console.warn.bind(console);
464
- const override = (fn) => (...args) => {
465
- for (let i = args.length - 1;i >= 0; --i) {
466
- const arg = args[i];
467
- if (!isDto_default(arg)) {
468
- continue;
469
- }
470
- const dto = instance_default(arg);
471
- args.splice(i, 1, `\uD83D\uDCE6 ${dto[NAME]}`, dto.toJSON());
472
- }
473
- return fn(...args);
474
- };
475
- console.error = override(_error);
476
- console.info = override(_info);
477
- console.log = override(_log);
478
- console.warn = override(_warn);
479
- }
480
- // src/decorator/dto/serialize/deserializeArray.ts
481
- function deserializeArray_default(obj) {
482
- return obj.map(deserializeUnknown_default);
483
- }
484
-
485
- // src/decorator/dto/serialize/deserializeDateTime.ts
486
- import { DateTime } from "luxon";
487
- function deserializeDateTime_default([, iso]) {
488
- return DateTime.fromISO(iso);
489
- }
490
-
491
- // src/decorator/dto/serialize/deserializeObject.ts
492
- function deserializeObject_default(obj) {
493
- return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, deserializeUnknown_default(value)]).filter(([, value]) => value !== undefined));
494
- }
495
-
496
- // src/decorator/dto/serialize/deserializeDto.ts
497
- var CACHE = {};
498
- function deserializeDto_default([, id, name, state, args]) {
499
- if (!(name in DTO_CLASS_MAP)) {
500
- throw new Error(`Cannot restore @dto. Dto ${name} was not found.`);
501
- }
502
- if (id in CACHE) {
503
- return CACHE[id];
504
- }
505
- ENABLE_SERIALIZATION_LOGGING && console.group("⭐️", name, id);
506
- const Dto = DTO_CLASS_MAP[name];
507
- const instance = new Dto(...deserializeArray_default(args));
508
- instance.fill(deserializeObject_default(state));
509
- ENABLE_SERIALIZATION_LOGGING && console.groupEnd();
510
- CACHE[id] = instance;
511
- return instance;
512
- }
513
-
514
- // src/decorator/dto/serialize/isSerializedDateTime.ts
515
- function isSerializedDateTime_default(obj) {
516
- return Array.isArray(obj) && obj[0] === 3058;
517
- }
518
-
519
- // src/decorator/dto/serialize/isSerializedDto.ts
520
- function isSerializedDto_default(obj) {
521
- return Array.isArray(obj) && obj[0] === 3057;
522
- }
523
-
524
- // src/decorator/dto/serialize/deserializeUnknown.ts
525
- function deserializeUnknown_default(obj) {
526
- switch (true) {
527
- case obj === null:
528
- return null;
529
- case Array.isArray(obj):
530
- switch (true) {
531
- case isSerializedDateTime_default(obj):
532
- return deserializeDateTime_default(obj);
533
- case isSerializedDto_default(obj):
534
- return deserializeDto_default(obj);
535
- default:
536
- return deserializeArray_default(obj);
537
- }
538
- case typeof obj === "object":
539
- return deserializeObject_default(obj);
540
- default:
541
- return obj;
542
- }
543
- }
544
-
545
- // src/decorator/dto/serialize/deserialize.ts
546
- function deserialize_default(serialized) {
547
- return deserializeUnknown_default(JSON.parse(serialized));
548
- }
549
-
550
- // src/decorator/dto/serialize/serializeUnknown.ts
551
- import { DateTime as DateTime3 } from "luxon";
552
-
553
- // src/decorator/dto/serialize/serializeArray.ts
554
- import { DateTime as DateTime2 } from "luxon";
555
-
556
- // src/decorator/dto/serialize/serializeDateTime.ts
557
- function serializeDateTime_default(obj) {
558
- return [3058, obj.toISO({
559
- extendedZone: true,
560
- includeOffset: true
561
- })];
562
- }
563
-
564
- // src/decorator/dto/serialize/serializeDto.ts
565
- import { toRaw } from "vue";
566
-
567
- // src/decorator/dto/serialize/serializeObject.ts
568
- function serializeObject_default(obj) {
569
- return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, serializeUnknown_default(value)]).filter(([, value]) => value !== undefined));
570
- }
571
-
572
- // src/decorator/dto/serialize/uuid.ts
573
- function uuid_default() {
574
- return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16));
575
- }
576
-
577
- // src/decorator/dto/serialize/serializeDto.ts
578
- function serializeDto_default(obj) {
579
- obj = toRaw(obj);
580
- const json = obj.toJSON();
581
- return [
582
- 3057,
583
- uuid_default(),
584
- obj[NAME],
585
- serializeObject_default(json),
586
- serializeArray_default(obj[ARGS])
587
- ];
588
- }
589
-
590
- // src/decorator/dto/serialize/serializeArray.ts
591
- function serializeArray_default(obj) {
592
- switch (true) {
593
- case obj.every(isDto_default):
594
- return obj.map(serializeDto_default);
595
- case obj.every(DateTime2.isDateTime):
596
- return obj.map(serializeDateTime_default);
597
- default:
598
- return obj.map(serializeUnknown_default);
599
- }
600
- }
601
-
602
- // src/decorator/dto/serialize/serializeUnknown.ts
603
- function serializeUnknown_default(obj) {
604
- switch (true) {
605
- case obj === null:
606
- return null;
607
- case Array.isArray(obj):
608
- return serializeArray_default(obj);
609
- case isDto_default(obj):
610
- return serializeDto_default(obj);
611
- case DateTime3.isDateTime(obj):
612
- return serializeDateTime_default(obj);
613
- case typeof obj === "object":
614
- return serializeObject_default(obj);
615
- case typeof obj === "boolean":
616
- case typeof obj === "number":
617
- case typeof obj === "string":
618
- return obj;
619
- default:
620
- return;
621
- }
622
- }
623
-
624
- // src/decorator/dto/serialize/serialize.ts
625
- function serialize_default(obj) {
626
- return JSON.stringify(serializeUnknown_default(obj));
627
- }
628
- // src/dto/BlobResponse.ts
629
- class BlobResponse {
630
- get blob() {
631
- return this.#blob;
632
- }
633
- get name() {
634
- return this.#name;
635
- }
636
- #blob;
637
- #name;
638
- constructor(blob, name) {
639
- this.#blob = blob;
640
- this.#name = name;
641
- }
642
- }
643
- BlobResponse = __legacyDecorateClassTS([
644
- dto_default
645
- ], BlobResponse);
646
- // src/dto/Paginated.ts
647
- class Paginated {
648
- get items() {
649
- return this.#items;
650
- }
651
- get page() {
652
- return this.#page;
653
- }
654
- get pageSize() {
655
- return this.#pageSize;
656
- }
657
- get pages() {
658
- return this.#pages;
659
- }
660
- get totalItems() {
661
- return this.#totalItems;
662
- }
663
- #items;
664
- #page;
665
- #pageSize;
666
- #pages;
667
- #totalItems;
668
- constructor(items, page, pageSize, pages, totalItems) {
669
- this.#items = items;
670
- this.#page = page;
671
- this.#pageSize = pageSize;
672
- this.#pages = pages;
673
- this.#totalItems = totalItems;
674
- }
675
- }
676
- Paginated = __legacyDecorateClassTS([
677
- dto_default
678
- ], Paginated);
679
- // src/dto/RequestError.ts
680
- class RequestError {
681
- get code() {
682
- return this.#code;
683
- }
684
- get error() {
685
- return this.#error;
686
- }
687
- get errorDescription() {
688
- return this.#errorDescription;
689
- }
690
- get statusCode() {
691
- return this.#statusCode;
692
- }
693
- #code;
694
- #error;
695
- #errorDescription;
696
- #statusCode;
697
- constructor(code, error, errorDescription, statusCode) {
698
- this.#code = code;
699
- this.#error = error;
700
- this.#errorDescription = errorDescription;
701
- this.#statusCode = statusCode;
702
- }
703
- }
704
- RequestError = __legacyDecorateClassTS([
705
- dto_default
706
- ], RequestError);
707
- // src/dto/ValidationError.ts
708
- class ValidationError {
709
- get code() {
710
- return this.#code;
711
- }
712
- get error() {
713
- return this.#error;
714
- }
715
- get errorDescription() {
716
- return this.#errorDescription;
717
- }
718
- get errors() {
719
- return this.#errors;
720
- }
721
- get params() {
722
- return this.#params;
723
- }
724
- #code;
725
- #error;
726
- #errorDescription;
727
- #errors;
728
- #params;
729
- constructor(code, error, errorDescription, errors, params) {
730
- this.#code = code;
731
- this.#error = error;
732
- this.#errorDescription = errorDescription;
733
- this.#errors = errors;
734
- this.#params = params;
735
- }
736
- }
737
- ValidationError = __legacyDecorateClassTS([
738
- dto_default
739
- ], ValidationError);
740
- // src/adapter/HttpAdapter.ts
741
- class HttpAdapter {
742
- static parsePaginatedAdapter(response, adapterMethod) {
743
- return new Paginated(response["items"].map(adapterMethod), response["page"], response["page_size"], response["pages"], response["total_items"]);
744
- }
745
- static parseFileNameFromContentDispositionHeader(header) {
746
- const defaultFilename = `download-${DateTime4.now().toFormat("yyyy-MM-dd HH-mm-ss")}`;
747
- if (!header.startsWith("attachment")) {
748
- return defaultFilename;
749
- }
750
- const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
751
- const matches = filenameRegex.exec(header);
752
- if ((matches?.length || 0) < 2) {
753
- return defaultFilename;
754
- }
755
- return matches[1].replaceAll("'", "").replaceAll('"', "").replaceAll("/", "-").replaceAll(":", "-");
756
- }
757
- static parseRequestError(response, statusCode) {
758
- return new RequestError(response["code"], response["error"], response["error_description"], statusCode);
759
- }
760
- static parseValidationError(response) {
761
- let errors;
762
- if (response["errors"]) {
763
- errors = {};
764
- Object.entries(response["errors"]).forEach(([key, value]) => {
765
- errors[key] = HttpAdapter.parseValidationError(value);
766
- });
767
- }
768
- return new ValidationError(response["code"], response["error"], response["error_description"], errors, response["params"]);
769
- }
770
- }
771
- HttpAdapter = __legacyDecorateClassTS([
772
- adapter_default
773
- ], HttpAdapter);
774
- // src/http/BaseResponse.ts
775
- class BaseResponse {
776
- get data() {
777
- return this.#data;
778
- }
779
- get headers() {
780
- return this.#response.headers;
781
- }
782
- get ok() {
783
- return this.statusCode >= 200 && this.statusCode < 300;
784
- }
785
- get response() {
786
- return this.#response;
787
- }
788
- get statusCode() {
789
- return this.#response.status;
790
- }
791
- #data;
792
- #response;
793
- constructor(data, response) {
794
- this.#data = data;
795
- this.#response = response;
796
- }
797
- }
798
-
799
- // src/http/RequestBuilder.ts
800
- import { DateTime as DateTime5 } from "luxon";
801
-
802
- // src/http/HttpClient.ts
803
- class HttpClient {
804
- get authToken() {
805
- return this.#authToken;
806
- }
807
- set authToken(value) {
808
- this.#authToken = value;
809
- }
810
- get baseUrl() {
811
- return this.#baseUrl;
812
- }
813
- get dataField() {
814
- return this.#dataField;
815
- }
816
- #authToken;
817
- #baseUrl;
818
- #dataField;
819
- constructor(authToken, baseUrl, dataField = false) {
820
- this.#authToken = authToken;
821
- this.#baseUrl = baseUrl;
822
- this.#dataField = dataField;
823
- }
824
- static get instance() {
825
- if (HttpClient.#instance === null) {
826
- throw new Error("There is currently no HttpClient instance registered. Register one using the HttpClient.register() function.");
827
- }
828
- return HttpClient.#instance;
829
- }
830
- static #instance = null;
831
- static register(client) {
832
- HttpClient.#instance = client;
833
- }
834
- }
835
-
836
- // src/http/RequestBuilder.ts
837
- class RequestBuilder {
838
- get client() {
839
- return this.#client;
840
- }
841
- get options() {
842
- return this.#options;
843
- }
844
- get path() {
845
- return this.#path;
846
- }
847
- set path(value) {
848
- this.#path = value;
849
- }
850
- get query() {
851
- return this.#query;
852
- }
853
- set query(value) {
854
- this.#query = value;
855
- }
856
- #client;
857
- #path;
858
- #options = {};
859
- #query = null;
860
- constructor(path, client) {
861
- this.#client = client ?? HttpClient.instance;
862
- this.#options.cache = "no-cache";
863
- this.#options.method = "GET";
864
- this.#path = path;
865
- }
866
- bearerToken(token) {
867
- token = token ?? this.#client.authToken;
868
- if (token) {
869
- return this.header("Authorization", `Bearer ${token}`);
870
- }
871
- if (this.#options.headers && "Authorization" in this.#options.headers) {
872
- delete this.#options.headers["Authorization"];
873
- }
874
- return this;
875
- }
876
- body(body, contentType = "application/octet-stream") {
877
- if (body instanceof FormData) {
878
- contentType = null;
879
- } else if (Array.isArray(body) || typeof body === "object") {
880
- body = JSON.stringify(body);
881
- contentType = "application/json";
882
- }
883
- this.#options.body = body;
884
- if (contentType !== null) {
885
- return this.header("Content-Type", contentType);
886
- }
887
- return this;
888
- }
889
- header(name, value) {
890
- this.#options.headers = this.#options.headers || {};
891
- this.#options.headers[name] = value;
892
- return this;
893
- }
894
- method(method) {
895
- this.#options.method = method.toUpperCase();
896
- return this;
897
- }
898
- queryString(queryString) {
899
- this.#query = queryString;
900
- return this;
901
- }
902
- signal(signal = null) {
903
- this.#options.signal = signal;
904
- return this;
905
- }
906
- async fetch() {
907
- return this.#execute().then((r) => r.json());
908
- }
909
- async fetchBlob() {
910
- let response = await this.#execute();
911
- if (response.status !== 200) {
912
- const data = await response.json();
913
- if ("code" in data && "error" in data && "error_description" in data) {
914
- throw new RequestError(data.code, data.error, data.error_description, response.status);
915
- }
916
- throw new RequestError(-1, "failed_without_info", "Request failed without any information from the backend.", response.status);
917
- }
918
- let filename = response.headers.has("content-disposition") ? HttpAdapter.parseFileNameFromContentDispositionHeader(response.headers.get("content-disposition")) : `download-${DateTime5.now().toFormat("yyyy-MM-dd HH-mm-ss")}`;
919
- return new BlobResponse(await response.blob(), filename);
920
- }
921
- async run() {
922
- const { data, response } = await this.#executeSafe();
923
- return new BaseResponse(data, response);
924
- }
925
- async runAdapter(adapterMethod) {
926
- const { data, response } = await this.#executeSafe();
927
- return new BaseResponse(adapterMethod(data), response);
928
- }
929
- async runArrayAdapter(adapterMethod) {
930
- return this.runAdapter((data) => data.map(adapterMethod));
931
- }
932
- async runEmpty() {
933
- return await this.#executeSafe();
934
- }
935
- async runPaginatedAdapter(adapterMethod) {
936
- return this.runAdapter((response) => HttpAdapter.parsePaginatedAdapter(response, adapterMethod));
937
- }
938
- async runData() {
939
- return await this.#executeSafe();
940
- }
941
- async runDataKey(key) {
942
- const { data, response } = await this.#executeSafe();
943
- return new BaseResponse(data[key], response);
944
- }
945
- async runStatusCode() {
946
- const response = await this.#executeSafe();
947
- return response.statusCode;
948
- }
949
- async#execute() {
950
- let path = this.path;
951
- if (this.query !== null) {
952
- path += `?${this.query.build()}`;
953
- }
954
- return await fetch(this.client.baseUrl + path, this.options);
955
- }
956
- async#executeSafe() {
957
- return await this.#execute().then((response) => RequestBuilder.#handleResponse(response, this.client.dataField));
958
- }
959
- static async#handleResponse(response, dataField) {
960
- if (response.status === 204) {
961
- return new BaseResponse(null, response);
962
- }
963
- if (response.headers.has("content-type") && response.headers.get("content-type").startsWith("application/json")) {
964
- const data2 = await response.json();
965
- if ("code" in data2 && "error" in data2 && "error_description" in data2) {
966
- if ("errors" in data2) {
967
- throw HttpAdapter.parseValidationError(data2);
968
- }
969
- throw HttpAdapter.parseRequestError(data2, response.status);
970
- }
971
- if (dataField && "data" in data2) {
972
- return new BaseResponse(data2.data, response);
973
- }
974
- return new BaseResponse(data2, response);
975
- }
976
- if (response.status === 401 || response.status === 403) {
977
- return new BaseResponse(null, response);
978
- }
979
- const data = await response.text();
980
- if (data.length === 0 && response.status >= 200 && response.status < 300) {
981
- return new BaseResponse(null, response);
982
- }
983
- throw new RequestError(-1, "not_a_json_response", "The response was not a JSON response.", response.status);
984
- }
985
- }
986
-
987
- // src/http/BaseService.ts
988
- class BaseService {
989
- request(path, client) {
990
- return new RequestBuilder(path, client);
991
- }
992
- }
993
-
994
- // src/http/QueryString.ts
995
- class QueryString {
996
- #builder;
997
- constructor() {
998
- this.#builder = new URLSearchParams;
999
- }
1000
- build() {
1001
- return this.#builder.toString();
1002
- }
1003
- append(name, value) {
1004
- return this.#add(this.#builder.append.bind(this.#builder), name, value);
1005
- }
1006
- appendArray(name, values) {
1007
- if (values === undefined || values === null) {
1008
- return this;
1009
- }
1010
- values.forEach((value) => this.append(name, value));
1011
- return this;
1012
- }
1013
- delete(name) {
1014
- this.#builder.delete(name);
1015
- return this;
1016
- }
1017
- get(name) {
1018
- return this.#builder.get(name);
1019
- }
1020
- getAll(name) {
1021
- return this.#builder.getAll(name);
1022
- }
1023
- has(name) {
1024
- return this.#builder.has(name);
1025
- }
1026
- set(name, value) {
1027
- return this.#add(this.#builder.set.bind(this.#builder), name, value);
1028
- }
1029
- #add(fn, name, value) {
1030
- if (!value && value !== false) {
1031
- return this;
1032
- }
1033
- switch (typeof value) {
1034
- case "boolean":
1035
- fn(name, value ? "true" : "false");
1036
- break;
1037
- case "number":
1038
- fn(name, value.toString(10));
1039
- break;
1040
- case "string":
1041
- fn(name, value);
1042
- break;
1043
- }
1044
- return this;
1045
- }
1046
- static builder() {
1047
- return new QueryString;
1048
- }
1049
- }
1050
-
1051
- // src/http/helpers.ts
1052
- function isRequestError(obj) {
1053
- return obj instanceof RequestError;
1054
- }
1055
- function isUnsanctionedRequest(statusCode) {
1056
- if (statusCode instanceof RequestError) {
1057
- statusCode = statusCode.statusCode;
1058
- }
1059
- return statusCode === 403 || statusCode === 401;
1060
- }
1061
- function isValidationError(obj) {
1062
- return obj instanceof ValidationError;
1063
- }
1064
- export {
1065
- serialize_default as serialize,
1066
- markDtoDirty_default as markDtoDirty,
1067
- markDtoClean_default as markDtoClean,
1068
- isValidationError,
1069
- isUnsanctionedRequest,
1070
- isRequestError,
1071
- isDtoDirty_default as isDtoDirty,
1072
- isDtoClean_default as isDtoClean,
1073
- isDto_default as isDto,
1074
- executeIfDtoDirtyAndMarkClean_default as executeIfDtoDirtyAndMarkClean,
1075
- dto_default as dto,
1076
- deserialize_default as deserialize,
1077
- debounce_default as debounce,
1078
- cloneDto_default as cloneDto,
1079
- bound_default as bound,
1080
- assertDto_default as assertDto,
1081
- adapter_default as adapter,
1082
- ValidationError,
1083
- RequestError,
1084
- RequestBuilder,
1085
- QueryString,
1086
- Paginated,
1087
- HttpClient,
1088
- HttpAdapter,
1089
- BlobResponse,
1090
- BaseService,
1091
- BaseResponse
1092
- };
1093
-
1094
- //# debugId=AD0CA21D25D97D8A64756E2164756E21
1095
- //# sourceMappingURL=http-client.js.map