@clickup/rest-client 2.10.296 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.base.js +10 -1
- package/.eslintrc.js +4 -4
- package/.github/workflows/ci.yml +26 -0
- package/.github/workflows/semgrep.yml +36 -0
- package/.prettierrc +8 -0
- package/.vscode/extensions.json +8 -0
- package/.vscode/tasks.json +20 -0
- package/dist/.eslintcache +1 -1
- package/dist/RestClient.js +2 -2
- package/dist/RestClient.js.map +1 -1
- package/dist/RestOptions.d.ts +3 -0
- package/dist/RestOptions.d.ts.map +1 -1
- package/dist/RestOptions.js +1 -0
- package/dist/RestOptions.js.map +1 -1
- package/dist/RestRequest.d.ts.map +1 -1
- package/dist/RestRequest.js +1 -0
- package/dist/RestRequest.js.map +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/RestFetchReader.d.ts +4 -2
- package/dist/internal/RestFetchReader.d.ts.map +1 -1
- package/dist/internal/RestFetchReader.js +4 -4
- package/dist/internal/RestFetchReader.js.map +1 -1
- package/dist/internal/ellipsis.d.ts +6 -0
- package/dist/internal/ellipsis.d.ts.map +1 -0
- package/dist/internal/ellipsis.js +17 -0
- package/dist/internal/ellipsis.js.map +1 -0
- package/dist/internal/inspectPossibleJSON.js +5 -8
- package/dist/internal/inspectPossibleJSON.js.map +1 -1
- package/dist/internal/throwIfErrorResponse.js +1 -1
- package/dist/internal/throwIfErrorResponse.js.map +1 -1
- package/dist/middlewares/paceRequests.d.ts +21 -2
- package/dist/middlewares/paceRequests.d.ts.map +1 -1
- package/dist/middlewares/paceRequests.js +3 -2
- package/dist/middlewares/paceRequests.js.map +1 -1
- package/docs/interfaces/Pacer.md +7 -12
- package/docs/interfaces/PacerOutcome.md +25 -0
- package/docs/interfaces/RestOptions.md +22 -47
- package/docs/modules.md +4 -7
- package/internal/clean.sh +4 -0
- package/internal/deploy.sh +7 -0
- package/internal/docs.sh +6 -0
- package/internal/lint.sh +4 -0
- package/jest.config.base.js +13 -0
- package/jest.config.js +1 -10
- package/package.json +7 -6
- package/src/RestClient.ts +2 -2
- package/src/RestOptions.ts +3 -0
- package/src/RestRequest.ts +1 -0
- package/src/__tests__/RestClient.test.ts +53 -0
- package/src/__tests__/RestFetchReader.test.ts +150 -0
- package/src/__tests__/RestRequest.test.ts +262 -0
- package/src/__tests__/RestStream.test.ts +63 -0
- package/src/__tests__/helpers.ts +173 -0
- package/src/index.ts +2 -7
- package/src/internal/RestFetchReader.ts +4 -1
- package/src/internal/ellipsis.ts +16 -0
- package/src/internal/inspectPossibleJSON.ts +1 -5
- package/src/internal/throwIfErrorResponse.ts +1 -1
- package/src/middlewares/paceRequests.ts +27 -2
- package/tsconfig.base.json +31 -0
- package/tsconfig.json +1 -31
- package/typedoc.config.js +20 -0
- package/dist/pacers/Pacer.d.ts +0 -21
- package/dist/pacers/Pacer.d.ts.map +0 -1
- package/dist/pacers/Pacer.js +0 -3
- package/dist/pacers/Pacer.js.map +0 -1
- package/dist/pacers/PacerComposite.d.ts +0 -14
- package/dist/pacers/PacerComposite.d.ts.map +0 -1
- package/dist/pacers/PacerComposite.js +0 -32
- package/dist/pacers/PacerComposite.js.map +0 -1
- package/dist/pacers/PacerQPS.d.ts +0 -53
- package/dist/pacers/PacerQPS.d.ts.map +0 -1
- package/dist/pacers/PacerQPS.js +0 -105
- package/dist/pacers/PacerQPS.js.map +0 -1
- package/docs/classes/PacerComposite.md +0 -66
- package/docs/classes/PacerQPS.md +0 -79
- package/docs/interfaces/PacerDelay.md +0 -25
- package/docs/interfaces/PacerQPSBackend.md +0 -44
- package/docs/interfaces/PacerQPSOptions.md +0 -40
- package/src/pacers/Pacer.ts +0 -22
- package/src/pacers/PacerComposite.ts +0 -29
- package/src/pacers/PacerQPS.ts +0 -147
- package/typedoc.json +0 -22
|
@@ -5,19 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const util_1 = require("util");
|
|
7
7
|
const sortBy_1 = __importDefault(require("lodash/sortBy"));
|
|
8
|
-
const
|
|
8
|
+
const ellipsis_1 = __importDefault(require("./ellipsis"));
|
|
9
9
|
function inspectPossibleJSON(headers, text, maxOutputLen) {
|
|
10
10
|
const MAX_LEN_TO_TRY_PARSE = 1024 * 1024;
|
|
11
11
|
if (typeof text === "string" && text.length > MAX_LEN_TO_TRY_PARSE) {
|
|
12
12
|
// Don't even try to JSON-parse if the text is too long.
|
|
13
|
-
return
|
|
13
|
+
return (0, ellipsis_1.default)(text, maxOutputLen);
|
|
14
14
|
}
|
|
15
15
|
if (text instanceof Buffer) {
|
|
16
16
|
return `<Buffer: ${text.length} bytes>`;
|
|
17
17
|
}
|
|
18
18
|
if (!text || typeof text === "string") {
|
|
19
19
|
if (!(headers.get("content-type") || "").match(/json/)) {
|
|
20
|
-
return
|
|
20
|
+
return (0, ellipsis_1.default)(text, maxOutputLen);
|
|
21
21
|
}
|
|
22
22
|
try {
|
|
23
23
|
const json = JSON.parse(text);
|
|
@@ -27,10 +27,10 @@ function inspectPossibleJSON(headers, text, maxOutputLen) {
|
|
|
27
27
|
// all, but it's hard to reorder at any other layer of abstraction.
|
|
28
28
|
reorderObjectProps(json, (k) => k === "error" || k === "errors" ? "" : k);
|
|
29
29
|
}
|
|
30
|
-
return
|
|
30
|
+
return (0, ellipsis_1.default)((0, util_1.inspect)(json, { depth: 20, compact: true }), maxOutputLen);
|
|
31
31
|
}
|
|
32
32
|
catch (e) {
|
|
33
|
-
return
|
|
33
|
+
return (0, ellipsis_1.default)(text, maxOutputLen);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
return "<Stream>";
|
|
@@ -47,7 +47,4 @@ function reorderObjectProps(obj, ranker) {
|
|
|
47
47
|
}
|
|
48
48
|
Object.assign(obj, Object.fromEntries((0, sortBy_1.default)(entries, ([k, v]) => ranker(k, v))));
|
|
49
49
|
}
|
|
50
|
-
function ellipsis(text, length) {
|
|
51
|
-
return (0, truncate_1.default)("" + text, { length }).trimEnd();
|
|
52
|
-
}
|
|
53
50
|
//# sourceMappingURL=inspectPossibleJSON.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspectPossibleJSON.js","sourceRoot":"","sources":["../../src/internal/inspectPossibleJSON.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,2DAAmC;AACnC
|
|
1
|
+
{"version":3,"file":"inspectPossibleJSON.js","sourceRoot":"","sources":["../../src/internal/inspectPossibleJSON.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,2DAAmC;AACnC,0DAAkC;AAElC,SAAwB,mBAAmB,CACzC,OAA6C,EAC7C,IAA6C,EAC7C,YAAoB;IAEpB,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;IAEzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACnE,wDAAwD;QACxD,OAAO,IAAA,kBAAQ,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;QAC3B,OAAO,YAAY,IAAI,CAAC,MAAM,SAAS,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,OAAO,IAAA,kBAAQ,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE9B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACjE,qEAAqE;gBACrE,uEAAuE;gBACvE,mEAAmE;gBACnE,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CACzC,CAAC;YACJ,CAAC;YAED,OAAO,IAAA,kBAAQ,EACb,IAAA,cAAO,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAC3C,YAAY,CACb,CAAC;QACJ,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,IAAA,kBAAQ,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AA3CD,sCA2CC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CACzB,GAAwB,EACxB,MAA8C;IAE9C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,MAAM,CACX,GAAG,EACH,MAAM,CAAC,WAAW,CAAC,IAAA,gBAAM,EAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -27,7 +27,7 @@ function throwIfErrorResponse(options, res) {
|
|
|
27
27
|
case "BEST_EFFORT":
|
|
28
28
|
if (res.status === STATUS_TOO_MANY_REQUESTS) {
|
|
29
29
|
const retryAfterHeader = res.headers.get("Retry-After") || "0";
|
|
30
|
-
throw new RestRateLimitError_1.default(`Rate limited by HTTP status ${STATUS_TOO_MANY_REQUESTS}`, parseInt(retryAfterHeader) || 0, res);
|
|
30
|
+
throw new RestRateLimitError_1.default(`Rate limited by HTTP status ${STATUS_TOO_MANY_REQUESTS}`, 1000 * parseInt(retryAfterHeader) || 0, res);
|
|
31
31
|
}
|
|
32
32
|
break;
|
|
33
33
|
case "SOMETHING_ELSE":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"throwIfErrorResponse.js","sourceRoot":"","sources":["../../src/internal/throwIfErrorResponse.ts"],"names":[],"mappings":";;;;;AAAA,sFAA8D;AAC9D,oFAA4D;AAC5D,sFAA8D;AAC9D,4FAAoE;AAIpE,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC;;;;;;GAMG;AACH,SAAwB,oBAAoB,CAC1C,OAAoB,EACpB,GAAiB;IAEjB,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACvD,QAAQ,gBAAgB,EAAE,CAAC;QACzB,KAAK,YAAY;YACf,MAAM,IAAI,4BAAkB,CAC1B,+BAA+B,gBAAgB,EAAE,EACjD,CAAC,EACD,GAAG,CACJ,CAAC;QACJ,KAAK,aAAa;YAChB,IAAI,GAAG,CAAC,MAAM,KAAK,wBAAwB,EAAE,CAAC;gBAC5C,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;gBAC/D,MAAM,IAAI,4BAAkB,CAC1B,+BAA+B,wBAAwB,EAAE,EACzD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"throwIfErrorResponse.js","sourceRoot":"","sources":["../../src/internal/throwIfErrorResponse.ts"],"names":[],"mappings":";;;;;AAAA,sFAA8D;AAC9D,oFAA4D;AAC5D,sFAA8D;AAC9D,4FAAoE;AAIpE,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC;;;;;;GAMG;AACH,SAAwB,oBAAoB,CAC1C,OAAoB,EACpB,GAAiB;IAEjB,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACvD,QAAQ,gBAAgB,EAAE,CAAC;QACzB,KAAK,YAAY;YACf,MAAM,IAAI,4BAAkB,CAC1B,+BAA+B,gBAAgB,EAAE,EACjD,CAAC,EACD,GAAG,CACJ,CAAC;QACJ,KAAK,aAAa;YAChB,IAAI,GAAG,CAAC,MAAM,KAAK,wBAAwB,EAAE,CAAC;gBAC5C,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;gBAC/D,MAAM,IAAI,4BAAkB,CAC1B,+BAA+B,wBAAwB,EAAE,EACzD,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,EACtC,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,MAAM;QACR,KAAK,gBAAgB;YACnB,MAAM;QACR;YACE,MAAM,IAAI,4BAAkB,CAC1B,2CAA2C,gBAAgB,KAAK,EAChE,gBAAgB,EAChB,GAAG,CACJ,CAAC;IACN,CAAC;IAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,IAAI,+BAAqB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzD,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,MAAM,IAAI,4BAAkB,CAC1B,+BAA+B,YAAY,EAAE,EAC7C,CAAC,EACD,GAAG,CACJ,CAAC;QACJ,KAAK,aAAa,CAAC;QACnB,KAAK,aAAa;YAChB,MAAM;QACR;YACE,MAAM,IAAI,4BAAkB,CAC1B,4CAA4C,YAAY,KAAK,EAC7D,YAAY,EACZ,GAAG,CACJ,CAAC;IACN,CAAC;IAED,IAAI,iBAAiB,KAAK,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,2BAAiB,CACzB,gCAAgC,iBAAiB,EAAE,EACnD,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,2BAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAxED,uCAwEC"}
|
|
@@ -1,9 +1,28 @@
|
|
|
1
|
-
import type Pacer from "../pacers/Pacer";
|
|
2
1
|
import type { Middleware } from "../RestOptions";
|
|
3
2
|
import type RestRequest from "../RestRequest";
|
|
3
|
+
/**
|
|
4
|
+
* Pacer is a class which allows to pace requests on some resource identified by
|
|
5
|
+
* the instance of this class.
|
|
6
|
+
*/
|
|
7
|
+
export interface Pacer {
|
|
8
|
+
/** Human readable name of the pacer, used when composing multiple pacers. */
|
|
9
|
+
readonly key: string;
|
|
10
|
+
/**
|
|
11
|
+
* Signals that we're about to send a request. Returns the delay we need to
|
|
12
|
+
* wait for before actually sending.
|
|
13
|
+
*/
|
|
14
|
+
pace(): Promise<PacerOutcome>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A result of some Pacer work.
|
|
18
|
+
*/
|
|
19
|
+
export interface PacerOutcome {
|
|
20
|
+
delayMs: number;
|
|
21
|
+
reason: string;
|
|
22
|
+
}
|
|
4
23
|
/**
|
|
5
24
|
* Rest Client middleware that adds some delay between requests using one of
|
|
6
25
|
* Pacer implementations.
|
|
7
26
|
*/
|
|
8
|
-
export default function paceRequests(pacer: Pacer | ((req: RestRequest) => Promise<Pacer | null>) | null): Middleware;
|
|
27
|
+
export default function paceRequests(pacer: Pacer | ((req: RestRequest) => Promise<Pacer | null>) | null, delayMetric?: (delay: number, reason: string) => void): Middleware;
|
|
9
28
|
//# sourceMappingURL=paceRequests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paceRequests.d.ts","sourceRoot":"","sources":["../../src/middlewares/paceRequests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"paceRequests.d.ts","sourceRoot":"","sources":["../../src/middlewares/paceRequests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAI9C;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,EACnE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GACpD,UAAU,CA+BZ"}
|
|
@@ -5,14 +5,15 @@ const MIN_LOG_DELAY_MS = 10;
|
|
|
5
5
|
* Rest Client middleware that adds some delay between requests using one of
|
|
6
6
|
* Pacer implementations.
|
|
7
7
|
*/
|
|
8
|
-
function paceRequests(pacer) {
|
|
8
|
+
function paceRequests(pacer, delayMetric) {
|
|
9
9
|
return async (req, next) => {
|
|
10
10
|
if (typeof pacer === "function") {
|
|
11
11
|
pacer = await pacer(req);
|
|
12
12
|
}
|
|
13
13
|
if (pacer) {
|
|
14
|
-
const { delayMs, reason } = await pacer.
|
|
14
|
+
const { delayMs, reason } = await pacer.pace();
|
|
15
15
|
if (delayMs > 0) {
|
|
16
|
+
delayMetric === null || delayMetric === void 0 ? void 0 : delayMetric(delayMs, reason);
|
|
16
17
|
await req.options.heartbeater.delay(delayMs);
|
|
17
18
|
}
|
|
18
19
|
if (delayMs > MIN_LOG_DELAY_MS) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paceRequests.js","sourceRoot":"","sources":["../../src/middlewares/paceRequests.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"paceRequests.js","sourceRoot":"","sources":["../../src/middlewares/paceRequests.ts"],"names":[],"mappings":";;AAGA,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAyB5B;;;GAGG;AACH,SAAwB,YAAY,CAClC,KAAmE,EACnE,WAAqD;IAErD,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YAE/C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/B,MAAM,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,OAAO,GAAG,gBAAgB,EAAE,CAAC;gBAC/B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;oBACjB,OAAO,EAAE,CAAC;oBACV,GAAG;oBACH,GAAG,EAAE,eAAe;oBACpB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO,EAAE,OAAO;oBAChB,cAAc,EAAE,IAAI;oBACpB,qBAAqB,EAAE,KAAK;oBAC5B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAlCD,+BAkCC"}
|
package/docs/interfaces/Pacer.md
CHANGED
|
@@ -5,36 +5,31 @@
|
|
|
5
5
|
Pacer is a class which allows to pace requests on some resource identified by
|
|
6
6
|
the instance of this class.
|
|
7
7
|
|
|
8
|
-
## Implemented by
|
|
9
|
-
|
|
10
|
-
- [`PacerComposite`](../classes/PacerComposite.md)
|
|
11
|
-
- [`PacerQPS`](../classes/PacerQPS.md)
|
|
12
|
-
|
|
13
8
|
## Properties
|
|
14
9
|
|
|
15
|
-
###
|
|
10
|
+
### key
|
|
16
11
|
|
|
17
|
-
• `Readonly` **
|
|
12
|
+
• `Readonly` **key**: `string`
|
|
18
13
|
|
|
19
14
|
Human readable name of the pacer, used when composing multiple pacers.
|
|
20
15
|
|
|
21
16
|
#### Defined in
|
|
22
17
|
|
|
23
|
-
[src/
|
|
18
|
+
[src/middlewares/paceRequests.ts:12](https://github.com/clickup/rest-client/blob/master/src/middlewares/paceRequests.ts#L12)
|
|
24
19
|
|
|
25
20
|
## Methods
|
|
26
21
|
|
|
27
|
-
###
|
|
22
|
+
### pace
|
|
28
23
|
|
|
29
|
-
▸ **
|
|
24
|
+
▸ **pace**(): `Promise`\<[`PacerOutcome`](PacerOutcome.md)\>
|
|
30
25
|
|
|
31
26
|
Signals that we're about to send a request. Returns the delay we need to
|
|
32
27
|
wait for before actually sending.
|
|
33
28
|
|
|
34
29
|
#### Returns
|
|
35
30
|
|
|
36
|
-
`Promise`\<[`
|
|
31
|
+
`Promise`\<[`PacerOutcome`](PacerOutcome.md)\>
|
|
37
32
|
|
|
38
33
|
#### Defined in
|
|
39
34
|
|
|
40
|
-
[src/
|
|
35
|
+
[src/middlewares/paceRequests.ts:18](https://github.com/clickup/rest-client/blob/master/src/middlewares/paceRequests.ts#L18)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[@clickup/rest-client](../README.md) / [Exports](../modules.md) / PacerOutcome
|
|
2
|
+
|
|
3
|
+
# Interface: PacerOutcome
|
|
4
|
+
|
|
5
|
+
A result of some Pacer work.
|
|
6
|
+
|
|
7
|
+
## Properties
|
|
8
|
+
|
|
9
|
+
### delayMs
|
|
10
|
+
|
|
11
|
+
• **delayMs**: `number`
|
|
12
|
+
|
|
13
|
+
#### Defined in
|
|
14
|
+
|
|
15
|
+
[src/middlewares/paceRequests.ts:25](https://github.com/clickup/rest-client/blob/master/src/middlewares/paceRequests.ts#L25)
|
|
16
|
+
|
|
17
|
+
___
|
|
18
|
+
|
|
19
|
+
### reason
|
|
20
|
+
|
|
21
|
+
• **reason**: `string`
|
|
22
|
+
|
|
23
|
+
#### Defined in
|
|
24
|
+
|
|
25
|
+
[src/middlewares/paceRequests.ts:26](https://github.com/clickup/rest-client/blob/master/src/middlewares/paceRequests.ts#L26)
|
|
@@ -126,6 +126,18 @@ addresses are allowed.
|
|
|
126
126
|
|
|
127
127
|
___
|
|
128
128
|
|
|
129
|
+
### responseEncoding
|
|
130
|
+
|
|
131
|
+
• **responseEncoding**: `undefined` \| `BufferEncoding`
|
|
132
|
+
|
|
133
|
+
Overrides the default encoding heuristics for responses.
|
|
134
|
+
|
|
135
|
+
#### Defined in
|
|
136
|
+
|
|
137
|
+
[src/RestOptions.ts:100](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L100)
|
|
138
|
+
|
|
139
|
+
___
|
|
140
|
+
|
|
129
141
|
### isDebug
|
|
130
142
|
|
|
131
143
|
• **isDebug**: `boolean`
|
|
@@ -134,7 +146,7 @@ If true, logs request-response pairs to console.
|
|
|
134
146
|
|
|
135
147
|
#### Defined in
|
|
136
148
|
|
|
137
|
-
[src/RestOptions.ts:
|
|
149
|
+
[src/RestOptions.ts:102](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L102)
|
|
138
150
|
|
|
139
151
|
___
|
|
140
152
|
|
|
@@ -153,7 +165,7 @@ Sets Keep-Alive parameters (persistent connections).
|
|
|
153
165
|
|
|
154
166
|
#### Defined in
|
|
155
167
|
|
|
156
|
-
[src/RestOptions.ts:
|
|
168
|
+
[src/RestOptions.ts:106](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L106)
|
|
157
169
|
|
|
158
170
|
___
|
|
159
171
|
|
|
@@ -165,7 +177,7 @@ When resolving DNS, use IPv4, IPv6 or both (see dns.lookup() docs).
|
|
|
165
177
|
|
|
166
178
|
#### Defined in
|
|
167
179
|
|
|
168
|
-
[src/RestOptions.ts:
|
|
180
|
+
[src/RestOptions.ts:114](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L114)
|
|
169
181
|
|
|
170
182
|
___
|
|
171
183
|
|
|
@@ -177,7 +189,7 @@ Max timeout to wait for a response.
|
|
|
177
189
|
|
|
178
190
|
#### Defined in
|
|
179
191
|
|
|
180
|
-
[src/RestOptions.ts:
|
|
192
|
+
[src/RestOptions.ts:116](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L116)
|
|
181
193
|
|
|
182
194
|
___
|
|
183
195
|
|
|
@@ -192,9 +204,6 @@ delay events logging.
|
|
|
192
204
|
|
|
193
205
|
▸ (`event`): `void`
|
|
194
206
|
|
|
195
|
-
Logger to be used for each responses (including retried) plus for backoff
|
|
196
|
-
delay events logging.
|
|
197
|
-
|
|
198
207
|
##### Parameters
|
|
199
208
|
|
|
200
209
|
| Name | Type |
|
|
@@ -207,7 +216,7 @@ delay events logging.
|
|
|
207
216
|
|
|
208
217
|
#### Defined in
|
|
209
218
|
|
|
210
|
-
[src/RestOptions.ts:
|
|
219
|
+
[src/RestOptions.ts:119](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L119)
|
|
211
220
|
|
|
212
221
|
___
|
|
213
222
|
|
|
@@ -219,7 +228,7 @@ Middlewares to wrap requests. May alter both request and response.
|
|
|
219
228
|
|
|
220
229
|
#### Defined in
|
|
221
230
|
|
|
222
|
-
[src/RestOptions.ts:
|
|
231
|
+
[src/RestOptions.ts:121](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L121)
|
|
223
232
|
|
|
224
233
|
___
|
|
225
234
|
|
|
@@ -244,19 +253,6 @@ remote API is that weird. Return values:
|
|
|
244
253
|
|
|
245
254
|
▸ (`res`): ``"SUCCESS"`` \| ``"THROW"`` \| ``"BEST_EFFORT"``
|
|
246
255
|
|
|
247
|
-
If set, makes decision whether the response is successful or not. The
|
|
248
|
-
response will either be returned to the client, or an error will be thrown.
|
|
249
|
-
This allows to treat some non-successful HTTP statuses as success if the
|
|
250
|
-
remote API is that weird. Return values:
|
|
251
|
-
* "SUCCESS" - the request will be considered successful, no further checks
|
|
252
|
-
will be performed;
|
|
253
|
-
* "BEST_EFFORT" - inconclusive, the request may be either successful or
|
|
254
|
-
unsuccessful, additional tests (e.g. will check HTTP status code) will be
|
|
255
|
-
performed;
|
|
256
|
-
* "THROW" - the request resulted in error. Additional tests will be
|
|
257
|
-
performed to determine is the error is retriable, is OAuth token good,
|
|
258
|
-
and etc.
|
|
259
|
-
|
|
260
256
|
##### Parameters
|
|
261
257
|
|
|
262
258
|
| Name | Type |
|
|
@@ -269,7 +265,7 @@ remote API is that weird. Return values:
|
|
|
269
265
|
|
|
270
266
|
#### Defined in
|
|
271
267
|
|
|
272
|
-
[src/RestOptions.ts:
|
|
268
|
+
[src/RestOptions.ts:134](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L134)
|
|
273
269
|
|
|
274
270
|
___
|
|
275
271
|
|
|
@@ -291,16 +287,6 @@ contradictory information; then isRateLimitError wins.
|
|
|
291
287
|
|
|
292
288
|
▸ (`res`): `number` \| ``"BEST_EFFORT"`` \| ``"SOMETHING_ELSE"`` \| ``"RATE_LIMIT"``
|
|
293
289
|
|
|
294
|
-
Decides whether the response is a rate-limit error or not. Returning
|
|
295
|
-
non-zero value is treated as retry delay (if retries are set up). In case
|
|
296
|
-
the returned value is "SOMETHING_ELSE", the response ought to be either
|
|
297
|
-
success or some other error. Returning "BEST_EFFORT" turns on built-in
|
|
298
|
-
heuristic (e.g. relying on HTTP status code and Retry-After header). In
|
|
299
|
-
case we've made a decision that it's a rate limited error, the request is
|
|
300
|
-
always retried; this covers a very common case when we have both
|
|
301
|
-
isRateLimitError and isRetriableError handlers set up, and they return
|
|
302
|
-
contradictory information; then isRateLimitError wins.
|
|
303
|
-
|
|
304
290
|
##### Parameters
|
|
305
291
|
|
|
306
292
|
| Name | Type |
|
|
@@ -313,7 +299,7 @@ contradictory information; then isRateLimitError wins.
|
|
|
313
299
|
|
|
314
300
|
#### Defined in
|
|
315
301
|
|
|
316
|
-
[src/RestOptions.ts:
|
|
302
|
+
[src/RestOptions.ts:144](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L144)
|
|
317
303
|
|
|
318
304
|
___
|
|
319
305
|
|
|
@@ -328,9 +314,6 @@ not, the response ought to be either success or some other error.
|
|
|
328
314
|
|
|
329
315
|
▸ (`res`): `boolean`
|
|
330
316
|
|
|
331
|
-
Decides whether the response is a token-invalid error or not. In case it's
|
|
332
|
-
not, the response ought to be either success or some other error.
|
|
333
|
-
|
|
334
317
|
##### Parameters
|
|
335
318
|
|
|
336
319
|
| Name | Type |
|
|
@@ -343,7 +326,7 @@ not, the response ought to be either success or some other error.
|
|
|
343
326
|
|
|
344
327
|
#### Defined in
|
|
345
328
|
|
|
346
|
-
[src/RestOptions.ts:
|
|
329
|
+
[src/RestOptions.ts:149](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L149)
|
|
347
330
|
|
|
348
331
|
___
|
|
349
332
|
|
|
@@ -363,14 +346,6 @@ retry will happen in not less than this number of milliseconds.
|
|
|
363
346
|
|
|
364
347
|
▸ (`res`, `_error`): `number` \| ``"BEST_EFFORT"`` \| ``"NEVER_RETRY"`` \| ``"RETRY"``
|
|
365
348
|
|
|
366
|
-
Called only if we haven't decided earlier that it's a rate limit error.
|
|
367
|
-
Decides whether the response is a retriable error or not. In case the
|
|
368
|
-
returned value is "NEVER_RETRY", the response ought to be either success or
|
|
369
|
-
some other error, but it's guaranteed that the request won't be retried.
|
|
370
|
-
Returning "BEST_EFFORT" turns on built-in heuristics (e.g. never retry "not
|
|
371
|
-
found" errors). Returning a number is treated as "RETRY", and the next
|
|
372
|
-
retry will happen in not less than this number of milliseconds.
|
|
373
|
-
|
|
374
349
|
##### Parameters
|
|
375
350
|
|
|
376
351
|
| Name | Type |
|
|
@@ -384,4 +359,4 @@ retry will happen in not less than this number of milliseconds.
|
|
|
384
359
|
|
|
385
360
|
#### Defined in
|
|
386
361
|
|
|
387
|
-
[src/RestOptions.ts:
|
|
362
|
+
[src/RestOptions.ts:157](https://github.com/clickup/rest-client/blob/master/src/RestOptions.ts#L157)
|
package/docs/modules.md
CHANGED
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
- [RestRetriableError](classes/RestRetriableError.md)
|
|
16
16
|
- [RestTimeoutError](classes/RestTimeoutError.md)
|
|
17
17
|
- [RestTokenInvalidError](classes/RestTokenInvalidError.md)
|
|
18
|
-
- [PacerComposite](classes/PacerComposite.md)
|
|
19
|
-
- [PacerQPS](classes/PacerQPS.md)
|
|
20
18
|
|
|
21
19
|
## Interfaces
|
|
22
20
|
|
|
@@ -24,10 +22,8 @@
|
|
|
24
22
|
- [RestLogEvent](interfaces/RestLogEvent.md)
|
|
25
23
|
- [Middleware](interfaces/Middleware.md)
|
|
26
24
|
- [RestOptions](interfaces/RestOptions.md)
|
|
27
|
-
- [PacerDelay](interfaces/PacerDelay.md)
|
|
28
25
|
- [Pacer](interfaces/Pacer.md)
|
|
29
|
-
- [
|
|
30
|
-
- [PacerQPSOptions](interfaces/PacerQPSOptions.md)
|
|
26
|
+
- [PacerOutcome](interfaces/PacerOutcome.md)
|
|
31
27
|
|
|
32
28
|
## Functions
|
|
33
29
|
|
|
@@ -67,7 +63,7 @@ ___
|
|
|
67
63
|
|
|
68
64
|
### paceRequests
|
|
69
65
|
|
|
70
|
-
▸ **paceRequests**(`pacer`): [`Middleware`](interfaces/Middleware.md)
|
|
66
|
+
▸ **paceRequests**(`pacer`, `delayMetric?`): [`Middleware`](interfaces/Middleware.md)
|
|
71
67
|
|
|
72
68
|
Rest Client middleware that adds some delay between requests using one of
|
|
73
69
|
Pacer implementations.
|
|
@@ -77,6 +73,7 @@ Pacer implementations.
|
|
|
77
73
|
| Name | Type |
|
|
78
74
|
| :------ | :------ |
|
|
79
75
|
| `pacer` | ``null`` \| [`Pacer`](interfaces/Pacer.md) \| (`req`: [`RestRequest`](classes/RestRequest.md)\<`any`\>) => `Promise`\<``null`` \| [`Pacer`](interfaces/Pacer.md)\> |
|
|
76
|
+
| `delayMetric?` | (`delay`: `number`, `reason`: `string`) => `void` |
|
|
80
77
|
|
|
81
78
|
#### Returns
|
|
82
79
|
|
|
@@ -84,4 +81,4 @@ Pacer implementations.
|
|
|
84
81
|
|
|
85
82
|
#### Defined in
|
|
86
83
|
|
|
87
|
-
[src/middlewares/paceRequests.ts:
|
|
84
|
+
[src/middlewares/paceRequests.ts:33](https://github.com/clickup/rest-client/blob/master/src/middlewares/paceRequests.ts#L33)
|
package/internal/docs.sh
ADDED
package/internal/lint.sh
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
module.exports = {
|
|
3
|
+
roots: ["<rootDir>/src"],
|
|
4
|
+
testMatch: ["**/*.test.ts"],
|
|
5
|
+
clearMocks: true,
|
|
6
|
+
restoreMocks: true,
|
|
7
|
+
...(process.env.IN_JEST_PROJECT
|
|
8
|
+
? {}
|
|
9
|
+
: { forceExit: true, testTimeout: 30000 }),
|
|
10
|
+
transform: {
|
|
11
|
+
"\\.ts$": "ts-jest",
|
|
12
|
+
},
|
|
13
|
+
};
|
package/jest.config.js
CHANGED
|
@@ -1,11 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
module.exports = {
|
|
3
|
-
roots: ["<rootDir>/src"],
|
|
4
|
-
testMatch: ["**/*.test.ts"],
|
|
5
|
-
clearMocks: true,
|
|
6
|
-
restoreMocks: true,
|
|
7
|
-
...(process.env.IN_JEST_PROJECT ? {} : { forceExit: true }),
|
|
8
|
-
transform: {
|
|
9
|
-
"\\.ts$": "ts-jest",
|
|
10
|
-
},
|
|
11
|
-
};
|
|
2
|
+
module.exports = { ...require("./jest.config.base") };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clickup/rest-client",
|
|
3
3
|
"description": "A syntax sugar tool around Node fetch() API, tailored to work with TypeScript and response validators",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.11.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"rest-client",
|
|
@@ -24,18 +24,18 @@
|
|
|
24
24
|
"scripts": {
|
|
25
25
|
"build": "tsc",
|
|
26
26
|
"dev": "tsc --watch --preserveWatchOutput",
|
|
27
|
-
"lint": "
|
|
27
|
+
"lint": "bash internal/lint.sh",
|
|
28
28
|
"test": "jest",
|
|
29
|
-
"docs": "
|
|
30
|
-
"clean": "
|
|
29
|
+
"docs": "bash internal/docs.sh",
|
|
30
|
+
"clean": "bash internal/clean.sh",
|
|
31
31
|
"copy-package-to-public-dir": "copy-package-to-public-dir.sh",
|
|
32
32
|
"backport-package-from-public-dir": "backport-package-from-public-dir.sh",
|
|
33
|
-
"deploy": "
|
|
33
|
+
"deploy": "bash internal/deploy.sh"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"abort-controller": "^3.0.0",
|
|
37
37
|
"delay": "^4.4.1",
|
|
38
|
-
"fast-typescript-memoize": "^1.
|
|
38
|
+
"fast-typescript-memoize": "^1.1.1",
|
|
39
39
|
"ipaddr.js": "^1.9.1",
|
|
40
40
|
"lodash": "^4.17.21",
|
|
41
41
|
"node-fetch": "^2.6.11",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"eslint-import-resolver-typescript": "^3.5.5",
|
|
52
52
|
"eslint-plugin-import": "^2.27.5",
|
|
53
53
|
"eslint-plugin-lodash": "^7.4.0",
|
|
54
|
+
"eslint-plugin-no-only-tests": "^3.1.0",
|
|
54
55
|
"eslint-plugin-node": "^11.1.0",
|
|
55
56
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
56
57
|
"eslint-plugin-react": "^7.32.2",
|
package/src/RestClient.ts
CHANGED
|
@@ -480,8 +480,8 @@ function simpleShape(path: string, args?: any) {
|
|
|
480
480
|
args && typeof args === "object"
|
|
481
481
|
? Object.keys(args)
|
|
482
482
|
// Filter out args that are already mentioned in the path, e.g.
|
|
483
|
-
// /pages/:pageID/blocks.
|
|
484
|
-
.filter((arg) => !argsInPath.includes(arg))
|
|
483
|
+
// /pages/:pageID/blocks. Also filter out undefined args.
|
|
484
|
+
.filter((arg) => !argsInPath.includes(arg) && args[arg] !== undefined)
|
|
485
485
|
.sort()
|
|
486
486
|
.join(",")
|
|
487
487
|
: "";
|
package/src/RestOptions.ts
CHANGED
|
@@ -96,6 +96,8 @@ export default interface RestOptions {
|
|
|
96
96
|
/** If true, non-public IP addresses are allowed too; otherwise, only unicast
|
|
97
97
|
* addresses are allowed. */
|
|
98
98
|
allowInternalIPs: boolean;
|
|
99
|
+
/** Overrides the default encoding heuristics for responses. */
|
|
100
|
+
responseEncoding: NodeJS.BufferEncoding | undefined;
|
|
99
101
|
/** If true, logs request-response pairs to console. */
|
|
100
102
|
isDebug: boolean;
|
|
101
103
|
/** @ignore Holds HttpsAgent/HttpAgent instances; used internally only. */
|
|
@@ -172,6 +174,7 @@ export const DEFAULT_OPTIONS: RestOptions = {
|
|
|
172
174
|
throwIfResIsBigger: undefined,
|
|
173
175
|
privateDataInResponse: false,
|
|
174
176
|
allowInternalIPs: false,
|
|
177
|
+
responseEncoding: undefined,
|
|
175
178
|
isDebug: false,
|
|
176
179
|
agents: new Agents(),
|
|
177
180
|
keepAlive: { timeoutMs: 10000 },
|
package/src/RestRequest.ts
CHANGED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { RestClient } from "..";
|
|
2
|
+
import substituteParams from "../internal/substituteParams";
|
|
3
|
+
|
|
4
|
+
test("fetch_plain_url", async () => {
|
|
5
|
+
const client = new RestClient();
|
|
6
|
+
const res = await client.get("http://example.com", undefined, "*/*").text();
|
|
7
|
+
expect(res.length).toBeGreaterThan(10);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test("fetch_loopback_url_fails", async () => {
|
|
11
|
+
const client = new RestClient();
|
|
12
|
+
await expect(client.get("http://localhost/abc").response()).rejects.toThrow(
|
|
13
|
+
new RegExp(
|
|
14
|
+
"^Domain localhost resolves to a non-public \\(loopback\\) IP address (127\\.0\\.0\\.1)|(\\:\\:1)",
|
|
15
|
+
),
|
|
16
|
+
);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("fetch_private_url_fails", async () => {
|
|
20
|
+
const client = new RestClient();
|
|
21
|
+
await expect(client.get("http://10.0.0.1/abc").response()).rejects.toThrow(
|
|
22
|
+
"Domain 10.0.0.1 resolves to a non-public (private) IP address 10.0.0.1",
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("fetch_url_with_redirect_fails", async () => {
|
|
27
|
+
const client = new RestClient();
|
|
28
|
+
await expect(client.get("http://google.com").response()).rejects.toThrow(
|
|
29
|
+
/redirect mode is set to error:/,
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("fetch_relative_url_fails", async () => {
|
|
34
|
+
const client = new RestClient();
|
|
35
|
+
await expect(client.get("/test").text()).rejects.toThrow(/Invalid URL/);
|
|
36
|
+
await expect(client.get("zzz").text()).rejects.toThrow(/Invalid URL/);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("substituteParams", async () => {
|
|
40
|
+
const body = { aa: "aaa", b: 42, x: "y" };
|
|
41
|
+
expect(substituteParams("/some/:aa/other/:b/ccc/:ddd/eee", body)).toEqual([
|
|
42
|
+
"/some/aaa/other/42/ccc/:ddd/eee",
|
|
43
|
+
{ x: "y" },
|
|
44
|
+
]);
|
|
45
|
+
expect(body).toEqual({ aa: "aaa", b: 42, x: "y" });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("withOptions ignores undefined", async () => {
|
|
49
|
+
const request = new RestClient({ timeoutMs: 1234 })
|
|
50
|
+
.withOptions({ timeoutMs: undefined })
|
|
51
|
+
.writeJson("/", "");
|
|
52
|
+
expect(request.options.timeoutMs).toEqual(1234);
|
|
53
|
+
});
|