@efficy/tribecrm-mcp-server 0.4.2 → 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 (52) hide show
  1. package/README.md +86 -9
  2. package/dist/auth/callback-server.d.ts +41 -0
  3. package/dist/auth/callback-server.d.ts.map +1 -0
  4. package/dist/auth/callback-server.js +247 -0
  5. package/dist/auth/callback-server.js.map +1 -0
  6. package/dist/auth/callback-server.test.d.ts +2 -0
  7. package/dist/auth/callback-server.test.d.ts.map +1 -0
  8. package/dist/auth/callback-server.test.js +233 -0
  9. package/dist/auth/callback-server.test.js.map +1 -0
  10. package/dist/auth/oauth-flow.d.ts +55 -0
  11. package/dist/auth/oauth-flow.d.ts.map +1 -0
  12. package/dist/auth/oauth-flow.js +120 -0
  13. package/dist/auth/oauth-flow.js.map +1 -0
  14. package/dist/auth/oauth-flow.test.d.ts +2 -0
  15. package/dist/auth/oauth-flow.test.d.ts.map +1 -0
  16. package/dist/auth/oauth-flow.test.js +154 -0
  17. package/dist/auth/oauth-flow.test.js.map +1 -0
  18. package/dist/auth/token-manager.d.ts +43 -0
  19. package/dist/auth/token-manager.d.ts.map +1 -0
  20. package/dist/auth/token-manager.js +105 -0
  21. package/dist/auth/token-manager.js.map +1 -0
  22. package/dist/auth/token-manager.test.d.ts +2 -0
  23. package/dist/auth/token-manager.test.d.ts.map +1 -0
  24. package/dist/auth/token-manager.test.js +190 -0
  25. package/dist/auth/token-manager.test.js.map +1 -0
  26. package/dist/auth/user-auth.d.ts +48 -0
  27. package/dist/auth/user-auth.d.ts.map +1 -0
  28. package/dist/auth/user-auth.js +186 -0
  29. package/dist/auth/user-auth.js.map +1 -0
  30. package/dist/auth/user-auth.test.d.ts +2 -0
  31. package/dist/auth/user-auth.test.d.ts.map +1 -0
  32. package/dist/auth/user-auth.test.js +366 -0
  33. package/dist/auth/user-auth.test.js.map +1 -0
  34. package/dist/client.d.ts +5 -0
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +42 -4
  37. package/dist/client.js.map +1 -1
  38. package/dist/client.test.js +2 -3
  39. package/dist/client.test.js.map +1 -1
  40. package/dist/index.js +109 -6
  41. package/dist/index.js.map +1 -1
  42. package/dist/index.test.js +5 -3
  43. package/dist/index.test.js.map +1 -1
  44. package/dist/scripts/authenticate.d.ts +12 -0
  45. package/dist/scripts/authenticate.d.ts.map +1 -0
  46. package/dist/scripts/authenticate.js +95 -0
  47. package/dist/scripts/authenticate.js.map +1 -0
  48. package/dist/types.d.ts +0 -1
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.test.js +0 -11
  51. package/dist/types.test.js.map +1 -1
  52. package/package.json +3 -2
