@dugjason/front-node 0.1.0 → 0.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.
- package/{LICENSE.md → LICENSE} +2 -2
- package/README.md +40 -297
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +11907 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +11907 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -32
- package/dist/src/client.d.ts +0 -48
- package/dist/src/client.d.ts.map +0 -1
- package/dist/src/client.js +0 -218
- package/dist/src/client.js.map +0 -1
- package/dist/src/front.d.ts +0 -29
- package/dist/src/front.d.ts.map +0 -1
- package/dist/src/front.js +0 -44
- package/dist/src/front.js.map +0 -1
- package/dist/src/index.d.ts +0 -8
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -10
- package/dist/src/index.js.map +0 -1
- package/dist/src/oauth.d.ts +0 -28
- package/dist/src/oauth.d.ts.map +0 -1
- package/dist/src/oauth.js +0 -82
- package/dist/src/oauth.js.map +0 -1
- package/dist/src/resources/accounts.d.ts +0 -39
- package/dist/src/resources/accounts.d.ts.map +0 -1
- package/dist/src/resources/accounts.js +0 -57
- package/dist/src/resources/accounts.js.map +0 -1
- package/dist/src/resources/conversations.d.ts +0 -41
- package/dist/src/resources/conversations.d.ts.map +0 -1
- package/dist/src/resources/conversations.js +0 -55
- package/dist/src/resources/conversations.js.map +0 -1
- package/dist/src/resources/teammates.d.ts +0 -29
- package/dist/src/resources/teammates.d.ts.map +0 -1
- package/dist/src/resources/teammates.js +0 -37
- package/dist/src/resources/teammates.js.map +0 -1
- package/dist/src/types.d.ts +0 -147
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/tests/client.test.d.ts +0 -2
- package/dist/tests/client.test.d.ts.map +0 -1
- package/dist/tests/client.test.js +0 -226
- package/dist/tests/client.test.js.map +0 -1
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { FrontClient } from "../src/client";
|
|
3
|
-
// Mock fetch globally
|
|
4
|
-
const mockFetch = vi.fn();
|
|
5
|
-
global.fetch = mockFetch;
|
|
6
|
-
// Mock Headers constructor to work with our tests
|
|
7
|
-
class MockHeaders extends Map {
|
|
8
|
-
get(name) {
|
|
9
|
-
return super.get(name.toLowerCase());
|
|
10
|
-
}
|
|
11
|
-
set(name, value) {
|
|
12
|
-
return super.set(name.toLowerCase(), value);
|
|
13
|
-
}
|
|
14
|
-
has(name) {
|
|
15
|
-
return super.has(name.toLowerCase());
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
describe("FrontClient", () => {
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
vi.clearAllMocks();
|
|
21
|
-
vi.useFakeTimers();
|
|
22
|
-
});
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
vi.useRealTimers();
|
|
25
|
-
});
|
|
26
|
-
describe("Rate Limiting", () => {
|
|
27
|
-
it("should retry on 429 status with retry-after header", async () => {
|
|
28
|
-
const client = new FrontClient({
|
|
29
|
-
apiKey: "test-key",
|
|
30
|
-
});
|
|
31
|
-
const headers = new MockHeaders();
|
|
32
|
-
headers.set("retry-after", "2");
|
|
33
|
-
// First call returns 429 with retry-after
|
|
34
|
-
mockFetch
|
|
35
|
-
.mockResolvedValueOnce({
|
|
36
|
-
status: 429,
|
|
37
|
-
ok: false,
|
|
38
|
-
headers,
|
|
39
|
-
json: async () => ({
|
|
40
|
-
_error: {
|
|
41
|
-
status: 429,
|
|
42
|
-
title: "Too Many Requests",
|
|
43
|
-
message: "Rate limit exceeded",
|
|
44
|
-
},
|
|
45
|
-
}),
|
|
46
|
-
})
|
|
47
|
-
// Second call succeeds
|
|
48
|
-
.mockResolvedValueOnce({
|
|
49
|
-
status: 200,
|
|
50
|
-
ok: true,
|
|
51
|
-
json: async () => ({ success: true }),
|
|
52
|
-
});
|
|
53
|
-
const requestPromise = client.get("/test");
|
|
54
|
-
// Fast-forward time to trigger the retry
|
|
55
|
-
await vi.advanceTimersByTimeAsync(2000);
|
|
56
|
-
const result = await requestPromise;
|
|
57
|
-
expect(result).toEqual({ success: true });
|
|
58
|
-
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
59
|
-
});
|
|
60
|
-
it("should use exponential backoff when retry-after is not present", async () => {
|
|
61
|
-
const client = new FrontClient({
|
|
62
|
-
apiKey: "test-key",
|
|
63
|
-
});
|
|
64
|
-
// Mock Math.random to make jitter predictable
|
|
65
|
-
const originalRandom = Math.random;
|
|
66
|
-
Math.random = vi.fn(() => 0.5); // This will result in 0 jitter
|
|
67
|
-
try {
|
|
68
|
-
// First call returns 429 without retry-after
|
|
69
|
-
mockFetch
|
|
70
|
-
.mockResolvedValueOnce({
|
|
71
|
-
status: 429,
|
|
72
|
-
ok: false,
|
|
73
|
-
headers: new MockHeaders(),
|
|
74
|
-
json: async () => ({
|
|
75
|
-
_error: {
|
|
76
|
-
status: 429,
|
|
77
|
-
title: "Too Many Requests",
|
|
78
|
-
message: "Rate limit exceeded",
|
|
79
|
-
},
|
|
80
|
-
}),
|
|
81
|
-
})
|
|
82
|
-
// Second call succeeds
|
|
83
|
-
.mockResolvedValueOnce({
|
|
84
|
-
status: 200,
|
|
85
|
-
ok: true,
|
|
86
|
-
json: async () => ({ success: true }),
|
|
87
|
-
});
|
|
88
|
-
const requestPromise = client.get("/test");
|
|
89
|
-
// Should use exponential backoff (1000ms for first retry)
|
|
90
|
-
await vi.advanceTimersByTimeAsync(1000);
|
|
91
|
-
const result = await requestPromise;
|
|
92
|
-
expect(result).toEqual({ success: true });
|
|
93
|
-
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
Math.random = originalRandom;
|
|
97
|
-
}
|
|
98
|
-
}, 10000);
|
|
99
|
-
it("should respect retry-after header over exponential backoff", async () => {
|
|
100
|
-
const client = new FrontClient({
|
|
101
|
-
apiKey: "test-key",
|
|
102
|
-
});
|
|
103
|
-
const headers = new MockHeaders();
|
|
104
|
-
headers.set("retry-after", "3");
|
|
105
|
-
mockFetch
|
|
106
|
-
.mockResolvedValueOnce({
|
|
107
|
-
status: 429,
|
|
108
|
-
ok: false,
|
|
109
|
-
headers,
|
|
110
|
-
json: async () => ({
|
|
111
|
-
_error: {
|
|
112
|
-
status: 429,
|
|
113
|
-
title: "Too Many Requests",
|
|
114
|
-
message: "Rate limit exceeded",
|
|
115
|
-
},
|
|
116
|
-
}),
|
|
117
|
-
})
|
|
118
|
-
.mockResolvedValueOnce({
|
|
119
|
-
status: 200,
|
|
120
|
-
ok: true,
|
|
121
|
-
json: async () => ({ success: true }),
|
|
122
|
-
});
|
|
123
|
-
const requestPromise = client.get("/test");
|
|
124
|
-
// Should wait for retry-after time (3000ms), not exponential backoff (1000ms)
|
|
125
|
-
await vi.advanceTimersByTimeAsync(3000);
|
|
126
|
-
const result = await requestPromise;
|
|
127
|
-
expect(result).toEqual({ success: true });
|
|
128
|
-
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
129
|
-
});
|
|
130
|
-
it("should handle network errors with retries", async () => {
|
|
131
|
-
const client = new FrontClient({
|
|
132
|
-
apiKey: "test-key",
|
|
133
|
-
});
|
|
134
|
-
// Mock Math.random to make jitter predictable
|
|
135
|
-
const originalRandom = Math.random;
|
|
136
|
-
Math.random = vi.fn(() => 0.5);
|
|
137
|
-
try {
|
|
138
|
-
// First call fails with network error
|
|
139
|
-
mockFetch
|
|
140
|
-
.mockRejectedValueOnce(new Error("Network error"))
|
|
141
|
-
// Second call succeeds
|
|
142
|
-
.mockResolvedValueOnce({
|
|
143
|
-
status: 200,
|
|
144
|
-
ok: true,
|
|
145
|
-
json: async () => ({ success: true }),
|
|
146
|
-
});
|
|
147
|
-
const requestPromise = client.get("/test");
|
|
148
|
-
// Advance time for retry (1000ms base delay)
|
|
149
|
-
await vi.advanceTimersByTimeAsync(1000);
|
|
150
|
-
const result = await requestPromise;
|
|
151
|
-
expect(result).toEqual({ success: true });
|
|
152
|
-
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
153
|
-
}
|
|
154
|
-
finally {
|
|
155
|
-
Math.random = originalRandom;
|
|
156
|
-
}
|
|
157
|
-
}, 10000);
|
|
158
|
-
});
|
|
159
|
-
describe("Basic functionality", () => {
|
|
160
|
-
it("should create a client with API key", () => {
|
|
161
|
-
const client = new FrontClient({ apiKey: "test-key" });
|
|
162
|
-
expect(client).toBeInstanceOf(FrontClient);
|
|
163
|
-
});
|
|
164
|
-
it("should throw error when API key is empty and no env var", () => {
|
|
165
|
-
// Store original value
|
|
166
|
-
const originalEnvKey = process.env.FRONT_API_KEY;
|
|
167
|
-
delete process.env.FRONT_API_KEY;
|
|
168
|
-
try {
|
|
169
|
-
expect(() => new FrontClient({ apiKey: "" })).toThrow("API key is required when not using OAuth");
|
|
170
|
-
}
|
|
171
|
-
finally {
|
|
172
|
-
// Restore original value
|
|
173
|
-
if (originalEnvKey) {
|
|
174
|
-
process.env.FRONT_API_KEY = originalEnvKey;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
it("should make successful GET request", async () => {
|
|
179
|
-
const client = new FrontClient({ apiKey: "test-key" });
|
|
180
|
-
mockFetch.mockResolvedValueOnce({
|
|
181
|
-
status: 200,
|
|
182
|
-
ok: true,
|
|
183
|
-
json: async () => ({ data: "test" }),
|
|
184
|
-
});
|
|
185
|
-
const result = await client.get("/test");
|
|
186
|
-
expect(result).toEqual({ data: "test" });
|
|
187
|
-
expect(mockFetch).toHaveBeenCalledWith("https://api2.frontapp.com/test", expect.objectContaining({
|
|
188
|
-
method: "GET",
|
|
189
|
-
headers: expect.objectContaining({
|
|
190
|
-
Authorization: "Bearer test-key",
|
|
191
|
-
Accept: "application/json",
|
|
192
|
-
}),
|
|
193
|
-
}));
|
|
194
|
-
});
|
|
195
|
-
it("should handle 204 No Content responses", async () => {
|
|
196
|
-
const client = new FrontClient({ apiKey: "test-key" });
|
|
197
|
-
mockFetch.mockResolvedValueOnce({
|
|
198
|
-
status: 204,
|
|
199
|
-
ok: true,
|
|
200
|
-
json: async () => {
|
|
201
|
-
throw new Error("No content");
|
|
202
|
-
}, // 204 responses don't have JSON
|
|
203
|
-
});
|
|
204
|
-
const result = await client.delete("/test");
|
|
205
|
-
expect(result).toEqual({});
|
|
206
|
-
});
|
|
207
|
-
it("should throw error for non-2xx responses", async () => {
|
|
208
|
-
const client = new FrontClient({ apiKey: "test-key" });
|
|
209
|
-
mockFetch.mockResolvedValueOnce({
|
|
210
|
-
status: 400,
|
|
211
|
-
ok: false,
|
|
212
|
-
statusText: "Bad Request",
|
|
213
|
-
json: async () => ({
|
|
214
|
-
message: "Invalid request",
|
|
215
|
-
code: "invalid_request",
|
|
216
|
-
}),
|
|
217
|
-
});
|
|
218
|
-
await expect(client.get("/test")).rejects.toMatchObject({
|
|
219
|
-
message: "Invalid request",
|
|
220
|
-
status: 400,
|
|
221
|
-
code: "invalid_request",
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
//# sourceMappingURL=client.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../tests/client.test.ts"],"names":[],"mappings":"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"}
|