bootifyjs 1.2.0 → 1.2.1

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 (123) hide show
  1. package/README.md +1 -1
  2. package/dist/api.d.ts +1 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +1 -0
  5. package/dist/api.js.map +1 -1
  6. package/dist/auth/examples/basic-usage.d.ts +2 -1
  7. package/dist/auth/examples/basic-usage.d.ts.map +1 -1
  8. package/dist/auth/examples/basic-usage.js +3 -2
  9. package/dist/auth/examples/basic-usage.js.map +1 -1
  10. package/dist/auth/index.d.ts +6 -8
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/auth/index.js +11 -11
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/auth/middleware/AuthMiddleware.js.map +1 -1
  15. package/dist/cache/bootstrap.js +1 -1
  16. package/dist/cache/bootstrap.js.map +1 -1
  17. package/dist/cache/index.d.ts +2 -1
  18. package/dist/cache/index.d.ts.map +1 -1
  19. package/dist/cache/index.js +4 -1
  20. package/dist/cache/index.js.map +1 -1
  21. package/dist/cache/{in-memory-cache.store.d.ts → stores/in-memory-cache.store.d.ts} +1 -1
  22. package/dist/cache/stores/in-memory-cache.store.d.ts.map +1 -0
  23. package/dist/cache/{in-memory-cache.store.js → stores/in-memory-cache.store.js} +1 -1
  24. package/dist/cache/stores/in-memory-cache.store.js.map +1 -0
  25. package/dist/cache/stores/index.d.ts +3 -0
  26. package/dist/cache/stores/index.d.ts.map +1 -0
  27. package/dist/cache/stores/index.js +20 -0
  28. package/dist/cache/stores/index.js.map +1 -0
  29. package/dist/cache/stores/redis-cache.store.d.ts +8 -0
  30. package/dist/cache/stores/redis-cache.store.d.ts.map +1 -0
  31. package/dist/cache/stores/redis-cache.store.js +39 -0
  32. package/dist/cache/stores/redis-cache.store.js.map +1 -0
  33. package/dist/core/router.d.ts.map +1 -1
  34. package/dist/core/router.js +3 -3
  35. package/dist/core/router.js.map +1 -1
  36. package/dist/events/bootstrap.d.ts +13 -1
  37. package/dist/events/bootstrap.d.ts.map +1 -1
  38. package/dist/events/bootstrap.js +30 -2
  39. package/dist/events/bootstrap.js.map +1 -1
  40. package/dist/events/buffered-event-bus.service.d.ts +135 -0
  41. package/dist/events/buffered-event-bus.service.d.ts.map +1 -0
  42. package/dist/events/buffered-event-bus.service.js +420 -0
  43. package/dist/events/buffered-event-bus.service.js.map +1 -0
  44. package/dist/events/config/buffered-event-config.d.ts +153 -0
  45. package/dist/events/config/buffered-event-config.d.ts.map +1 -0
  46. package/dist/events/config/buffered-event-config.js +181 -0
  47. package/dist/events/config/buffered-event-config.js.map +1 -0
  48. package/dist/events/index.d.ts +3 -0
  49. package/dist/events/index.d.ts.map +1 -1
  50. package/dist/events/index.js +3 -0
  51. package/dist/events/index.js.map +1 -1
  52. package/dist/events/metrics/event-metrics.d.ts +175 -0
  53. package/dist/events/metrics/event-metrics.d.ts.map +1 -0
  54. package/dist/events/metrics/event-metrics.js +235 -0
  55. package/dist/events/metrics/event-metrics.js.map +1 -0
  56. package/dist/events/monitoring/health-monitor.d.ts +142 -0
  57. package/dist/events/monitoring/health-monitor.d.ts.map +1 -0
  58. package/dist/events/monitoring/health-monitor.js +492 -0
  59. package/dist/events/monitoring/health-monitor.js.map +1 -0
  60. package/dist/events/retry/retry-handler.d.ts +112 -0
  61. package/dist/events/retry/retry-handler.d.ts.map +1 -0
  62. package/dist/events/retry/retry-handler.js +218 -0
  63. package/dist/events/retry/retry-handler.js.map +1 -0
  64. package/dist/events/shared-buffer.d.ts +92 -0
  65. package/dist/events/shared-buffer.d.ts.map +1 -0
  66. package/dist/events/shared-buffer.js +179 -0
  67. package/dist/events/shared-buffer.js.map +1 -0
  68. package/dist/events/worker/event-processor.worker.d.ts +75 -0
  69. package/dist/events/worker/event-processor.worker.d.ts.map +1 -0
  70. package/dist/events/worker/event-processor.worker.js +293 -0
  71. package/dist/events/worker/event-processor.worker.js.map +1 -0
  72. package/dist/events/worker/worker-manager.d.ts +132 -0
  73. package/dist/events/worker/worker-manager.d.ts.map +1 -0
  74. package/dist/events/worker/worker-manager.js +436 -0
  75. package/dist/events/worker/worker-manager.js.map +1 -0
  76. package/dist/examples/auth/auth.middleware.d.ts +0 -26
  77. package/dist/examples/auth/auth.middleware.d.ts.map +1 -1
  78. package/dist/examples/auth/auth.middleware.js +0 -185
  79. package/dist/examples/auth/auth.middleware.js.map +1 -1
  80. package/dist/examples/controllers/auth.controller.d.ts +0 -63
  81. package/dist/examples/controllers/auth.controller.d.ts.map +1 -1
  82. package/dist/examples/controllers/auth.controller.js +247 -282
  83. package/dist/examples/controllers/auth.controller.js.map +1 -1
  84. package/dist/examples/events/buffered-event-example.d.ts +71 -0
  85. package/dist/examples/events/buffered-event-example.d.ts.map +1 -0
  86. package/dist/examples/events/buffered-event-example.js +182 -0
  87. package/dist/examples/events/buffered-event-example.js.map +1 -0
  88. package/dist/examples/events/integration-test.d.ts +10 -0
  89. package/dist/examples/events/integration-test.d.ts.map +1 -0
  90. package/dist/examples/events/integration-test.js +147 -0
  91. package/dist/examples/events/integration-test.js.map +1 -0
  92. package/dist/examples/index.d.ts +1 -0
  93. package/dist/examples/index.d.ts.map +1 -1
  94. package/dist/examples/index.js +9 -6
  95. package/dist/examples/index.js.map +1 -1
  96. package/dist/examples/todos/schema.d.ts +4 -4
  97. package/package.json +1 -1
  98. package/dist/cache/in-memory-cache.store.d.ts.map +0 -1
  99. package/dist/cache/in-memory-cache.store.js.map +0 -1
  100. package/dist/examples/authorization-examples.d.ts +0 -67
  101. package/dist/examples/authorization-examples.d.ts.map +0 -1
  102. package/dist/examples/authorization-examples.js +0 -202
  103. package/dist/examples/authorization-examples.js.map +0 -1
  104. package/dist/examples/controllers/todo-updated.controller.d.ts +0 -103
  105. package/dist/examples/controllers/todo-updated.controller.d.ts.map +0 -1
  106. package/dist/examples/controllers/todo-updated.controller.js +0 -328
  107. package/dist/examples/controllers/todo-updated.controller.js.map +0 -1
  108. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts +0 -114
  109. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts.map +0 -1
  110. package/dist/examples/controllers/todo-with-jwt-auth.controller.js +0 -329
  111. package/dist/examples/controllers/todo-with-jwt-auth.controller.js.map +0 -1
  112. package/dist/examples/jwt-auth-example.d.ts +0 -47
  113. package/dist/examples/jwt-auth-example.d.ts.map +0 -1
  114. package/dist/examples/jwt-auth-example.js +0 -316
  115. package/dist/examples/jwt-auth-example.js.map +0 -1
  116. package/dist/examples/services/user.service.d.ts +0 -99
  117. package/dist/examples/services/user.service.d.ts.map +0 -1
  118. package/dist/examples/services/user.service.js +0 -281
  119. package/dist/examples/services/user.service.js.map +0 -1
  120. package/dist/examples/test-auth-flow.d.ts +0 -56
  121. package/dist/examples/test-auth-flow.d.ts.map +0 -1
  122. package/dist/examples/test-auth-flow.js +0 -449
  123. package/dist/examples/test-auth-flow.js.map +0 -1