@@ -0,0 +1,366 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { UserAuth } from './user-auth.js';
3
+ import { TokenManager } from './token-manager.js';
4
+ import { OAuthFlow } from './oauth-flow.js';
5
+ import { CallbackServer } from './callback-server.js';
6
+ // Mock modules
7
+ vi.mock('./token-manager.js');
8
+ vi.mock('./oauth-flow.js');
9
+ vi.mock('./callback-server.js');
10
+ describe('UserAuth', () => {
11
+ let userAuth;
12
+ let mockTokenManager;
13
+ let mockOAuthFlow;
14
+ let mockCallbackServer;
15
+ const testConfig = {
16
+ authUrl: 'https://auth.test.com',
17
+ clientId: 'test-client-id',
18
+ clientSecret: 'test-client-secret',
19
+ redirectUri: 'http://localhost:3000/callback',
20
+ organizationId: 'test-org-id',
21
+ callbackPort: 3000,
22
+ tokenFilePath: '/test/tokens.json'
23
+ };
24
+ const mockTokens = {
25
+ access_token: 'test-access-token',
26
+ token_type: 'Bearer',
27
+ expires_in: 86400,
28
+ scope: 'read write offline',
29
+ refresh_token: 'test-refresh-token'
30
+ };
31
+ const mockStoredTokens = {
32
+ ...mockTokens,
33
+ expires_at: Date.now() + 3600000 // 1 hour from now
34
+ };
35
+ beforeEach(() => {
36
+ vi.clearAllMocks();
37
+ // Setup TokenManager mock
38
+ mockTokenManager = {
39
+ loadTokens: vi.fn(),
40
+ saveTokens: vi.fn(),
41
+ deleteTokens: vi.fn(),
42
+ areTokensValid: vi.fn(),
43
+ getTokenPath: vi.fn().mockReturnValue('/test/tokens.json')
44
+ };
45
+ vi.mocked(TokenManager).mockImplementation(() => mockTokenManager);
46
+ // Setup OAuthFlow mock
47
+ mockOAuthFlow = {
48
+ generatePKCE: vi.fn().mockReturnValue({
49
+ verifier: 'test-verifier',
50
+ challenge: 'test-challenge'
51
+ }),
52
+ generateConsentUrl: vi.fn().mockReturnValue('https://auth.test.com/consent'),
53
+ exchangeCodeForTokens: vi.fn().mockResolvedValue(mockTokens),
54
+ refreshAccessToken: vi.fn().mockResolvedValue(mockTokens)
55
+ };
56
+ vi.mocked(OAuthFlow).mockImplementation(() => mockOAuthFlow);
57
+ vi.mocked(OAuthFlow.generateState).mockReturnValue('test-state');
58
+ // Setup CallbackServer mock
59
+ mockCallbackServer = {
60
+ waitForCallback: vi.fn().mockResolvedValue({
61
+ code: 'test-auth-code',
62
+ state: 'test-state'
63
+ }),
64
+ stop: vi.fn(),
65
+ getPort: vi.fn().mockReturnValue(3000)
66
+ };
67
+ vi.mocked(CallbackServer).mockImplementation(() => mockCallbackServer);
68
+ userAuth = new UserAuth(testConfig);
69
+ });
70
+ afterEach(() => {
71
+ vi.restoreAllMocks();
72
+ });
73
+ describe('constructor', () => {
74
+ it('should initialize with provided config', () => {
75
+ expect(TokenManager).toHaveBeenCalledWith('/test/tokens.json');
76
+ expect(OAuthFlow).toHaveBeenCalledWith({
77
+ authUrl: testConfig.authUrl,
78
+ clientId: testConfig.clientId,
79
+ clientSecret: testConfig.clientSecret,
80
+ redirectUri: testConfig.redirectUri,
81
+ organizationId: testConfig.organizationId
82
+ });
83
+ });
84
+ it('should work without optional config parameters', () => {
85
+ const minimalConfig = {
86
+ authUrl: 'https://auth.test.com',
87
+ clientId: 'test-client-id',
88
+ clientSecret: 'test-client-secret',
89
+ redirectUri: 'http://localhost:3000/callback'
90
+ };
91
+ const minimalUserAuth = new UserAuth(minimalConfig);
92
+ expect(minimalUserAuth).toBeDefined();
93
+ });
94
+ });
95
+ describe('getAccessToken', () => {
96
+ it('should return current token if still valid', async () => {
97
+ // Simulate having a valid token in memory
98
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
99
+ mockTokenManager.areTokensValid.mockReturnValue(true);
100
+ const token1 = await userAuth.getAccessToken();
101
+ const token2 = await userAuth.getAccessToken(); // Should use cached token
102
+ expect(token1).toBe(mockTokens.access_token);
103
+ expect(token2).toBe(mockTokens.access_token);
104
+ expect(mockTokenManager.loadTokens).toHaveBeenCalledTimes(1); // Only loaded once
105
+ });
106
+ it('should load tokens from disk if not in memory', async () => {
107
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
108
+ mockTokenManager.areTokensValid.mockReturnValue(true);
109
+ const token = await userAuth.getAccessToken();
110
+ expect(token).toBe(mockTokens.access_token);
111
+ expect(mockTokenManager.loadTokens).toHaveBeenCalled();
112
+ expect(mockTokenManager.areTokensValid).toHaveBeenCalled();
113
+ });
114
+ it('should refresh expired tokens using refresh_token', async () => {
115
+ const expiredTokens = {
116
+ ...mockStoredTokens,
117
+ expires_at: Date.now() - 1000 // Expired 1 second ago
118
+ };
119
+ const newTokens = {
120
+ ...mockTokens,
121
+ access_token: 'new-access-token',
122
+ expires_at: Date.now() + 3600000
123
+ };
124
+ mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
125
+ mockTokenManager.areTokensValid.mockReturnValue(false);
126
+ mockOAuthFlow.refreshAccessToken.mockResolvedValue(newTokens);
127
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
128
+ const token = await userAuth.getAccessToken();
129
+ expect(token).toBe('new-access-token');
130
+ expect(mockOAuthFlow.refreshAccessToken).toHaveBeenCalledWith('test-refresh-token');
131
+ expect(mockTokenManager.saveTokens).toHaveBeenCalledWith(newTokens);
132
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Access token expired, refreshing...');
133
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Access token refreshed successfully');
134
+ consoleErrorSpy.mockRestore();
135
+ });
136
+ it('should throw error if no valid tokens and refresh fails', async () => {
137
+ const expiredTokens = {
138
+ ...mockStoredTokens,
139
+ expires_at: Date.now() - 1000
140
+ };
141
+ mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
142
+ mockTokenManager.areTokensValid.mockReturnValue(false);
143
+ mockOAuthFlow.refreshAccessToken.mockRejectedValue(new Error('Refresh failed'));
144
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
145
+ await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found');
146
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Token refresh failed:', 'Refresh failed');
147
+ consoleErrorSpy.mockRestore();
148
+ });
149
+ it('should throw error if no tokens exist on disk', async () => {
150
+ mockTokenManager.loadTokens.mockReturnValue(null);
151
+ await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found. Please run the authentication process');
152
+ });
153
+ it('should throw error with helpful message about authentication', async () => {
154
+ mockTokenManager.loadTokens.mockReturnValue(null);
155
+ try {
156
+ await userAuth.getAccessToken();
157
+ expect.fail('Should have thrown error');
158
+ }
159
+ catch (error) {
160
+ expect(error.message).toContain('npx @efficy/tribecrm-mcp-server authenticate');
161
+ expect(error.message).toContain('TRIBECRM_AUTH=app');
162
+ }
163
+ });
164
+ it('should use in-memory token if expiry is more than 60 seconds away', async () => {
165
+ // First call loads from disk
166
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
167
+ mockTokenManager.areTokensValid.mockReturnValue(true);
168
+ await userAuth.getAccessToken();
169
+ // Second call should use in-memory token (not load from disk again)
170
+ mockTokenManager.loadTokens.mockClear();
171
+ const token = await userAuth.getAccessToken();
172
+ expect(token).toBe(mockTokens.access_token);
173
+ expect(mockTokenManager.loadTokens).not.toHaveBeenCalled();
174
+ });
175
+ it('should reload token if expiry is less than 60 seconds away', async () => {
176
+ const soonToExpireTokens = {
177
+ ...mockStoredTokens,
178
+ expires_at: Date.now() + 30000 // 30 seconds from now
179
+ };
180
+ // First call
181
+ mockTokenManager.loadTokens.mockReturnValueOnce(soonToExpireTokens);
182
+ mockTokenManager.areTokensValid.mockReturnValue(true);
183
+ await userAuth.getAccessToken();
184
+ // Second call should reload because expiry is soon
185
+ const freshTokens = {
186
+ ...mockStoredTokens,
187
+ expires_at: Date.now() + 3600000
188
+ };
189
+ mockTokenManager.loadTokens.mockReturnValue(freshTokens);
190
+ mockTokenManager.areTokensValid.mockReturnValue(true);
191
+ const token = await userAuth.getAccessToken();
192
+ expect(token).toBe(mockTokens.access_token);
193
+ expect(mockTokenManager.loadTokens).toHaveBeenCalledTimes(2);
194
+ });
195
+ });
196
+ describe('authenticate', () => {
197
+ it('should complete full OAuth flow successfully', async () => {
198
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
199
+ // Mock browser opening
200
+ const mockExec = vi.fn().mockResolvedValue({ stdout: '', stderr: '' });
201
+ vi.doMock('child_process', () => ({
202
+ exec: mockExec
203
+ }));
204
+ vi.doMock('util', () => ({
205
+ promisify: (fn) => mockExec
206
+ }));
207
+ await userAuth.authenticate();
208
+ // Verify PKCE generation
209
+ expect(mockOAuthFlow.generatePKCE).toHaveBeenCalled();
210
+ expect(OAuthFlow.generateState).toHaveBeenCalled();
211
+ // Verify consent URL generation
212
+ expect(mockOAuthFlow.generateConsentUrl).toHaveBeenCalledWith('test-state', 'test-challenge');
213
+ // Verify callback server was started
214
+ expect(CallbackServer).toHaveBeenCalledWith(3000);
215
+ expect(mockCallbackServer.waitForCallback).toHaveBeenCalledWith('test-state');
216
+ // Verify code exchange
217
+ expect(mockOAuthFlow.exchangeCodeForTokens).toHaveBeenCalledWith('test-auth-code', 'test-verifier');
218
+ // Verify tokens were saved
219
+ expect(mockTokenManager.saveTokens).toHaveBeenCalledWith(mockTokens);
220
+ // Verify success messages
221
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Starting TribeCRM User Authentication'));
222
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Authentication successful'));
223
+ consoleErrorSpy.mockRestore();
224
+ });
225
+ it('should use custom callback port if configured', async () => {
226
+ const customConfig = {
227
+ ...testConfig,
228
+ callbackPort: 4567
229
+ };
230
+ const customUserAuth = new UserAuth(customConfig);
231
+ vi.spyOn(console, 'error').mockImplementation(() => { });
232
+ await customUserAuth.authenticate();
233
+ expect(CallbackServer).toHaveBeenCalledWith(4567);
234
+ });
235
+ it('should throw error if callback fails', async () => {
236
+ mockCallbackServer.waitForCallback.mockRejectedValue(new Error('Callback timeout'));
237
+ vi.spyOn(console, 'error').mockImplementation(() => { });
238
+ await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Callback timeout');
239
+ expect(mockCallbackServer.stop).toHaveBeenCalled();
240
+ });
241
+ it('should throw error if token exchange fails', async () => {
242
+ mockOAuthFlow.exchangeCodeForTokens.mockRejectedValue(new Error('Invalid authorization code'));
243
+ vi.spyOn(console, 'error').mockImplementation(() => { });
244
+ await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Invalid authorization code');
245
+ });
246
+ it('should display consent URL in console', async () => {
247
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
248
+ await userAuth.authenticate();
249
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('https://auth.test.com/consent'));
250
+ consoleErrorSpy.mockRestore();
251
+ });
252
+ });
253
+ describe('isAuthenticated', () => {
254
+ it('should return true if valid token in memory', () => {
255
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
256
+ mockTokenManager.areTokensValid.mockReturnValue(true);
257
+ // Load token into memory
258
+ userAuth.getAccessToken();
259
+ expect(userAuth.isAuthenticated()).toBe(true);
260
+ });
261
+ it('should return true if stored tokens are valid', () => {
262
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
263
+ mockTokenManager.areTokensValid.mockReturnValue(true);
264
+ expect(userAuth.isAuthenticated()).toBe(true);
265
+ });
266
+ it('should return true if tokens expired but refresh_token exists', () => {
267
+ const expiredTokens = {
268
+ ...mockStoredTokens,
269
+ expires_at: Date.now() - 1000
270
+ };
271
+ mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
272
+ mockTokenManager.areTokensValid.mockReturnValue(false);
273
+ expect(userAuth.isAuthenticated()).toBe(true); // Can refresh
274
+ });
275
+ it('should return false if no tokens exist', () => {
276
+ mockTokenManager.loadTokens.mockReturnValue(null);
277
+ expect(userAuth.isAuthenticated()).toBe(false);
278
+ });
279
+ it('should return false if tokens expired and no refresh_token', () => {
280
+ const expiredTokensNoRefresh = {
281
+ access_token: 'old-token',
282
+ token_type: 'Bearer',
283
+ expires_in: 3600,
284
+ expires_at: Date.now() - 1000
285
+ // No refresh_token
286
+ };
287
+ mockTokenManager.loadTokens.mockReturnValue(expiredTokensNoRefresh);
288
+ mockTokenManager.areTokensValid.mockReturnValue(false);
289
+ expect(userAuth.isAuthenticated()).toBe(false);
290
+ });
291
+ it('should check in-memory token before disk', () => {
292
+ // Set up valid in-memory token
293
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
294
+ mockTokenManager.areTokensValid.mockReturnValue(true);
295
+ userAuth.getAccessToken();
296
+ // Clear mock to verify it's not called again
297
+ mockTokenManager.loadTokens.mockClear();
298
+ expect(userAuth.isAuthenticated()).toBe(true);
299
+ expect(mockTokenManager.loadTokens).not.toHaveBeenCalled();
300
+ });
301
+ });
302
+ describe('logout', () => {
303
+ it('should delete tokens and clear memory', async () => {
304
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
305
+ // First authenticate
306
+ mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
307
+ mockTokenManager.areTokensValid.mockReturnValue(true);
308
+ await userAuth.getAccessToken();
309
+ expect(userAuth.isAuthenticated()).toBe(true);
310
+ // Logout
311
+ userAuth.logout();
312
+ expect(mockTokenManager.deleteTokens).toHaveBeenCalled();
313
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Logged out successfully');
314
+ // After logout, should need to load from disk again
315
+ mockTokenManager.loadTokens.mockReturnValue(null);
316
+ expect(userAuth.isAuthenticated()).toBe(false);
317
+ consoleErrorSpy.mockRestore();
318
+ });
319
+ it('should handle logout when not authenticated', () => {
320
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
321
+ userAuth.logout();
322
+ expect(mockTokenManager.deleteTokens).toHaveBeenCalled();
323
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Logged out successfully');
324
+ consoleErrorSpy.mockRestore();
325
+ });
326
+ });
327
+ describe('getTokenPath', () => {
328
+ it('should return token file path from token manager', () => {
329
+ const path = userAuth.getTokenPath();
330
+ expect(path).toBe('/test/tokens.json');
331
+ expect(mockTokenManager.getTokenPath).toHaveBeenCalled();
332
+ });
333
+ });
334
+ describe('edge cases and error handling', () => {
335
+ it('should handle token manager errors gracefully', async () => {
336
+ mockTokenManager.loadTokens.mockImplementation(() => {
337
+ throw new Error('Disk read error');
338
+ });
339
+ await expect(userAuth.getAccessToken()).rejects.toThrow();
340
+ });
341
+ it('should handle OAuth flow errors gracefully', async () => {
342
+ mockOAuthFlow.exchangeCodeForTokens.mockRejectedValue(new Error('Network error'));
343
+ vi.spyOn(console, 'error').mockImplementation(() => { });
344
+ await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Network error');
345
+ });
346
+ it('should handle callback server errors gracefully', async () => {
347
+ mockCallbackServer.waitForCallback.mockRejectedValue(new Error('Port in use'));
348
+ vi.spyOn(console, 'error').mockImplementation(() => { });
349
+ await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Port in use');
350
+ expect(mockCallbackServer.stop).toHaveBeenCalled();
351
+ });
352
+ it('should handle missing refresh_token during refresh', async () => {
353
+ const tokensWithoutRefresh = {
354
+ access_token: 'old-token',
355
+ token_type: 'Bearer',
356
+ expires_in: 3600,
357
+ expires_at: Date.now() - 1000
358
+ // No refresh_token
359
+ };
360
+ mockTokenManager.loadTokens.mockReturnValue(tokensWithoutRefresh);
361
+ mockTokenManager.areTokensValid.mockReturnValue(false);
362
+ await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found');
363
+ });
364
+ });
365
+ });
366
+ //# sourceMappingURL=user-auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-auth.test.js","sourceRoot":"","sources":["../../src/auth/user-auth.test.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -4,7 +4,12 @@ export declare class TribeCRMClient {
4
4
  private config;
