serverless-event-orchestrator 2.2.0 → 2.4.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 (45) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +489 -489
  3. package/dist/dispatcher.d.ts +6 -1
  4. package/dist/dispatcher.d.ts.map +1 -1
  5. package/dist/dispatcher.js +31 -7
  6. package/dist/dispatcher.js.map +1 -1
  7. package/dist/tenant/helpers.js +1 -1
  8. package/dist/tenant/helpers.js.map +1 -1
  9. package/jest.config.js +32 -32
  10. package/package.json +82 -81
  11. package/src/dispatcher.ts +586 -558
  12. package/src/http/body-parser.ts +60 -60
  13. package/src/http/cors.ts +76 -76
  14. package/src/http/index.ts +3 -3
  15. package/src/http/response.ts +209 -209
  16. package/src/identity/extractor.ts +207 -207
  17. package/src/identity/index.ts +2 -2
  18. package/src/identity/jwt-verifier.ts +41 -41
  19. package/src/index.ts +128 -128
  20. package/src/middleware/crm-guard.ts +51 -51
  21. package/src/middleware/index.ts +3 -3
  22. package/src/middleware/init-tenant-context.ts +59 -59
  23. package/src/middleware/tenant-guard.ts +54 -54
  24. package/src/tenant/TenantContext.ts +115 -115
  25. package/src/tenant/helpers.ts +112 -112
  26. package/src/tenant/index.ts +21 -21
  27. package/src/tenant/types.ts +101 -101
  28. package/src/types/event-type.enum.ts +21 -21
  29. package/src/types/index.ts +2 -2
  30. package/src/types/routes.ts +218 -218
  31. package/src/utils/headers.ts +72 -72
  32. package/src/utils/index.ts +2 -2
  33. package/src/utils/path-matcher.ts +84 -84
  34. package/tests/cors.test.ts +133 -133
  35. package/tests/dispatcher.test.ts +795 -715
  36. package/tests/headers.test.ts +99 -99
  37. package/tests/identity.test.ts +301 -301
  38. package/tests/middleware/crm-guard.test.ts +69 -69
  39. package/tests/middleware/init-tenant-context.test.ts +147 -147
  40. package/tests/middleware/tenant-guard.test.ts +100 -100
  41. package/tests/path-matcher.test.ts +102 -102
  42. package/tests/response.test.ts +155 -155
  43. package/tests/tenant/TenantContext.test.ts +134 -134
  44. package/tests/tenant/helpers.test.ts +187 -187
  45. package/tsconfig.json +24 -24
