typedrest 0.4.1 → 0.5.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 (62) hide show
  1. package/README.md +2 -0
  2. package/endpoints/Endpoint.js +9 -22
  3. package/endpoints/EntryEndpoint.js +3 -14
  4. package/endpoints/generic/ETagEndpointBase.js +27 -42
  5. package/endpoints/generic/ElementEndpoint.js +39 -60
  6. package/endpoints/generic/GenericCollectionEndpoint.js +70 -44
  7. package/endpoints/generic/GenericCollectionEndpoint.test.ts +123 -0
  8. package/endpoints/generic/GenericCollectionEndpoint.ts +54 -1
  9. package/endpoints/generic/PartialResponse.js +33 -0
  10. package/endpoints/generic/PartialResponse.ts +28 -0
  11. package/endpoints/generic/index.js +2 -1
  12. package/endpoints/generic/index.ts +1 -0
  13. package/endpoints/index.js +3 -2
  14. package/endpoints/index.ts +1 -0
  15. package/endpoints/raw/BlobEndpoint.js +10 -27
  16. package/endpoints/raw/UploadEndpoint.js +11 -22
  17. package/endpoints/reactive/Delay.js +27 -0
  18. package/endpoints/reactive/Delay.ts +26 -0
  19. package/endpoints/reactive/GenericStreamingCollectionEndpoint.js +79 -0
  20. package/endpoints/reactive/GenericStreamingCollectionEndpoint.ts +73 -0
  21. package/endpoints/reactive/PollingEndpoint.js +67 -0
  22. package/endpoints/reactive/PollingEndpoint.test.ts +84 -0
  23. package/endpoints/reactive/PollingEndpoint.ts +66 -0
  24. package/endpoints/reactive/SseStreamingEndpoint.js +120 -0
  25. package/endpoints/reactive/SseStreamingEndpoint.test.ts +169 -0
  26. package/endpoints/reactive/SseStreamingEndpoint.ts +115 -0
  27. package/endpoints/reactive/StreamingCollectionEndpoint.js +23 -0
  28. package/endpoints/reactive/StreamingCollectionEndpoint.test.ts +110 -0
  29. package/endpoints/reactive/StreamingCollectionEndpoint.ts +20 -0
  30. package/endpoints/reactive/StreamingEndpoint.js +56 -0
  31. package/endpoints/reactive/StreamingEndpoint.test.ts +130 -0
  32. package/endpoints/reactive/StreamingEndpoint.ts +50 -0
  33. package/endpoints/reactive/index.js +22 -0
  34. package/endpoints/reactive/index.ts +5 -0
  35. package/endpoints/rpc/ActionEndpoint.js +3 -14
  36. package/endpoints/rpc/ConsumerEndpoint.js +5 -16
  37. package/endpoints/rpc/FunctionEndpoint.js +6 -17
  38. package/endpoints/rpc/ProducerEndpoint.js +4 -15
  39. package/endpoints/rpc/RpcEndpointBase.js +3 -14
  40. package/errors/DefaultErrorHandler.js +19 -27
  41. package/errors/DefaultErrorHandler.ts +4 -1
  42. package/errors/Errors.js +8 -2
  43. package/errors/Errors.ts +5 -0
  44. package/http/EntityStream.js +42 -0
  45. package/http/EntityStream.ts +40 -0
  46. package/http/HttpContentRange.js +39 -0
  47. package/http/HttpContentRange.ts +41 -0
  48. package/http/HttpHeader.js +6 -1
  49. package/http/HttpHeader.ts +6 -1
  50. package/http/HttpStatusCode.js +4 -1
  51. package/http/HttpStatusCode.ts +4 -1
  52. package/http/ResponseCache.js +4 -15
  53. package/http/RetryAfter.js +24 -0
  54. package/http/RetryAfter.ts +19 -0
  55. package/http/ServerSentEvents.js +140 -0
  56. package/http/ServerSentEvents.ts +145 -0
  57. package/http/index.js +5 -1
  58. package/http/index.ts +4 -0
  59. package/links/AggregateLinkExtractor.js +7 -18
  60. package/links/HalLinkExtractor.js +9 -20
  61. package/links/HeaderLinkExtractor.js +4 -15
  62. package/package.json +8 -8
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Yields the lines terminated by `\n`, `\r\n` or `\r` within the first `limit` characters of `buffer`.
3
+ * @returns The remaining characters that are not part of a terminated line.
4
+ */
5
+ function* splitLines(buffer: string, limit: number): Generator<string, string> {
6
+ let start = 0;
7
+
8
+ for (let index = 0; index < limit; index++) {
9
+ const char = buffer[index];
10
+ if (char !== "\n" && char !== "\r") continue;
11
+
12
+ yield buffer.slice(start, index);
13
+ if (char === "\r" && buffer[index + 1] === "\n") index++;
14
+ start = index + 1;
15
+ }
16
+
17
+ return buffer.slice(start);
18
+ }
19
+
20
+ /**
21
+ * A single event read from a Server-Sent Events (SSE) stream.
22
+ */
23
+ export class ServerSentEvent {
24
+ /**
25
+ * Creates a new event.
26
+ * @param type The event type from the `event:` field. {@link defaultEventType} if the server did not specify one.
27
+ * @param data The concatenated content of the event's `data:` fields.
28
+ * @param id The id of the most recent `id:` field if any.
29
+ */
30
+ constructor(public readonly type: string, public readonly data: string, public readonly id?: string) {
31
+ }
32
+ }
33
+
34
+ /**
35
+ * The event type used for events without an explicit `event:` field.
36
+ */
37
+ export const defaultEventType = "message";
38
+
39
+ /**
40
+ * Reads {@link ServerSentEvent}s from the body of a `Response` in the `text/event-stream` format.
41
+ */
42
+ export class SseReader {
43
+ /**
44
+ * Creates a new reader.
45
+ * @param response The response to read the body from.
46
+ */
47
+ constructor(private readonly response: Response) {
48
+ }
49
+
50
+ private _lastEventId?: string;
51
+
52
+ /**
53
+ * The id of the most recent event that carried an `id:` field.<br>
54
+ * Send this back as a {@link HttpHeader.LastEventId} header when reconnecting to let the server resume where it left off.
55
+ */
56
+ get lastEventId() { return this._lastEventId; }
57
+
58
+ private _reconnectionInterval?: number;
59
+
60
+ /**
61
+ * The reconnection interval in milliseconds most recently requested by the server via a `retry:` field if any.
62
+ */
63
+ get reconnectionInterval() { return this._reconnectionInterval; }
64
+
65
+ /**
66
+ * Reads events until the stream ends.<br>
67
+ * Any event that is still incomplete when the stream ends is discarded.
68
+ */
69
+ async *events(): AsyncIterableIterator<ServerSentEvent> {
70
+ let type: string | undefined;
71
+ let data = "";
72
+
73
+ for await (const line of this.lines()) {
74
+ if (line === "") {
75
+ // A blank line dispatches the event collected so far
76
+ if (data !== "") {
77
+ // Every data field appended a trailing newline; the last one is not part of the payload
78
+ yield new ServerSentEvent(type ?? defaultEventType, data.slice(0, -1), this._lastEventId);
79
+ data = "";
80
+ }
81
+ type = undefined;
82
+ continue;
83
+ }
84
+
85
+ // Lines starting with a colon are comments, e.g. the ":ping" some servers send to keep the connection alive
86
+ if (line.startsWith(":")) continue;
87
+
88
+ const colonIndex = line.indexOf(":");
89
+ const field = (colonIndex === -1) ? line : line.slice(0, colonIndex);
90
+ const value = (colonIndex === -1) ? ""
91
+ : line.slice((line[colonIndex + 1] === " ") ? colonIndex + 2 : colonIndex + 1);
92
+
93
+ switch (field) {
94
+ case "event":
95
+ type = value;
96
+ break;
97
+ case "data":
98
+ data += value + "\n";
99
+ break;
100
+ case "id":
101
+ if (value.indexOf("\0") === -1) this._lastEventId = value;
102
+ break;
103
+ case "retry":
104
+ if (/^\d+$/.test(value)) this._reconnectionInterval = parseInt(value);
105
+ break;
106
+ }
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Splits the response body into lines, accepting `\n`, `\r\n` and `\r` as terminators.
112
+ */
113
+ private async *lines(): AsyncIterableIterator<string> {
114
+ if (!this.response.body) return;
115
+
116
+ const reader = this.response.body.getReader();
117
+ const decoder = new TextDecoder();
118
+ let buffer = "";
119
+ let stripBom = true;
120
+
121
+ try {
122
+ while (true) {
123
+ const { done, value } = await reader.read();
124
+ if (done) break;
125
+
126
+ buffer += decoder.decode(value, { stream: true });
127
+
128
+ if (stripBom && buffer !== "") {
129
+ if (buffer.charCodeAt(0) === 0xFEFF) buffer = buffer.slice(1);
130
+ stripBom = false;
131
+ }
132
+
133
+ // NOTE: Keep a trailing "\r" buffered; it may still be followed by a "\n" in the next chunk.
134
+ buffer = yield* splitLines(buffer, buffer.endsWith("\r") ? buffer.length - 1 : buffer.length);
135
+ }
136
+
137
+ // NOTE: A line that is still unterminated once the stream ends is discarded.
138
+ buffer += decoder.decode();
139
+ yield* splitLines(buffer, buffer.length);
140
+ } finally {
141
+ // NOTE: Ignore errors here so that a failure that already ended the stream is not masked.
142
+ await reader.cancel().catch(() => { });
143
+ }
144
+ }
145
+ }
package/http/index.js CHANGED
@@ -20,4 +20,8 @@ __exportStar(require("./HttpHeader"), exports);
20
20
  __exportStar(require("./HttpClient"), exports);
21
21
  __exportStar(require("./FetchHttpClient"), exports);
22
22
  __exportStar(require("./ResponseCache"), exports);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLG1EQUFpQztBQUNqQywrQ0FBNkI7QUFDN0IsK0NBQTZCO0FBQzdCLG9EQUFrQztBQUNsQyxrREFBZ0MifQ==
23
+ __exportStar(require("./HttpContentRange"), exports);
24
+ __exportStar(require("./RetryAfter"), exports);
25
+ __exportStar(require("./EntityStream"), exports);
26
+ __exportStar(require("./ServerSentEvents"), exports);
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLG1EQUFpQztBQUNqQywrQ0FBNkI7QUFDN0IsK0NBQTZCO0FBQzdCLG9EQUFrQztBQUNsQyxrREFBZ0M7QUFDaEMscURBQW1DO0FBQ25DLCtDQUE2QjtBQUM3QixpREFBK0I7QUFDL0IscURBQW1DIn0=
package/http/index.ts CHANGED
@@ -4,3 +4,7 @@ export * from "./HttpHeader";
4
4
  export * from "./HttpClient";
5
5
  export * from "./FetchHttpClient";
6
6
  export * from "./ResponseCache";
7
+ export * from "./HttpContentRange";
8
+ export * from "./RetryAfter";
9
+ export * from "./EntityStream";
10
+ export * from "./ServerSentEvents";
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.AggregateLinkExtractor = void 0;
13
4
  /**
@@ -24,15 +15,13 @@ class AggregateLinkExtractor {
24
15
  /**
25
16
  * @inheritDoc
26
17
  */
27
- getLinks(response) {
28
- return __awaiter(this, void 0, void 0, function* () {
29
- let result = [];
30
- for (const extractor of this.extractors) {
31
- result = result.concat(yield extractor.getLinks(response));
32
- }
33
- return result;
34
- });
18
+ async getLinks(response) {
19
+ let result = [];
20
+ for (const extractor of this.extractors) {
21
+ result = result.concat(await extractor.getLinks(response));
22
+ }
23
+ return result;
35
24
  }
36
25
  }
37
26
  exports.AggregateLinkExtractor = AggregateLinkExtractor;
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRlTGlua0V4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkFnZ3JlZ2F0ZUxpbmtFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjtJQUcvQjs7O09BR0c7SUFDSCxZQUFZLEdBQUcsVUFBMkI7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0csUUFBUSxDQUFDLFFBQWtCOztZQUM3QixJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUM7WUFDeEIsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO0tBQUE7Q0FDSjtBQXJCRCx3REFxQkMifQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRlTGlua0V4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkFnZ3JlZ2F0ZUxpbmtFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0E7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjtJQUcvQjs7O09BR0c7SUFDSCxZQUFZLEdBQUcsVUFBMkI7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFrQjtRQUM3QixJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUM7UUFDeEIsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSjtBQXJCRCx3REFxQkMifQ==
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.HalLinkExtractor = void 0;
13
4
  const Link_1 = require("./Link");
@@ -19,16 +10,14 @@ class HalLinkExtractor {
19
10
  /**
20
11
  * @inheritDoc
21
12
  */
22
- getLinks(response) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- const contentType = response.headers.get(http_1.HttpHeader.ContentType);
25
- if (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith("application/hal+json")) {
26
- return this.parseJsonBody(yield response.clone().json());
27
- }
28
- else {
29
- return [];
30
- }
31
- });
13
+ async getLinks(response) {
14
+ const contentType = response.headers.get(http_1.HttpHeader.ContentType);
15
+ if (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith("application/hal+json")) {
16
+ return this.parseJsonBody(await response.clone().json());
17
+ }
18
+ else {
19
+ return [];
20
+ }
32
21
  }
33
22
  parseJsonBody(body) {
34
23
  const links = [];
@@ -54,4 +43,4 @@ class HalLinkExtractor {
54
43
  }
55
44
  }
56
45
  exports.HalLinkExtractor = HalLinkExtractor;
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFsTGlua0V4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkhhbExpbmtFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQThCO0FBRTlCLGtDQUFxQztBQUVyQzs7R0FFRztBQUNILE1BQWEsZ0JBQWdCO0lBQ3pCOztPQUVHO0lBQ0csUUFBUSxDQUFDLFFBQWtCOztZQUM3QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pFLElBQUksV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdELENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLEVBQUUsQ0FBQztZQUNkLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFTyxhQUFhLENBQUMsSUFBUztRQUMzQixNQUFNLEtBQUssR0FBVyxFQUFFLENBQUM7UUFFekIsTUFBTSxhQUFhLEdBQTRCLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxTQUFTLENBQUMsR0FBVyxFQUFFLEdBQVE7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sSUFBSSxXQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVFLENBQUM7Q0FDSjtBQXJDRCw0Q0FxQ0MifQ==
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFsTGlua0V4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkhhbExpbmtFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQThCO0FBRTlCLGtDQUFxQztBQUVyQzs7R0FFRztBQUNILE1BQWEsZ0JBQWdCO0lBQ3pCOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFrQjtRQUM3QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVM7UUFDM0IsTUFBTSxLQUFLLEdBQVcsRUFBRSxDQUFDO1FBRXpCLE1BQU0sYUFBYSxHQUE0QixJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNELElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDMUMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQVcsRUFBRSxHQUFRO1FBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM5RSxPQUFPLElBQUksV0FBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0o7QUFyQ0QsNENBcUNDIn0=
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.HeaderLinkExtractor = void 0;
13
4
  const Link_1 = require("./Link");
@@ -19,11 +10,9 @@ class HeaderLinkExtractor {
19
10
  /**
20
11
  * @inheritDoc
21
12
  */
22
- getLinks(response) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- var _a, _b, _c;
25
- return (_c = (_b = (_a = response.headers.get(http_1.HttpHeader.Link)) === null || _a === void 0 ? void 0 : _a.match(/<[^>]*>\s*(\s*;\s*[^\(\)<>@,;:"\/\[\]\?={} \t]+=(([^\(\)<>@,;:"\/\[\]\?={} \t]+)|("[^"]*")))*(,|$)/g)) === null || _b === void 0 ? void 0 : _b.map(value => this.parseLink(value))) !== null && _c !== void 0 ? _c : [];
26
- });
13
+ async getLinks(response) {
14
+ var _a, _b, _c;
15
+ return (_c = (_b = (_a = response.headers.get(http_1.HttpHeader.Link)) === null || _a === void 0 ? void 0 : _a.match(/<[^>]*>\s*(\s*;\s*[^\(\)<>@,;:"\/\[\]\?={} \t]+=(([^\(\)<>@,;:"\/\[\]\?={} \t]+)|("[^"]*")))*(,|$)/g)) === null || _b === void 0 ? void 0 : _b.map(value => this.parseLink(value))) !== null && _c !== void 0 ? _c : [];
27
16
  }
28
17
  parseLink(value) {
29
18
  var _a;
@@ -65,4 +54,4 @@ class HeaderLinkExtractor {
65
54
  }
66
55
  }
67
56
  exports.HeaderLinkExtractor = HeaderLinkExtractor;
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGVyTGlua0V4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkhlYWRlckxpbmtFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQThCO0FBRTlCLGtDQUFxQztBQUVyQzs7R0FFRztBQUNILE1BQWEsbUJBQW1CO0lBQzVCOztPQUVHO0lBQ0csUUFBUSxDQUFDLFFBQWtCOzs7WUFDN0IsT0FBTyxNQUFBLE1BQUEsTUFBQSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBVSxDQUFDLElBQUksQ0FBQywwQ0FDdEMsS0FBSyxDQUFDLHFHQUFxRyxDQUFDLDBDQUM1RyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLG1DQUNsQyxFQUFFLENBQUM7UUFDZCxDQUFDO0tBQUE7SUFFTyxTQUFTLENBQUMsS0FBYTs7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxHQUF1QixDQUFDO1FBQzVCLElBQUksS0FBeUIsQ0FBQztRQUM5QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFdEIsTUFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQywwQ0FBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDN0csTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDMUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUM1QixHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMzQixDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9DLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3hFLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDckIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDbkYsT0FBTyxJQUFJLFdBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sS0FBSyxDQUFDLEdBQVcsRUFBRSxTQUFpQjtRQUN4QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNmLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUM5RDtZQUNELENBQUMsQ0FBQztnQkFDRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDZixLQUFLLEVBQUUsRUFBRTthQUNaLENBQUM7SUFDVixDQUFDO0NBQ0o7QUFoREQsa0RBZ0RDIn0=
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGVyTGlua0V4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkhlYWRlckxpbmtFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQThCO0FBRTlCLGtDQUFxQztBQUVyQzs7R0FFRztBQUNILE1BQWEsbUJBQW1CO0lBQzVCOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFrQjs7UUFDN0IsT0FBTyxNQUFBLE1BQUEsTUFBQSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBVSxDQUFDLElBQUksQ0FBQywwQ0FDdEMsS0FBSyxDQUFDLHFHQUFxRyxDQUFDLDBDQUM1RyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLG1DQUNsQyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQWE7O1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksR0FBdUIsQ0FBQztRQUM1QixJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXRCLE1BQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsNEVBQTRFLENBQUMsMENBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdHLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUN6QixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMvQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDakQsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxVQUFVLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN4RSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sSUFBSSxXQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLEtBQUssQ0FBQyxHQUFXLEVBQUUsU0FBaUI7UUFDeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztnQkFDRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDZixLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7YUFDOUQ7WUFDRCxDQUFDLENBQUM7Z0JBQ0UsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsS0FBSyxFQUFFLEVBQUU7YUFDWixDQUFDO0lBQ1YsQ0FBQztDQUNKO0FBaERELGtEQWdEQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typedrest",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "author": "Bastian Eicher",
5
5
  "license": "MIT",
6
6
  "description": "TypedRest helps you build type-safe fluent-style REST API clients.",
@@ -11,7 +11,7 @@
11
11
  ],
12
12
  "repository": {
13
13
  "type": "git",
14
- "url": "https://github.com/TypedRest/TypedRest-TypeScript.git"
14
+ "url": "git+https://github.com/TypedRest/TypedRest-TypeScript.git"
15
15
  },
16
16
  "homepage": "https://typedrest.net",
17
17
  "main": "index.js",
@@ -28,14 +28,14 @@
28
28
  "docs": "typedoc"
29
29
  },
30
30
  "devDependencies": {
31
- "@types/node": "24.12.2",
31
+ "@types/node": "26.4.1",
32
32
  "@types/jest": "30.0.0",
33
33
  "@types/url-template": "2.0.31",
34
- "jest": "30.3.0",
35
- "jest-environment-jsdom": "30.3.0",
36
- "jest-fetch-mock": "3.0.3",
37
- "ts-jest": "29.4.9",
38
- "typedoc": "0.28.19",
34
+ "jest": "30.5.1",
35
+ "jest-environment-jsdom": "30.5.1",
36
+ "jest-fetch-mock": "4.2.0",
37
+ "ts-jest": "29.4.12",
38
+ "typedoc": "0.28.20",
39
39
  "typescript": "6.0.3"
40
40
  },
41
41
  "dependencies": {