5
5
  private token;
6
6
  private tokenExpiry;
7
+ private userAuth;
7
8
  constructor(config: TribeCRMConfig);
9
+ /**
10
+ * Extract port number from redirect URI
11
+ */
12
+ private extractPortFromUri;
8
13
  private ensureAuthenticated;
9
14
  /**
10
15
  * Get a single entity by ID
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAEpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;gBAEpB,MAAM,EAAE,cAAc;YAUpB,mBAAmB;IAyCjC;;;;;;OAMG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlF;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpG;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE;;;;OAIG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GACA,OAAO,CAAC,GAAG,CAAC;IAgBf;;OAEG;IACG,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASvD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAoB/C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAGpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,cAAc;IAyBlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;YASZ,mBAAmB;IAoDjC;;;;;;OAMG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlF;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpG;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE;;;;OAIG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GACA,OAAO,CAAC,GAAG,CAAC;IAgBf;;OAEG;IACG,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASvD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAoB/C"}
package/dist/client.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import axios from 'axios';
2
+ import { UserAuth } from './auth/user-auth.js';
2
3
  export class TribeCRMClient {
3
4
  axiosInstance;
4
5
  config;
5
6
  token = null;
6
7
  tokenExpiry = 0;
8
+ userAuth = null;
7
9
  constructor(config) {
8
10
  this.config = config;
9
11
  this.axiosInstance = axios.create({
@@ -12,6 +14,31 @@ export class TribeCRMClient {
12
14
  'Content-Type': 'application/json',
13
15
  },
14
16
  });
17
+ // Initialize user authentication if authMethod is 'user'
18
+ if (config.authMethod === 'user') {
19
+ const redirectUri = process.env.TRIBECRM_REDIRECT_URI || 'http://localhost:3000/callback';
20
+ const callbackPort = this.extractPortFromUri(redirectUri);
21
+ this.userAuth = new UserAuth({
22
+ authUrl: config.authUrl,
23
+ clientId: config.clientId,
24
+ clientSecret: config.clientSecret,
25
+ redirectUri: redirectUri,
26
+ callbackPort: callbackPort,
27
+ usePKCE: false, // TribeCRM doesn't use PKCE for user auth
28
+ });
29
+ }
30
+ }
31
+ /**
32
+ * Extract port number from redirect URI
33
+ */
34
+ extractPortFromUri(uri) {
35
+ try {
36
+ const url = new URL(uri);
37
+ return url.port ? parseInt(url.port, 10) : 3000;
38
+ }
39
+ catch {
40
+ return 3000;
41
+ }
15
42
  }