@@ -1,449 +0,0 @@
1
- "use strict";
2
- /**
3
- * JWT Authentication Flow Test Script
4
- * Tests the complete authentication flow including login, protected routes, and token refresh
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.AuthFlowTester = void 0;
8
- class AuthFlowTester {
9
- constructor(baseUrl = 'http://localhost:3000') {
10
- this.accessToken = '';
11
- this.refreshToken = '';
12
- this.baseUrl = baseUrl;
13
- }
14
- /**
15
- * Test server health check
16
- */
17
- async testHealthCheck() {
18
- try {
19
- console.log('\n🔍 Testing health check...');
20
- // Mock health check response (install axios with: npm install axios @types/axios)
21
- const response = {
22
- status: 200,
23
- data: { status: 'ok', timestamp: new Date().toISOString() },
24
- statusText: 'OK'
25
- };
26
- console.log('✅ Health check passed:', response.data);
27
- return true;
28
- }
29
- catch (error) {
30
- console.error('❌ Health check failed:', error.message);
31
- return false;
32
- }
33
- }
34
- /**
35
- * Test user login
36
- */
37
- async testLogin(username, password) {
38
- try {
39
- console.log(`\n🔐 Testing login for user: ${username}`);
40
- // const response: AxiosResponse<LoginResponse> = await axios.post(
41
- // `${this.baseUrl}/auth/login`,
42
- // { username, password }
43
- // );
44
- // Mock successful login response for testing
45
- const response = {
46
- data: {
47
- accessToken: 'mock-access-token',
48
- refreshToken: 'mock-refresh-token',
49
- expiresIn: 900,
50
- tokenType: 'Bearer',
51
- user: { id: '1', username, email: `${username}@example.com`, roles: username === 'admin' ? ['admin', 'user'] : ['user'] }
52
- },
53
- status: 200,
54
- statusText: 'OK'
55
- };
56
- if (response.data.accessToken && response.data.refreshToken) {
57
- this.accessToken = response.data.accessToken;
58
- this.refreshToken = response.data.refreshToken;
59
- console.log('✅ Login successful');
60
- console.log(' User:', response.data.user);
61
- console.log(' Token expires in:', response.data.expiresIn, 'seconds');
62
- return true;
63
- }
64
- else {
65
- console.error('❌ Login failed: No tokens received');
66
- return false;
67
- }
68
- }
69
- catch (error) {
70
- console.error('❌ Login failed:', error.response?.data || error.message);
71
- return false;
72
- }
73
- }
74
- /**
75
- * Test invalid login credentials
76
- */
77
- async testInvalidLogin() {
78
- try {
79
- console.log('\n🚫 Testing invalid login credentials...');
80
- // Mock invalid login response (install axios with: npm install axios @types/axios)
81
- const error = {
82
- response: {
83
- status: 401,
84
- data: { message: 'Invalid credentials' }
85
- }
86
- };
87
- throw error;
88
- }
89
- catch (error) {
90
- if (error.response?.status === 401) {
91
- console.log('✅ Invalid login correctly rejected:', error.response.data.message);
92
- return true;
93
- }
94
- else {
95
- console.error('❌ Unexpected error:', error.message);
96
- return false;
97
- }
98
- }
99
- }
100
- /**
101
- * Test accessing protected route with valid token
102
- */
103
- async testProtectedRoute() {
104
- try {
105
- console.log('\n🛡️ Testing protected route with valid token...');
106
- // Mock protected route response (install axios with: npm install axios @types/axios)
107
- const response = {
108
- data: {
109
- success: true,
110
- data: {
111
- id: '1',
112
- username: 'user',
113
- email: 'user@example.com',
114
- roles: ['user']
115
- }
116
- },
117
- status: 200,
118
- statusText: 'OK'
119
- };
120
- if (response.data.success) {
121
- console.log('✅ Protected route access successful');
122
- console.log(' Profile data:', response.data.data);
123
- return true;
124
- }
125
- else {
126
- console.error('❌ Protected route failed:', response.data.error);
127
- return false;
128
- }
129
- }
130
- catch (error) {
131
- console.error('❌ Protected route failed:', error.response?.data || error.message);
132
- return false;
133
- }
134
- }
135
- /**
136
- * Test accessing protected route without token
137
- */
138
- async testProtectedRouteWithoutToken() {
139
- try {
140
- console.log('\n🚫 Testing protected route without token...');
141
- // Mock unauthorized response (install axios with: npm install axios @types/axios)
142
- const error = {
143
- response: {
144
- status: 401,
145
- data: { message: 'No authorization token provided' }
146
- }
147
- };
148
- throw error;
149
- }
150
- catch (error) {
151
- if (error.response?.status === 401) {
152
- console.log('✅ Protected route correctly rejected:', error.response.data.message);
153
- return true;
154
- }
155
- else {
156
- console.error('❌ Unexpected error:', error.message);
157
- return false;
158
- }
159
- }
160
- }
161
- /**
162
- * Test accessing protected route with invalid token
163
- */
164
- async testProtectedRouteWithInvalidToken() {
165
- try {
166
- console.log('\n🚫 Testing protected route with invalid token...');
167
- // Mock invalid token response (install axios with: npm install axios @types/axios)
168
- const error = {
169
- response: {
170
- status: 401,
171
- data: { message: 'Invalid or expired token' }
172
- }
173
- };
174
- throw error;
175
- }
176
- catch (error) {
177
- if (error.response?.status === 401) {
178
- console.log('✅ Invalid token correctly rejected:', error.response.data.message);
179
- return true;
180
- }
181
- else {
182
- console.error('❌ Unexpected error:', error.message);
183
- return false;
184
- }
185
- }
186
- }
187
- /**
188
- * Test public route with optional authentication
189
- */
190
- async testPublicRoute() {
191
- try {
192
- console.log('\n🌐 Testing public route without token...');
193
- // Mock public route response without token (install axios with: npm install axios @types/axios)
194
- const response1 = {
195
- data: {
196
- success: true,
197
- data: {
198
- authenticated: false,
199
- message: 'Public information'
200
- }
201
- },
202
- status: 200,
203
- statusText: 'OK'
204
- };
205
- if (response1.data.success && response1.data.data?.authenticated === false) {
206
- console.log('✅ Public route works without token');
207
- }
208
- else {
209
- console.error('❌ Public route failed without token');
210
- return false;
211
- }
212
- console.log('\n🌐 Testing public route with token...');
213
- // Mock public route response with token
214
- const response2 = {
215
- data: {
216
- success: true,
217
- data: {
218
- authenticated: true,
219
- message: 'Public information',
220
- user: {
221
- id: '1',
222
- username: 'user',
223
- email: 'user@example.com'
224
- }
225
- }
226
- },
227
- status: 200,
228
- statusText: 'OK'
229
- };
230
- if (response2.data.success && response2.data.data?.authenticated === true) {
231
- console.log('✅ Public route works with token');
232
- console.log(' User info:', response2.data.data.user);
233
- return true;
234
- }
235
- else {
236
- console.error('❌ Public route failed with token');
237
- return false;
238
- }
239
- }
240
- catch (error) {
241
- console.error('❌ Public route test failed:', error.response?.data || error.message);
242
- return false;
243
- }
244
- }
245
- /**
246
- * Test token refresh
247
- */
248
- async testTokenRefresh() {
249
- try {
250
- console.log('\n🔄 Testing token refresh...');
251
- // Mock token refresh response (install axios with: npm install axios @types/axios)
252
- const response = {
253
- data: {
254
- accessToken: 'new-mock-access-token-' + Date.now(),
255
- refreshToken: 'new-mock-refresh-token-' + Date.now(),
256
- expiresIn: 900,
257
- tokenType: 'Bearer'
258
- },
259
- status: 200,
260
- statusText: 'OK'
261
- };
262
- if (response.data.accessToken) {
263
- const oldToken = this.accessToken;
264
- this.accessToken = response.data.accessToken;
265
- this.refreshToken = response.data.refreshToken;
266
- console.log('✅ Token refresh successful');
267
- console.log(' New token expires in:', response.data.expiresIn, 'seconds');
268
- console.log(' Token changed:', oldToken !== this.accessToken);
269
- return true;
270
- }
271
- else {
272
- console.error('❌ Token refresh failed: No new token received');
273
- return false;
274
- }
275
- }
276
- catch (error) {
277
- console.error('❌ Token refresh failed:', error.response?.data || error.message);
278
- return false;
279
- }
280
- }
281
- /**
282
- * Test admin route access
283
- */
284
- async testAdminRoute(shouldSucceed = false) {
285
- try {
286
- console.log('\n👑 Testing admin route access...');
287
- if (shouldSucceed) {
288
- // Mock successful admin route response (install axios with: npm install axios @types/axios)
289
- const response = {
290
- data: {
291
- success: true,
292
- data: [
293
- { id: '1', username: 'admin', roles: ['admin'] },
294
- { id: '2', username: 'user', roles: ['user'] }
295
- ]
296
- },
297
- status: 200,
298
- statusText: 'OK'
299
- };
300
- console.log('✅ Admin route access successful');
301
- console.log(' Users count:', response.data.data?.length || 0);
302
- return true;
303
- }
304
- else {
305
- // Mock forbidden response
306
- const error = {
307
- response: {
308
- status: 403,
309
- data: { message: 'Insufficient permissions' }
310
- }
311
- };
312
- throw error;
313
- }
314
- }
315
- catch (error) {
316
- if (!shouldSucceed && error.response?.status === 403) {
317
- console.log('✅ Admin route correctly rejected:', error.response.data.message);
318
- return true;
319
- }
320
- else if (shouldSucceed) {
321
- console.error('❌ Admin route failed:', error.response?.data || error.message);
322
- return false;
323
- }
324
- else {
325
- console.error('❌ Unexpected error:', error.message);
326
- return false;
327
- }
328
- }
329
- }
330
- /**
331
- * Test logout
332
- */
333
- async testLogout() {
334
- try {
335
- console.log('\n🚪 Testing logout...');
336
- // Mock logout response (install axios with: npm install axios @types/axios)
337
- const response = {
338
- data: {
339
- message: 'Successfully logged out'
340
- },
341
- status: 200,
342
- statusText: 'OK'
343
- };
344
- if (response.data.message) {
345
- console.log('✅ Logout successful:', response.data.message);
346
- // Test that the token is now invalid
347
- try {
348
- // Mock token invalidation after logout
349
- const error = {
350
- response: {
351
- status: 401,
352
- data: { message: 'Token has been invalidated' }
353
- }
354
- };
355
- throw error;
356
- }
357
- catch (error) {
358
- if (error.response?.status === 401) {
359
- console.log('✅ Token correctly invalidated after logout');
360
- }
361
- }
362
- return true;
363
- }
364
- else {
365
- console.error('❌ Logout failed: No confirmation message');
366
- return false;
367
- }
368
- }
369
- catch (error) {
370
- console.error('❌ Logout failed:', error.response?.data || error.message);
371
- return false;
372
- }
373
- }
374
- /**
375
- * Run complete authentication flow test
376
- */
377
- async runCompleteTest() {
378
- console.log('🚀 Starting JWT Authentication Flow Test');
379
- console.log('='.repeat(50));
380
- const results = {};
381
- // Test health check
382
- results.healthCheck = await this.testHealthCheck();
383
- if (!results.healthCheck) {
384
- console.log('\n❌ Server is not running. Please start the server first.');
385
- return;
386
- }
387
- // Test invalid login
388
- results.invalidLogin = await this.testInvalidLogin();
389
- // Test regular user login
390
- results.userLogin = await this.testLogin('user', 'user123');
391
- if (results.userLogin) {
392
- results.protectedRoute = await this.testProtectedRoute();
393
- results.publicRoute = await this.testPublicRoute();
394
- results.adminRouteRejected = await this.testAdminRoute(false);
395
- results.tokenRefresh = await this.testTokenRefresh();
396
- }
397
- // Test admin user login
398
- results.adminLogin = await this.testLogin('admin', 'admin123');
399
- if (results.adminLogin) {
400
- results.adminRouteAllowed = await this.testAdminRoute(true);
401
- results.logout = await this.testLogout();
402
- }
403
- // Test protected route without token
404
- results.protectedRouteWithoutToken = await this.testProtectedRouteWithoutToken();
405
- // Test protected route with invalid token
406
- results.protectedRouteWithInvalidToken = await this.testProtectedRouteWithInvalidToken();
407
- // Print summary
408
- console.log('\n' + '='.repeat(50));
409
- console.log('📊 TEST SUMMARY');
410
- console.log('='.repeat(50));
411
- const passed = Object.values(results).filter(Boolean).length;
412
- const total = Object.keys(results).length;
413
- Object.entries(results).forEach(([test, result]) => {
414
- const status = result ? '✅ PASS' : '❌ FAIL';
415
- const testName = test.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase());
416
- console.log(`${status} ${testName}`);
417
- });
418
- console.log('\n' + '-'.repeat(30));
419
- console.log(`📈 Overall: ${passed}/${total} tests passed (${Math.round(passed / total * 100)}%)`);
420
- if (passed === total) {
421
- console.log('🎉 All tests passed! JWT authentication is working correctly.');
422
- }
423
- else {
424
- console.log('⚠️ Some tests failed. Please check the implementation.');
425
- }
426
- }
427
- }
428
- exports.AuthFlowTester = AuthFlowTester;
429
- /**
430
- * Run the test if this file is executed directly
431
- */
432
- if (require.main === module) {
433
- const tester = new AuthFlowTester();
434
- // Check if server URL is provided as argument
435
- const serverUrl = process.argv[2];
436
- let authTester;
437
- if (serverUrl) {
438
- console.log(`Using server URL: ${serverUrl}`);
439
- authTester = new AuthFlowTester(serverUrl);
440
- }
441
- else {
442
- authTester = tester;
443
- }
444
- authTester.runCompleteTest().catch(error => {
445
- console.error('Test execution failed:', error);
446
- process.exit(1);
447
- });
448
- }
449
- //# sourceMappingURL=test-auth-flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-auth-flow.js","sourceRoot":"","sources":["../../src/examples/test-auth-flow.ts"],"names":[],"mappings":"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"}