@@ -1,99 +1,99 @@
1
- import { normalizeHeaders, getHeader, getCorsHeaders } from '../src/utils/headers';
2
-
3
- describe('normalizeHeaders', () => {
4
- it('should convert all header keys to lowercase', () => {
5
- const headers = {
6
- 'Content-Type': 'application/json',
7
- 'X-Custom-Header': 'value',
8
- 'AUTHORIZATION': 'Bearer token'
9
- };
10
-
11
- const normalized = normalizeHeaders(headers);
12
-
13
- expect(normalized['content-type']).toBe('application/json');
14
- expect(normalized['x-custom-header']).toBe('value');
15
- expect(normalized['authorization']).toBe('Bearer token');
16
- });
17
-
18
- it('should return empty object for undefined headers', () => {
19
- expect(normalizeHeaders(undefined)).toEqual({});
20
- });
21
-
22
- it('should return empty object for empty headers', () => {
23
- expect(normalizeHeaders({})).toEqual({});
24
- });
25
- });
26
-
27
- describe('getHeader', () => {
28
- const headers = {
29
- 'Content-Type': 'application/json',
30
- 'X-Request-ID': '12345'
31
- };
32
-
33
- it('should get header case-insensitively', () => {
34
- expect(getHeader(headers, 'content-type')).toBe('application/json');
35
- expect(getHeader(headers, 'Content-Type')).toBe('application/json');
36
- expect(getHeader(headers, 'CONTENT-TYPE')).toBe('application/json');
37
- });
38
-
39
- it('should return undefined for missing header', () => {
40
- expect(getHeader(headers, 'Authorization')).toBeUndefined();
41
- });
42
-
43
- it('should return undefined for undefined headers', () => {
44
- expect(getHeader(undefined, 'Content-Type')).toBeUndefined();
45
- });
46
- });
47
-
48
- describe('getCorsHeaders', () => {
49
- it('should return default CORS headers without config', () => {
50
- const corsHeaders = getCorsHeaders();
51
-
52
- expect(corsHeaders['Access-Control-Allow-Origin']).toBe('*');
53
- expect(corsHeaders['Access-Control-Allow-Methods']).toContain('GET');
54
- expect(corsHeaders['Access-Control-Allow-Methods']).toContain('POST');
55
- expect(corsHeaders['Access-Control-Allow-Headers']).toContain('Content-Type');
56
- });
57
-
58
- it('should use custom origins', () => {
59
- const corsHeaders = getCorsHeaders({
60
- origins: ['https://example.com', 'https://app.example.com']
61
- });
62
-
63
- expect(corsHeaders['Access-Control-Allow-Origin']).toBe('https://example.com, https://app.example.com');
64
- });
65
-
66
- it('should use wildcard origin', () => {
67
- const corsHeaders = getCorsHeaders({ origins: '*' });
68
-
69
- expect(corsHeaders['Access-Control-Allow-Origin']).toBe('*');
70
- });
71
-
72
- it('should set credentials header', () => {
73
- const corsHeaders = getCorsHeaders({ credentials: true });
74
-
75
- expect(corsHeaders['Access-Control-Allow-Credentials']).toBe('true');
76
- });
77
-
78
- it('should set max age header', () => {
79
- const corsHeaders = getCorsHeaders({ maxAge: 86400 });
80
-
81
- expect(corsHeaders['Access-Control-Max-Age']).toBe('86400');
82
- });
83
-
84
- it('should use custom methods', () => {
85
- const corsHeaders = getCorsHeaders({
86
- methods: ['GET', 'POST']
87
- });
88
-
89
- expect(corsHeaders['Access-Control-Allow-Methods']).toBe('GET, POST');
90
- });
91
-
92
- it('should use custom headers', () => {
93
- const corsHeaders = getCorsHeaders({
94
- headers: ['X-Custom-Header', 'X-Another-Header']
95
- });
96
-
97
- expect(corsHeaders['Access-Control-Allow-Headers']).toBe('X-Custom-Header, X-Another-Header');
98
- });
99
- });
1
+ import { normalizeHeaders, getHeader, getCorsHeaders } from '../src/utils/headers';
2
+
3
+ describe('normalizeHeaders', () => {
4
+ it('should convert all header keys to lowercase', () => {
5
+ const headers = {
6
+ 'Content-Type': 'application/json',
7
+ 'X-Custom-Header': 'value',
8
+ 'AUTHORIZATION': 'Bearer token'
9
+ };
10
+
11
+ const normalized = normalizeHeaders(headers);
12
+
13
+ expect(normalized['content-type']).toBe('application/json');
14
+ expect(normalized['x-custom-header']).toBe('value');
15
+ expect(normalized['authorization']).toBe('Bearer token');
16
+ });
17
+
18
+ it('should return empty object for undefined headers', () => {
19
+ expect(normalizeHeaders(undefined)).toEqual({});
20
+ });
21
+
22
+ it('should return empty object for empty headers', () => {
23
+ expect(normalizeHeaders({})).toEqual({});
24
+ });
25
+ });
26
+
27
+ describe('getHeader', () => {
28
+ const headers = {
29
+ 'Content-Type': 'application/json',
30
+ 'X-Request-ID': '12345'
31
+ };
32
+
33
+ it('should get header case-insensitively', () => {
34
+ expect(getHeader(headers, 'content-type')).toBe('application/json');
35
+ expect(getHeader(headers, 'Content-Type')).toBe('application/json');
36
+ expect(getHeader(headers, 'CONTENT-TYPE')).toBe('application/json');
37
+ });
38
+
39
+ it('should return undefined for missing header', () => {
40
+ expect(getHeader(headers, 'Authorization')).toBeUndefined();
41
+ });
42
+
43
+ it('should return undefined for undefined headers', () => {
44
+ expect(getHeader(undefined, 'Content-Type')).toBeUndefined();
45
+ });
46
+ });
47
+
48
+ describe('getCorsHeaders', () => {
49
+ it('should return default CORS headers without config', () => {
50
+ const corsHeaders = getCorsHeaders();
51
+
52
+ expect(corsHeaders['Access-Control-Allow-Origin']).toBe('*');
53
+ expect(corsHeaders['Access-Control-Allow-Methods']).toContain('GET');
54
+ expect(corsHeaders['Access-Control-Allow-Methods']).toContain('POST');
55
+ expect(corsHeaders['Access-Control-Allow-Headers']).toContain('Content-Type');
56
+ });
57
+
58
+ it('should use custom origins', () => {
59
+ const corsHeaders = getCorsHeaders({
60
+ origins: ['https://example.com', 'https://app.example.com']
61
+ });
62
+
63
+ expect(corsHeaders['Access-Control-Allow-Origin']).toBe('https://example.com, https://app.example.com');
64
+ });
65
+
66
+ it('should use wildcard origin', () => {
67
+ const corsHeaders = getCorsHeaders({ origins: '*' });
68
+
69
+ expect(corsHeaders['Access-Control-Allow-Origin']).toBe('*');
70
+ });
71
+
72
+ it('should set credentials header', () => {
73
+ const corsHeaders = getCorsHeaders({ credentials: true });
74
+
75
+ expect(corsHeaders['Access-Control-Allow-Credentials']).toBe('true');
76
+ });
77
+
78
+ it('should set max age header', () => {
79
+ const corsHeaders = getCorsHeaders({ maxAge: 86400 });
80
+
81
+ expect(corsHeaders['Access-Control-Max-Age']).toBe('86400');
82
+ });
83
+
84
+ it('should use custom methods', () => {
85
+ const corsHeaders = getCorsHeaders({
86
+ methods: ['GET', 'POST']
87
+ });
88
+
89
+ expect(corsHeaders['Access-Control-Allow-Methods']).toBe('GET, POST');
90
+ });
91
+
92
+ it('should use custom headers', () => {
93
+ const corsHeaders = getCorsHeaders({
94
+ headers: ['X-Custom-Header', 'X-Another-Header']
95
+ });
96
+
97
+ expect(corsHeaders['Access-Control-Allow-Headers']).toBe('X-Custom-Header, X-Another-Header');
98
+ });
99
+ });