16
43
  async ensureAuthenticated() {
17
44
  const now = Date.now();
@@ -21,9 +48,21 @@ export class TribeCRMClient {
21
48
  }
22
49
  // Branch based on authentication method
23
50
  if (this.config.authMethod === 'user') {
24
- // Placeholder for user authentication flow
25
- // TODO: Implement user OAuth flow (authorization code flow)
26
- throw new Error('User authentication is not yet implemented. Please use authMethod: "app" (default).');
51
+ // User authentication (OAuth2 Authorization Code flow)
52
+ if (!this.userAuth) {
53
+ throw new Error('User authentication not initialized');
54
+ }
55
+ try {
56
+ const accessToken = await this.userAuth.getAccessToken();
57
+ this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`;
58
+ // Note: Token expiry is managed by UserAuth internally
59
+ this.token = { access_token: accessToken, token_type: 'bearer', expires_in: 86400, scope: 'read write offline' };
60
+ this.tokenExpiry = now + 86400000; // 24 hours
61
+ }
62
+ catch (error) {
63
+ throw new Error(`User authentication failed: ${error.message}`);
64
+ }
65
+ return;
27
66
  }
28
67
  // Default: App authentication (OAuth2 Client Credentials)
29
68
  try {
@@ -32,7 +71,6 @@ export class TribeCRMClient {
32
71
  client_id: this.config.clientId,
33
72
  client_secret: this.config.clientSecret,
34
73
  scope: 'read write offline',
35
- ...(this.config.organizationId && { organization_id: this.config.organizationId }),
36
74
  }), {
37
75
  headers: {
38
76
  'Content-Type': 'application/x-www-form-urlencoded',
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,6 @@ describe('TribeCRMClient', () => {
16
16
  authUrl: 'https://auth-test.tribecrm.nl',
17
17
  clientId: 'test-client-id',
18
18
  clientSecret: 'test-client-secret',
19
- organizationId: 'test-org-id',
20
19
  mode: 'read-write',
21
20
  };
22
21
  // Mock axios.create to return a mocked instance
@@ -60,7 +59,7 @@ describe('TribeCRMClient', () => {
60
59
  }));
61
60
  expect(result).toEqual({ ID: 'test-employee-id', Name: 'Test User' });
62
61
  });
63
- it('should throw error for user authentication (not yet implemented)', async () => {
62
+ it('should throw error for user authentication without tokens', async () => {
64
63
  const userConfig = {
65
64
  apiUrl: 'https://api-test.tribecrm.nl',
66
65
  authUrl: 'https://auth-test.tribecrm.nl',
@@ -71,7 +70,7 @@ describe('TribeCRMClient', () => {
71
70
  const userClient = new TribeCRMClient(userConfig);
72
71
  await expect(userClient.getCurrentEmployee())
73
72
  .rejects
74
- .toThrow('User authentication is not yet implemented');
73
+ .toThrow('No valid authentication tokens found');
75
74
  });
76
75
  it('should use app authentication by default', async () => {
77
76
  const mockToken = {