@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.
Files changed (47) hide show
  1. package/{LICENSE.md → LICENSE} +2 -2
  2. package/README.md +40 -297
  3. package/dist/index.cjs +2 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +11907 -0
  6. package/dist/index.d.cts.map +1 -0
  7. package/dist/index.d.mts +11907 -0
  8. package/dist/index.d.mts.map +1 -0
  9. package/dist/index.mjs +2 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/package.json +67 -32
  12. package/dist/src/client.d.ts +0 -48
  13. package/dist/src/client.d.ts.map +0 -1
  14. package/dist/src/client.js +0 -218
  15. package/dist/src/client.js.map +0 -1
  16. package/dist/src/front.d.ts +0 -29
  17. package/dist/src/front.d.ts.map +0 -1
  18. package/dist/src/front.js +0 -44
  19. package/dist/src/front.js.map +0 -1
  20. package/dist/src/index.d.ts +0 -8
  21. package/dist/src/index.d.ts.map +0 -1
  22. package/dist/src/index.js +0 -10
  23. package/dist/src/index.js.map +0 -1
  24. package/dist/src/oauth.d.ts +0 -28
  25. package/dist/src/oauth.d.ts.map +0 -1
  26. package/dist/src/oauth.js +0 -82
  27. package/dist/src/oauth.js.map +0 -1
  28. package/dist/src/resources/accounts.d.ts +0 -39
  29. package/dist/src/resources/accounts.d.ts.map +0 -1
  30. package/dist/src/resources/accounts.js +0 -57
  31. package/dist/src/resources/accounts.js.map +0 -1
  32. package/dist/src/resources/conversations.d.ts +0 -41
  33. package/dist/src/resources/conversations.d.ts.map +0 -1
  34. package/dist/src/resources/conversations.js +0 -55
  35. package/dist/src/resources/conversations.js.map +0 -1
  36. package/dist/src/resources/teammates.d.ts +0 -29
  37. package/dist/src/resources/teammates.d.ts.map +0 -1
  38. package/dist/src/resources/teammates.js +0 -37
  39. package/dist/src/resources/teammates.js.map +0 -1
  40. package/dist/src/types.d.ts +0 -147
  41. package/dist/src/types.d.ts.map +0 -1
  42. package/dist/src/types.js +0 -2
  43. package/dist/src/types.js.map +0 -1
  44. package/dist/tests/client.test.d.ts +0 -2
  45. package/dist/tests/client.test.d.ts.map +0 -1
  46. package/dist/tests/client.test.js +0 -226
  47. 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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"}