api-def 0.12.0-alpha.39 → 0.12.0-alpha.40
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/cjs/ApiTypes.d.ts +2 -1
- package/cjs/backend/AxiosRequestBackend.js +36 -1
- package/cjs/backend/FetchRequestBackend.js +2 -1
- package/cjs/cache/ClientCacheBackend.d.ts +6 -0
- package/cjs/cache/ClientCaching.d.ts +10 -0
- package/cjs/cache/{Caching.js → ClientCaching.js} +17 -17
- package/cjs/cache/LocalForageClientCacheBackend.d.ts +9 -0
- package/cjs/{tests/state.test.js → cache/LocalForageClientCacheBackend.js} +52 -52
- package/cjs/cache/LocalStorageClientCacheBackend.d.ts +7 -0
- package/cjs/cache/{LocalStorageCacheBackend.js → LocalStorageClientCacheBackend.js} +14 -14
- package/cjs/index.d.ts +4 -4
- package/cjs/index.js +10 -10
- package/cjs/middleware/ClientCacheMiddleware.d.ts +7 -0
- package/cjs/middleware/{CacheMiddleware.js → ClientCacheMiddleware.js} +16 -14
- package/esm/ApiTypes.d.ts +2 -1
- package/esm/backend/AxiosRequestBackend.js +25 -1
- package/esm/backend/FetchRequestBackend.js +2 -1
- package/esm/cache/ClientCacheBackend.d.ts +6 -0
- package/esm/cache/ClientCaching.d.ts +10 -0
- package/esm/cache/{Caching.js → ClientCaching.js} +12 -12
- package/esm/cache/LocalForageClientCacheBackend.d.ts +9 -0
- package/esm/cache/LocalForageClientCacheBackend.js +36 -0
- package/esm/cache/LocalStorageClientCacheBackend.d.ts +7 -0
- package/esm/cache/{LocalStorageCacheBackend.js → LocalStorageClientCacheBackend.js} +8 -8
- package/esm/index.d.ts +4 -4
- package/esm/index.js +4 -4
- package/esm/middleware/ClientCacheMiddleware.d.ts +7 -0
- package/esm/middleware/{CacheMiddleware.js → ClientCacheMiddleware.js} +14 -12
- package/package.json +3 -3
- package/cjs/cache/CacheBackend.d.ts +0 -6
- package/cjs/cache/Caching.d.ts +0 -10
- package/cjs/cache/LocalForageCacheBackend.d.ts +0 -9
- package/cjs/cache/LocalForageCacheBackend.js +0 -23
- package/cjs/cache/LocalStorageCacheBackend.d.ts +0 -7
- package/cjs/middleware/CacheMiddleware.d.ts +0 -7
- package/cjs/tests/api.test.js +0 -166
- package/cjs/tests/axios.test.d.ts +0 -1
- package/cjs/tests/axios.test.js +0 -94
- package/cjs/tests/backend.test.d.ts +0 -1
- package/cjs/tests/backend.test.js +0 -92
- package/cjs/tests/bodyTypes.test.d.ts +0 -1
- package/cjs/tests/bodyTypes.test.js +0 -58
- package/cjs/tests/mock/MockApi.d.ts +0 -16
- package/cjs/tests/mock/MockApi.js +0 -67
- package/cjs/tests/params.test.d.ts +0 -1
- package/cjs/tests/params.test.js +0 -147
- package/cjs/tests/retry.test.d.ts +0 -1
- package/cjs/tests/retry.test.js +0 -134
- package/cjs/tests/state.test.d.ts +0 -1
- package/cjs/tests/streaming.test.d.ts +0 -1
- package/cjs/tests/streaming.test.js +0 -207
- package/cjs/tests/validation.test.d.ts +0 -1
- package/cjs/tests/validation.test.js +0 -124
- package/esm/cache/CacheBackend.d.ts +0 -6
- package/esm/cache/CacheBackend.js +0 -1
- package/esm/cache/Caching.d.ts +0 -10
- package/esm/cache/LocalForageCacheBackend.d.ts +0 -9
- package/esm/cache/LocalForageCacheBackend.js +0 -19
- package/esm/cache/LocalStorageCacheBackend.d.ts +0 -7
- package/esm/middleware/CacheMiddleware.d.ts +0 -7
- package/esm/tests/api.test.d.ts +0 -1
- package/esm/tests/api.test.js +0 -108
- package/esm/tests/axios.test.d.ts +0 -1
- package/esm/tests/axios.test.js +0 -51
- package/esm/tests/backend.test.d.ts +0 -1
- package/esm/tests/backend.test.js +0 -49
- package/esm/tests/bodyTypes.test.d.ts +0 -1
- package/esm/tests/bodyTypes.test.js +0 -21
- package/esm/tests/mock/MockApi.d.ts +0 -16
- package/esm/tests/mock/MockApi.js +0 -64
- package/esm/tests/params.test.d.ts +0 -1
- package/esm/tests/params.test.js +0 -88
- package/esm/tests/retry.test.d.ts +0 -1
- package/esm/tests/retry.test.js +0 -77
- package/esm/tests/state.test.d.ts +0 -1
- package/esm/tests/state.test.js +0 -52
- package/esm/tests/streaming.test.d.ts +0 -1
- package/esm/tests/streaming.test.js +0 -123
- package/esm/tests/validation.test.d.ts +0 -1
- package/esm/tests/validation.test.js +0 -81
- /package/cjs/cache/{CacheBackend.js → ClientCacheBackend.js} +0 -0
- /package/{cjs/tests/api.test.d.ts → esm/cache/ClientCacheBackend.js} +0 -0
package/esm/tests/retry.test.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { Api } from "../Api";
|
|
11
|
-
import api, { fetchRequiresToken } from "./mock/MockApi";
|
|
12
|
-
it("allow for retries in middleware", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
-
let thrownError;
|
|
14
|
-
try {
|
|
15
|
-
yield fetchRequiresToken.submit({});
|
|
16
|
-
}
|
|
17
|
-
catch (e) {
|
|
18
|
-
thrownError = e;
|
|
19
|
-
}
|
|
20
|
-
expect(thrownError.toJSON).toBe(undefined);
|
|
21
|
-
expect(thrownError).toMatchObject({
|
|
22
|
-
response: {
|
|
23
|
-
data: {
|
|
24
|
-
code: "auth/invalid-token",
|
|
25
|
-
},
|
|
26
|
-
status: 400,
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
expect(yield fetchRequiresToken.submit({
|
|
30
|
-
headers: {
|
|
31
|
-
token: "test",
|
|
32
|
-
},
|
|
33
|
-
})).toMatchObject({
|
|
34
|
-
status: 200,
|
|
35
|
-
data: { hello: true },
|
|
36
|
-
});
|
|
37
|
-
api.middleware.push({
|
|
38
|
-
error: (context) => {
|
|
39
|
-
var _a, _b, _c;
|
|
40
|
-
if (((_c = (_b = (_a = context.error) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.code) === "auth/invalid-token") {
|
|
41
|
-
context.updateHeaders({
|
|
42
|
-
token: "updated-token",
|
|
43
|
-
});
|
|
44
|
-
return {
|
|
45
|
-
type: "retry",
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
expect(yield fetchRequiresToken.submit({})).toMatchObject({
|
|
51
|
-
status: 200,
|
|
52
|
-
data: { hello: true },
|
|
53
|
-
});
|
|
54
|
-
}));
|
|
55
|
-
it("make sure retry only happens a max number of times", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
-
const api = new Api({
|
|
57
|
-
baseUrl: "httpstat.us",
|
|
58
|
-
name: "Http Status API",
|
|
59
|
-
});
|
|
60
|
-
const endpoint = api.endpoint().build({
|
|
61
|
-
id: "404",
|
|
62
|
-
method: "get",
|
|
63
|
-
path: "/404",
|
|
64
|
-
config: {
|
|
65
|
-
retry: 3,
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
let error;
|
|
69
|
-
try {
|
|
70
|
-
yield endpoint.submit({});
|
|
71
|
-
}
|
|
72
|
-
catch (e) {
|
|
73
|
-
error = e;
|
|
74
|
-
}
|
|
75
|
-
expect(error.response.status).toBe(404);
|
|
76
|
-
expect(error.attempts).toBe(4);
|
|
77
|
-
}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/esm/tests/state.test.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { Api } from "../Api";
|
|
11
|
-
it("can provide extra state to a request that a middleware can use ", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
12
|
-
const api = new Api({
|
|
13
|
-
baseUrl: "httpstat.us",
|
|
14
|
-
name: "Http Status API",
|
|
15
|
-
mocking: {
|
|
16
|
-
enabled: true,
|
|
17
|
-
},
|
|
18
|
-
middleware: [
|
|
19
|
-
{
|
|
20
|
-
beforeSend: (context) => {
|
|
21
|
-
if (context.requestConfig.state.cookies) {
|
|
22
|
-
context.updateHeaders({
|
|
23
|
-
Cookie: context.requestConfig.state.cookies,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
});
|
|
30
|
-
const cookiesEndpoint = api
|
|
31
|
-
.endpoint()
|
|
32
|
-
.stateOf()
|
|
33
|
-
.responseOf()
|
|
34
|
-
.build({
|
|
35
|
-
id: "cookies",
|
|
36
|
-
method: "get",
|
|
37
|
-
path: "/200",
|
|
38
|
-
mocking: {
|
|
39
|
-
handler: (req, res) => {
|
|
40
|
-
return res.status(200).send({
|
|
41
|
-
cookies: req.headers.Cookie,
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
const { data: { cookies }, } = yield cookiesEndpoint.submit({
|
|
47
|
-
state: {
|
|
48
|
-
cookies: "test=123",
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
expect(cookies).toBe("test=123");
|
|
52
|
-
}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
11
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
12
|
-
var m = o[Symbol.asyncIterator], i;
|
|
13
|
-
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
14
|
-
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
15
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
16
|
-
};
|
|
17
|
-
import { createServer } from "node:http";
|
|
18
|
-
import axios from "axios";
|
|
19
|
-
import { Api } from "../Api";
|
|
20
|
-
import AxiosRequestBackend from "../backend/AxiosRequestBackend";
|
|
21
|
-
import FetchRequestBackend from "../backend/FetchRequestBackend";
|
|
22
|
-
describe("Streaming Response Tests", () => {
|
|
23
|
-
let server;
|
|
24
|
-
let baseUrl;
|
|
25
|
-
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
26
|
-
server = createServer((req, res) => {
|
|
27
|
-
if (req.url === "/stream" && req.method === "GET") {
|
|
28
|
-
res.setHeader("Content-Type", "text/event-stream");
|
|
29
|
-
res.setHeader("Cache-Control", "no-cache");
|
|
30
|
-
res.setHeader("Connection", "keep-alive");
|
|
31
|
-
let count = 0;
|
|
32
|
-
const interval = setInterval(() => {
|
|
33
|
-
if (count >= 3) {
|
|
34
|
-
clearInterval(interval);
|
|
35
|
-
res.end();
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
res.write(`data: ${JSON.stringify({ count: count++ })}\n\n`);
|
|
39
|
-
}, 100);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
res.statusCode = 404;
|
|
43
|
-
res.end();
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
yield new Promise((resolve) => {
|
|
47
|
-
server.listen(0, () => {
|
|
48
|
-
const port = server.address().port;
|
|
49
|
-
baseUrl = `http://localhost:${port}`;
|
|
50
|
-
resolve();
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
}));
|
|
54
|
-
afterAll((done) => {
|
|
55
|
-
server.close(done);
|
|
56
|
-
});
|
|
57
|
-
const collectStreamData = (iterator) => __awaiter(void 0, void 0, void 0, function* () {
|
|
58
|
-
var _a, iterator_1, iterator_1_1;
|
|
59
|
-
var _b, e_1, _c, _d;
|
|
60
|
-
const results = [];
|
|
61
|
-
try {
|
|
62
|
-
for (_a = true, iterator_1 = __asyncValues(iterator); iterator_1_1 = yield iterator_1.next(), _b = iterator_1_1.done, !_b; _a = true) {
|
|
63
|
-
_d = iterator_1_1.value;
|
|
64
|
-
_a = false;
|
|
65
|
-
const chunk = _d;
|
|
66
|
-
const text = new TextDecoder().decode(chunk);
|
|
67
|
-
const lines = text.split("\n");
|
|
68
|
-
for (const line of lines) {
|
|
69
|
-
if (line.startsWith("data: ")) {
|
|
70
|
-
try {
|
|
71
|
-
results.push(JSON.parse(line.slice(6)));
|
|
72
|
-
}
|
|
73
|
-
catch (e) {
|
|
74
|
-
// Ignore parsing errors
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
81
|
-
finally {
|
|
82
|
-
try {
|
|
83
|
-
if (!_a && !_b && (_c = iterator_1.return)) yield _c.call(iterator_1);
|
|
84
|
-
}
|
|
85
|
-
finally { if (e_1) throw e_1.error; }
|
|
86
|
-
}
|
|
87
|
-
return results;
|
|
88
|
-
});
|
|
89
|
-
it("should handle streaming responses with Fetch backend", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
90
|
-
const api = new Api({
|
|
91
|
-
name: "test-api",
|
|
92
|
-
baseUrl,
|
|
93
|
-
requestBackend: new FetchRequestBackend(),
|
|
94
|
-
});
|
|
95
|
-
const endpoint = api.endpoint().build({
|
|
96
|
-
id: "stream",
|
|
97
|
-
method: "get",
|
|
98
|
-
path: "/stream",
|
|
99
|
-
responseType: "stream",
|
|
100
|
-
});
|
|
101
|
-
const response = yield endpoint.submit({});
|
|
102
|
-
const results = yield collectStreamData(response.data);
|
|
103
|
-
expect(results).toHaveLength(3);
|
|
104
|
-
expect(results).toEqual([{ count: 0 }, { count: 1 }, { count: 2 }]);
|
|
105
|
-
}));
|
|
106
|
-
it("should handle streaming responses with Axios backend", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
107
|
-
const api = new Api({
|
|
108
|
-
name: "test-api",
|
|
109
|
-
baseUrl,
|
|
110
|
-
requestBackend: new AxiosRequestBackend(axios),
|
|
111
|
-
});
|
|
112
|
-
const endpoint = api.endpoint().build({
|
|
113
|
-
id: "stream",
|
|
114
|
-
method: "get",
|
|
115
|
-
path: "/stream",
|
|
116
|
-
responseType: "stream",
|
|
117
|
-
});
|
|
118
|
-
const response = yield endpoint.submit({});
|
|
119
|
-
const results = yield collectStreamData(response.data);
|
|
120
|
-
expect(results).toHaveLength(3);
|
|
121
|
-
expect(results).toEqual([{ count: 0 }, { count: 1 }, { count: 2 }]);
|
|
122
|
-
}));
|
|
123
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import * as zod from "zod";
|
|
11
|
-
import { Api } from "../Api";
|
|
12
|
-
const api = new Api({
|
|
13
|
-
baseUrl: "httpstat.us",
|
|
14
|
-
name: "Example API",
|
|
15
|
-
mocking: {
|
|
16
|
-
enabled: true,
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
const queryReturnEndpoint = api
|
|
20
|
-
.endpoint()
|
|
21
|
-
.queryOf(zod.object({
|
|
22
|
-
test: zod.string(),
|
|
23
|
-
}))
|
|
24
|
-
.responseOf(zod.object({
|
|
25
|
-
name: zod.string(),
|
|
26
|
-
query: zod.object({
|
|
27
|
-
test: zod.string().refine((v) => !Number.isNaN(Number(v)) && Number(v) < 255, "below 255"),
|
|
28
|
-
}),
|
|
29
|
-
}))
|
|
30
|
-
.build({
|
|
31
|
-
name: "Get 200",
|
|
32
|
-
id: "200",
|
|
33
|
-
method: "get",
|
|
34
|
-
path: "/200",
|
|
35
|
-
mocking: {
|
|
36
|
-
handler: (req, res) => {
|
|
37
|
-
return res.status(200).send({ name: "Test", query: req.query });
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
it("validation", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
-
var _a, _b;
|
|
43
|
-
{
|
|
44
|
-
const res = yield queryReturnEndpoint.submit({
|
|
45
|
-
query: {
|
|
46
|
-
test: "200",
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
expect(res.data.query.test).toBe("200");
|
|
50
|
-
}
|
|
51
|
-
{
|
|
52
|
-
let error;
|
|
53
|
-
try {
|
|
54
|
-
yield queryReturnEndpoint.submit({
|
|
55
|
-
query: {
|
|
56
|
-
test: {},
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
catch (e) {
|
|
61
|
-
error = e;
|
|
62
|
-
}
|
|
63
|
-
expect(error.code).toBe("validation/query-validate-error");
|
|
64
|
-
expect((_a = error.issues) === null || _a === void 0 ? void 0 : _a[0].code).toBe("invalid_type");
|
|
65
|
-
}
|
|
66
|
-
{
|
|
67
|
-
let error;
|
|
68
|
-
try {
|
|
69
|
-
yield queryReturnEndpoint.submit({
|
|
70
|
-
query: {
|
|
71
|
-
test: "300",
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
catch (e) {
|
|
76
|
-
error = e;
|
|
77
|
-
}
|
|
78
|
-
expect(error.code).toBe("validation/response-validate-error");
|
|
79
|
-
expect((_b = error.issues) === null || _b === void 0 ? void 0 : _b[0].message).toBe("below 255");
|
|
80
|
-
}
|
|
81
|
-
}));
|
|
File without changes
|
|
File without changes
|