@geekmidas/constructs 0.0.6 → 0.0.7

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 (99) hide show
  1. package/dist/{Cron-D6MyCqby.cjs → Cron-CmZ6esMM.cjs} +1 -1
  2. package/dist/{Cron-D6MyCqby.cjs.map → Cron-CmZ6esMM.cjs.map} +1 -1
  3. package/dist/{Cron-z0RiwSnT.mjs → Cron-D6hnZLk7.mjs} +1 -1
  4. package/dist/{Cron-z0RiwSnT.mjs.map → Cron-D6hnZLk7.mjs.map} +1 -1
  5. package/dist/{CronBuilder-BLTgwOWp.mjs → CronBuilder-Dfv5JguE.mjs} +2 -2
  6. package/dist/{CronBuilder-BLTgwOWp.mjs.map → CronBuilder-Dfv5JguE.mjs.map} +1 -1
  7. package/dist/{CronBuilder-BOsYnZIm.cjs → CronBuilder-Di7QK8Rt.cjs} +2 -2
  8. package/dist/{CronBuilder-BOsYnZIm.cjs.map → CronBuilder-Di7QK8Rt.cjs.map} +1 -1
  9. package/dist/{EndpointBuilder-DUE8ETVR.cjs → EndpointBuilder-FJktpPOu.cjs} +1 -1
  10. package/dist/{EndpointBuilder-DUE8ETVR.cjs.map → EndpointBuilder-FJktpPOu.cjs.map} +1 -1
  11. package/dist/{EndpointBuilder-DpmUw--c.mjs → EndpointBuilder-oXO_ka1-.mjs} +1 -1
  12. package/dist/{EndpointBuilder-DpmUw--c.mjs.map → EndpointBuilder-oXO_ka1-.mjs.map} +1 -1
  13. package/dist/{EndpointFactory-YAR24M2i.cjs → EndpointFactory-Kk1tpifs.cjs} +2 -2
  14. package/dist/{EndpointFactory-YAR24M2i.cjs.map → EndpointFactory-Kk1tpifs.cjs.map} +1 -1
  15. package/dist/{EndpointFactory-CuJUCyvZ.mjs → EndpointFactory-eG8bDhOh.mjs} +2 -2
  16. package/dist/{EndpointFactory-CuJUCyvZ.mjs.map → EndpointFactory-eG8bDhOh.mjs.map} +1 -1
  17. package/dist/{HonoEndpointAdaptor-CGSqpnCD.d.cts → HonoEndpointAdaptor-BrbM9vxd.d.cts} +3 -3
  18. package/dist/{HonoEndpointAdaptor-C9Xe2pRp.d.mts → HonoEndpointAdaptor-CxcYKdzT.d.mts} +3 -3
  19. package/dist/{Subscriber-G7EUI3yc.cjs → Subscriber-CSt7EOlT.cjs} +1 -1
  20. package/dist/{Subscriber-G7EUI3yc.cjs.map → Subscriber-CSt7EOlT.cjs.map} +1 -1
  21. package/dist/{Subscriber-BTwKnz3c.mjs → Subscriber-DkCDcTUL.mjs} +1 -1
  22. package/dist/{Subscriber-BTwKnz3c.mjs.map → Subscriber-DkCDcTUL.mjs.map} +1 -1
  23. package/dist/{SubscriberBuilder-C1me_972.mjs → SubscriberBuilder-Bn9Hyi28.mjs} +2 -2
  24. package/dist/{SubscriberBuilder-C1me_972.mjs.map → SubscriberBuilder-Bn9Hyi28.mjs.map} +1 -1
  25. package/dist/{SubscriberBuilder-C6iZvuDe.cjs → SubscriberBuilder-RsiOmnwq.cjs} +2 -2
  26. package/dist/{SubscriberBuilder-C6iZvuDe.cjs.map → SubscriberBuilder-RsiOmnwq.cjs.map} +1 -1
  27. package/dist/{TestEndpointAdaptor-BG6fzAOx.mjs → TestEndpointAdaptor-Ct4I-gDo.mjs} +32 -6
  28. package/dist/TestEndpointAdaptor-Ct4I-gDo.mjs.map +1 -0
  29. package/dist/{TestEndpointAdaptor-BaQaTy_1.cjs → TestEndpointAdaptor-FJUob2W_.cjs} +32 -6
  30. package/dist/TestEndpointAdaptor-FJUob2W_.cjs.map +1 -0
  31. package/dist/{TestEndpointAdaptor-Db0cm1fb.d.mts → TestEndpointAdaptor-vboVyJ0w.d.mts} +10 -4
  32. package/dist/{TestEndpointAdaptor-v7A-7hTs.d.cts → TestEndpointAdaptor-wwEaVHAt.d.cts} +10 -4
  33. package/dist/adaptors/aws.d.cts +1 -1
  34. package/dist/adaptors/aws.d.mts +1 -1
  35. package/dist/adaptors/hono.d.cts +2 -2
  36. package/dist/adaptors/hono.d.mts +2 -2
  37. package/dist/adaptors/testing.cjs +1 -1
  38. package/dist/adaptors/testing.d.cts +2 -2
  39. package/dist/adaptors/testing.d.mts +2 -2
  40. package/dist/adaptors/testing.mjs +1 -1
  41. package/dist/crons/Cron.cjs +1 -1
  42. package/dist/crons/Cron.d.cts +1 -1
  43. package/dist/crons/Cron.d.mts +1 -1
  44. package/dist/crons/Cron.mjs +1 -1
  45. package/dist/crons/CronBuilder.cjs +2 -2
  46. package/dist/crons/CronBuilder.d.cts +1 -1
  47. package/dist/crons/CronBuilder.d.mts +1 -1
  48. package/dist/crons/CronBuilder.mjs +2 -2
  49. package/dist/crons/index.cjs +2 -2
  50. package/dist/crons/index.d.cts +5 -5
  51. package/dist/crons/index.d.mts +5 -5
  52. package/dist/crons/index.mjs +2 -2
  53. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
  54. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +1 -1
  55. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
  56. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +1 -1
  57. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
  58. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +1 -1
  59. package/dist/endpoints/Endpoint.d.cts +1 -1
  60. package/dist/endpoints/Endpoint.d.mts +1 -1
  61. package/dist/endpoints/EndpointBuilder.cjs +1 -1
  62. package/dist/endpoints/EndpointBuilder.d.cts +1 -1
  63. package/dist/endpoints/EndpointBuilder.d.mts +1 -1
  64. package/dist/endpoints/EndpointBuilder.mjs +1 -1
  65. package/dist/endpoints/EndpointFactory.cjs +2 -2
  66. package/dist/endpoints/EndpointFactory.d.cts +1 -1
  67. package/dist/endpoints/EndpointFactory.d.mts +1 -1
  68. package/dist/endpoints/EndpointFactory.mjs +2 -2
  69. package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
  70. package/dist/endpoints/HonoEndpointAdaptor.d.mts +2 -2
  71. package/dist/endpoints/TestEndpointAdaptor.cjs +1 -1
  72. package/dist/endpoints/TestEndpointAdaptor.d.cts +3 -3
  73. package/dist/endpoints/TestEndpointAdaptor.d.mts +3 -3
  74. package/dist/endpoints/TestEndpointAdaptor.mjs +1 -1
  75. package/dist/endpoints/helpers.d.cts +1 -1
  76. package/dist/endpoints/helpers.d.mts +1 -1
  77. package/dist/endpoints/index.cjs +2 -2
  78. package/dist/endpoints/index.d.cts +3 -3
  79. package/dist/endpoints/index.d.mts +3 -3
  80. package/dist/endpoints/index.mjs +2 -2
  81. package/dist/functions/index.d.cts +1 -1
  82. package/dist/functions/index.d.mts +1 -1
  83. package/dist/index-BGr5gFrX.d.cts +9 -0
  84. package/dist/index-YM4W9XUq.d.mts +9 -0
  85. package/dist/subscribers/Subscriber.cjs +1 -1
  86. package/dist/subscribers/Subscriber.mjs +1 -1
  87. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  88. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  89. package/dist/subscribers/index.cjs +2 -2
  90. package/dist/subscribers/index.d.cts +2 -2
  91. package/dist/subscribers/index.d.mts +2 -2
  92. package/dist/subscribers/index.mjs +2 -2
  93. package/package.json +5 -5
  94. package/src/endpoints/TestEndpointAdaptor.ts +75 -14
  95. package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +309 -42
  96. package/dist/TestEndpointAdaptor-BG6fzAOx.mjs.map +0 -1
  97. package/dist/TestEndpointAdaptor-BaQaTy_1.cjs.map +0 -1
  98. package/dist/index-BXTN4mwI.d.mts +0 -9
  99. package/dist/index-BxApEwAF.d.cts +0 -9
@@ -393,28 +393,19 @@ describe('TestEndpointAdaptor', () => {
393
393
  });
394
394
 
395
395
  const adapter = new TestEndpointAdaptor(endpoint);
396
- const result = await adapter.request({
396
+ const result = await adapter.fullRequest({
397
397
  body: { email: 'test@example.com', password: 'pass123' },
398
398
  services: mockServices,
399
399
  headers: { host: 'example.com' },
400
400
  });
401
401
 
402
- expect(result).toHaveProperty('data');
403
- expect(result).toHaveProperty('metadata');
404
- expect((result as any).data).toEqual({
402
+ expect(result.body).toEqual({
405
403
  id: 'user-1',
406
404
  email: 'test@example.com',
407
405
  });
408
- expect((result as any).metadata.cookies?.has('session')).toBe(true);
409
- expect((result as any).metadata.cookies?.get('session')).toEqual({
410
- value: 'abc123',
411
- options: {
412
- httpOnly: true,
413
- secure: true,
414
- sameSite: 'strict',
415
- maxAge: 3600,
416
- },
417
- });
406
+ expect(result.headers['set-cookie']).toEqual([
407
+ 'session=abc123; Max-Age=3600; HttpOnly; Secure; SameSite=strict',
408
+ ]);
418
409
  });
419
410
 
420
411
  it('should set custom response headers', async () => {
@@ -431,17 +422,17 @@ describe('TestEndpointAdaptor', () => {
431
422
  });
432
423
 
433
424
  const adapter = new TestEndpointAdaptor(endpoint);
434
- const result = await adapter.request({
425
+ const result = await adapter.fullRequest({
435
426
  body: { name: 'John Doe' },
436
427
  services: mockServices,
437
428
  headers: { host: 'example.com' },
438
429
  });
439
430
 
440
- expect((result as any).data).toEqual({
431
+ expect(result.body).toEqual({
441
432
  id: 'user-123',
442
433
  name: 'John Doe',
443
434
  });
444
- expect((result as any).metadata.headers).toEqual({
435
+ expect(result.headers).toEqual({
445
436
  Location: '/users/user-123',
446
437
  'X-User-Id': 'user-123',
447
438
  });
@@ -457,13 +448,13 @@ describe('TestEndpointAdaptor', () => {
457
448
  });
458
449
 
459
450
  const adapter = new TestEndpointAdaptor(endpoint);
460
- const result = await adapter.request({
451
+ const result = await adapter.fullRequest({
461
452
  body: { name: 'Resource' },
462
453
  services: mockServices,
463
454
  headers: { host: 'example.com' },
464
455
  });
465
456
 
466
- expect((result as any).metadata.status).toBe(201);
457
+ expect(result.status).toBe(201);
467
458
  });
468
459
 
469
460
  it('should delete cookies', async () => {
@@ -477,16 +468,17 @@ describe('TestEndpointAdaptor', () => {
477
468
  });
478
469
 
479
470
  const adapter = new TestEndpointAdaptor(endpoint);
480
- const result = await adapter.request({
471
+ const result = await adapter.fullRequest({
481
472
  services: mockServices,
482
473
  headers: { host: 'example.com' },
483
474
  });
484
475
 
485
- expect((result as any).data.success).toBe(true);
486
- const sessionCookie = (result as any).metadata.cookies?.get('session');
487
- expect(sessionCookie?.value).toBe('');
488
- expect(sessionCookie?.options?.maxAge).toBe(0);
489
- expect(sessionCookie?.options?.path).toBe('/');
476
+ expect(result.body.success).toBe(true);
477
+ const setCookieHeader = result.headers['set-cookie'] as string[];
478
+ expect(setCookieHeader).toHaveLength(1);
479
+ expect(setCookieHeader[0]).toContain('session=');
480
+ expect(setCookieHeader[0]).toContain('Max-Age=0');
481
+ expect(setCookieHeader[0]).toContain('Path=/');
490
482
  });
491
483
 
492
484
  it('should combine cookies, headers, and status', async () => {
@@ -505,28 +497,21 @@ describe('TestEndpointAdaptor', () => {
505
497
  });
506
498
 
507
499
  const adapter = new TestEndpointAdaptor(endpoint);
508
- const result = await adapter.request({
500
+ const result = await adapter.fullRequest({
509
501
  body: { data: 'test' },
510
502
  services: mockServices,
511
503
  headers: { host: 'example.com' },
512
504
  });
513
505
 
514
- expect((result as any).data).toEqual({
506
+ expect(result.body).toEqual({
515
507
  id: '123',
516
508
  result: 'test',
517
509
  });
518
- expect((result as any).metadata.status).toBe(201);
519
- expect((result as any).metadata.headers).toEqual({
510
+ expect(result.status).toBe(201);
511
+ expect(result.headers).toEqual({
520
512
  Location: '/complete/123',
521
513
  'X-Request-Id': 'req-456',
522
- });
523
- expect((result as any).metadata.cookies?.size).toBe(2);
524
- expect((result as any).metadata.cookies?.get('tracking')?.value).toBe(
525
- 'track-789',
526
- );
527
- expect((result as any).metadata.cookies?.get('preference')).toEqual({
528
- value: 'dark',
529
- options: { maxAge: 86400 },
514
+ 'set-cookie': ['tracking=track-789', 'preference=dark; Max-Age=86400'],
530
515
  });
531
516
  });
532
517
 
@@ -564,7 +549,7 @@ describe('TestEndpointAdaptor', () => {
564
549
  });
565
550
 
566
551
  const adapter = new TestEndpointAdaptor(endpoint);
567
- const result = await adapter.request({
552
+ const result = await adapter.fullRequest({
568
553
  services: mockServices,
569
554
  headers: {
570
555
  host: 'example.com',
@@ -572,13 +557,295 @@ describe('TestEndpointAdaptor', () => {
572
557
  },
573
558
  });
574
559
 
575
- expect((result as any).data).toEqual({
560
+ expect(result.body).toEqual({
576
561
  theme: 'dark',
577
562
  updated: true,
578
563
  });
579
- expect((result as any).metadata.cookies?.get('theme')?.value).toBe(
580
- 'dark',
581
- );
564
+ expect(result.headers['set-cookie']).toEqual([
565
+ 'theme=dark; Max-Age=86400',
566
+ ]);
567
+ });
568
+ });
569
+
570
+ describe('fullRequest', () => {
571
+ it('should return full HTTP response with body, status, and headers', async () => {
572
+ const endpoint = e
573
+ .get('/test')
574
+ .output(z.object({ message: z.string() }))
575
+ .handle(() => ({ message: 'Hello World' }));
576
+
577
+ const adapter = new TestEndpointAdaptor(endpoint);
578
+
579
+ const result = await adapter.fullRequest({
580
+ services: mockServices,
581
+ headers: { host: 'example.com' },
582
+ });
583
+
584
+ expect(result).toEqual({
585
+ body: { message: 'Hello World' },
586
+ status: 200,
587
+ headers: {},
588
+ });
589
+ });
590
+
591
+ it('should return custom status code in HTTP response', async () => {
592
+ const endpoint = e
593
+ .post('/resources')
594
+ .body(z.object({ name: z.string() }))
595
+ .output(z.object({ id: z.string() }))
596
+ .handle(async (ctx, response) => {
597
+ return response.status(SuccessStatus.Created).send({ id: '123' });
598
+ });
599
+
600
+ const adapter = new TestEndpointAdaptor(endpoint);
601
+ const result = await adapter.fullRequest({
602
+ body: { name: 'Resource' },
603
+ services: mockServices,
604
+ headers: { host: 'example.com' },
605
+ });
606
+
607
+ expect(result.status).toBe(201);
608
+ expect(result.body).toEqual({ id: '123' });
609
+ });
610
+
611
+ it('should include custom headers in HTTP response', async () => {
612
+ const endpoint = e
613
+ .post('/users')
614
+ .body(z.object({ name: z.string() }))
615
+ .output(z.object({ id: z.string(), name: z.string() }))
616
+ .handle(async ({ body }, response) => {
617
+ const user = { id: 'user-123', name: body.name };
618
+ return response
619
+ .header('Location', `/users/${user.id}`)
620
+ .header('X-User-Id', user.id)
621
+ .send(user);
622
+ });
623
+
624
+ const adapter = new TestEndpointAdaptor(endpoint);
625
+ const result = await adapter.fullRequest({
626
+ body: { name: 'John Doe' },
627
+ services: mockServices,
628
+ headers: { host: 'example.com' },
629
+ });
630
+
631
+ expect(result.body).toEqual({
632
+ id: 'user-123',
633
+ name: 'John Doe',
634
+ });
635
+ expect(result.headers).toEqual({
636
+ Location: '/users/user-123',
637
+ 'X-User-Id': 'user-123',
638
+ });
639
+ });
640
+
641
+ it('should convert cookies to Set-Cookie headers', async () => {
642
+ const endpoint = e
643
+ .post('/auth/login')
644
+ .body(z.object({ email: z.string(), password: z.string() }))
645
+ .output(z.object({ id: z.string(), email: z.string() }))
646
+ .handle(async ({ body }, response) => {
647
+ return response
648
+ .cookie('session', 'abc123', {
649
+ httpOnly: true,
650
+ secure: true,
651
+ sameSite: 'strict',
652
+ maxAge: 3600,
653
+ })
654
+ .send({ id: 'user-1', email: body.email });
655
+ });
656
+
657
+ const adapter = new TestEndpointAdaptor(endpoint);
658
+ const result = await adapter.fullRequest({
659
+ body: { email: 'test@example.com', password: 'pass123' },
660
+ services: mockServices,
661
+ headers: { host: 'example.com' },
662
+ });
663
+
664
+ expect(result.body).toEqual({
665
+ id: 'user-1',
666
+ email: 'test@example.com',
667
+ });
668
+ expect(result.headers['set-cookie']).toEqual([
669
+ 'session=abc123; Max-Age=3600; HttpOnly; Secure; SameSite=strict',
670
+ ]);
671
+ });
672
+
673
+ it('should handle multiple cookies as array of Set-Cookie headers', async () => {
674
+ const endpoint = e
675
+ .post('/complete')
676
+ .body(z.object({ data: z.string() }))
677
+ .output(z.object({ id: z.string(), result: z.string() }))
678
+ .handle(async ({ body }, response) => {
679
+ return response
680
+ .cookie('tracking', 'track-789')
681
+ .cookie('preference', 'dark', { maxAge: 86400, path: '/' })
682
+ .send({ id: '123', result: body.data });
683
+ });
684
+
685
+ const adapter = new TestEndpointAdaptor(endpoint);
686
+ const result = await adapter.fullRequest({
687
+ body: { data: 'test' },
688
+ services: mockServices,
689
+ headers: { host: 'example.com' },
690
+ });
691
+
692
+ expect(result.headers['set-cookie']).toEqual([
693
+ 'tracking=track-789',
694
+ 'preference=dark; Max-Age=86400; Path=/',
695
+ ]);
696
+ });
697
+
698
+ it('should serialize all cookie options correctly', async () => {
699
+ const expires = new Date('2025-12-31T23:59:59Z');
700
+ const endpoint = e
701
+ .get('/cookies-full')
702
+ .output(z.object({ success: z.boolean() }))
703
+ .handle(async (ctx, response) => {
704
+ return response
705
+ .cookie('full-cookie', 'value123', {
706
+ domain: 'example.com',
707
+ path: '/api',
708
+ expires: expires,
709
+ maxAge: 7200,
710
+ httpOnly: true,
711
+ secure: true,
712
+ sameSite: 'lax',
713
+ })
714
+ .send({ success: true });
715
+ });
716
+
717
+ const adapter = new TestEndpointAdaptor(endpoint);
718
+ const result = await adapter.fullRequest({
719
+ services: mockServices,
720
+ headers: { host: 'example.com' },
721
+ });
722
+
723
+ expect(result.headers['set-cookie']).toEqual([
724
+ `full-cookie=value123; Max-Age=7200; Expires=${expires.toUTCString()}; Domain=example.com; Path=/api; HttpOnly; Secure; SameSite=lax`,
725
+ ]);
726
+ });
727
+
728
+ it('should handle cookie deletion in Set-Cookie header', async () => {
729
+ const endpoint = e
730
+ .post('/auth/logout')
731
+ .output(z.object({ success: z.boolean() }))
732
+ .handle(async (ctx, response) => {
733
+ return response
734
+ .deleteCookie('session', { path: '/' })
735
+ .send({ success: true });
736
+ });
737
+
738
+ const adapter = new TestEndpointAdaptor(endpoint);
739
+ const result = await adapter.fullRequest({
740
+ services: mockServices,
741
+ headers: { host: 'example.com' },
742
+ });
743
+
744
+ expect(result.body.success).toBe(true);
745
+ const setCookieHeader = result.headers['set-cookie'] as string[];
746
+ expect(setCookieHeader).toHaveLength(1);
747
+ expect(setCookieHeader[0]).toContain('session=');
748
+ expect(setCookieHeader[0]).toContain('Max-Age=0');
749
+ expect(setCookieHeader[0]).toContain('Path=/');
750
+ expect(setCookieHeader[0]).toContain('Expires=');
751
+ });
752
+
753
+ it('should combine headers and cookies in HTTP response', async () => {
754
+ const endpoint = e
755
+ .post('/complete')
756
+ .body(z.object({ data: z.string() }))
757
+ .output(z.object({ id: z.string(), result: z.string() }))
758
+ .handle(async ({ body }, response) => {
759
+ return response
760
+ .status(SuccessStatus.Created)
761
+ .header('Location', '/complete/123')
762
+ .header('X-Request-Id', 'req-456')
763
+ .cookie('tracking', 'track-789')
764
+ .cookie('preference', 'dark', { maxAge: 86400 })
765
+ .send({ id: '123', result: body.data });
766
+ });
767
+
768
+ const adapter = new TestEndpointAdaptor(endpoint);
769
+ const result = await adapter.fullRequest({
770
+ body: { data: 'test' },
771
+ services: mockServices,
772
+ headers: { host: 'example.com' },
773
+ });
774
+
775
+ expect(result).toEqual({
776
+ body: { id: '123', result: 'test' },
777
+ status: 201,
778
+ headers: {
779
+ Location: '/complete/123',
780
+ 'X-Request-Id': 'req-456',
781
+ 'set-cookie': [
782
+ 'tracking=track-789',
783
+ 'preference=dark; Max-Age=86400',
784
+ ],
785
+ },
786
+ });
787
+ });
788
+
789
+ it('should handle empty response metadata', async () => {
790
+ const endpoint = e
791
+ .get('/simple')
792
+ .output(z.object({ message: z.string() }))
793
+ .handle(async () => ({ message: 'Hello' }));
794
+
795
+ const adapter = new TestEndpointAdaptor(endpoint);
796
+ const result = await adapter.fullRequest({
797
+ services: mockServices,
798
+ headers: { host: 'example.com' },
799
+ });
800
+
801
+ expect(result).toEqual({
802
+ body: { message: 'Hello' },
803
+ status: 200,
804
+ headers: {},
805
+ });
806
+ });
807
+ });
808
+
809
+ describe('request method delegation', () => {
810
+ it('should return only body from fullRequest', async () => {
811
+ const endpoint = e
812
+ .post('/users')
813
+ .body(z.object({ name: z.string() }))
814
+ .output(z.object({ id: z.string(), name: z.string() }))
815
+ .handle(async ({ body }, response) => {
816
+ return response
817
+ .status(SuccessStatus.Created)
818
+ .header('Location', '/users/123')
819
+ .cookie('session', 'abc')
820
+ .send({ id: '123', name: body.name });
821
+ });
822
+
823
+ const adapter = new TestEndpointAdaptor(endpoint);
824
+
825
+ // Call request (should only return body)
826
+ const simpleResult = await adapter.request({
827
+ body: { name: 'John' },
828
+ services: mockServices,
829
+ headers: { host: 'example.com' },
830
+ });
831
+
832
+ // Call fullRequest (should return full HTTP response)
833
+ const fullResult = await adapter.fullRequest({
834
+ body: { name: 'John' },
835
+ services: mockServices,
836
+ headers: { host: 'example.com' },
837
+ });
838
+
839
+ // request should only return the body
840
+ expect(simpleResult).toEqual({ id: '123', name: 'John' });
841
+ expect(simpleResult).not.toHaveProperty('status');
842
+ expect(simpleResult).not.toHaveProperty('headers');
843
+
844
+ // fullRequest should return complete HTTP response
845
+ expect(fullResult.body).toEqual({ id: '123', name: 'John' });
846
+ expect(fullResult.status).toBe(201);
847
+ expect(fullResult.headers).toHaveProperty('Location');
848
+ expect(fullResult.headers).toHaveProperty('set-cookie');
582
849
  });
583
850
  });
584
851
  });
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestEndpointAdaptor-BG6fzAOx.mjs","names":["endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >","serviceDiscovery: ServiceDiscovery<\n any,\n any\n >","ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >"],"sources":["../src/endpoints/TestEndpointAdaptor.ts"],"sourcesContent":["import { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod } from '../types';\nimport {\n Endpoint,\n type EndpointSchemas,\n ResponseBuilder,\n type ResponseWithMetadata,\n} from './Endpoint';\n\nexport class TestEndpointAdaptor<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n static getDefaultServiceDiscover<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n >(\n endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {\n return ServiceDiscovery.getInstance(\n endpoint.logger,\n new EnvironmentParser({}),\n );\n }\n constructor(\n private readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n private serviceDiscovery: ServiceDiscovery<\n any,\n any\n > = TestEndpointAdaptor.getDefaultServiceDiscover(endpoint),\n ) {}\n\n async request(\n ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ): Promise<\n | InferStandardSchema<TOutSchema>\n | ResponseWithMetadata<InferStandardSchema<TOutSchema>>\n > {\n const body = await this.endpoint.parseInput((ctx as any).body, 'body');\n const query = await this.endpoint.parseInput((ctx as any).query, 'query');\n const params = await this.endpoint.parseInput(\n (ctx as any).params,\n 'params',\n );\n\n const header = Endpoint.createHeaders(ctx.headers);\n const cookie = Endpoint.createCookies(ctx.headers.cookie);\n const logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: ctx.headers.host,\n method: this.endpoint.method,\n }) as TLogger;\n const session = await this.endpoint.getSession({\n logger,\n services: ctx.services,\n header,\n cookie,\n });\n\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n body,\n query,\n params,\n session,\n services: ctx.services,\n logger,\n header,\n cookie,\n } as any,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = await this.endpoint.parseOutput(data);\n ctx.publisher && (await this.serviceDiscovery.register([ctx.publisher]));\n\n await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);\n\n // Return with metadata if any was set\n if (\n (metadata.headers && Object.keys(metadata.headers).length > 0) ||\n (metadata.cookies && metadata.cookies.size > 0) ||\n metadata.status\n ) {\n return { data: output, metadata };\n }\n\n return output;\n }\n}\n\nexport type TestRequestAdaptor<\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> = {\n services: ServiceRecord<TServices>;\n headers: Record<string, string>;\n publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n} & InferComposableStandardSchema<TInput>;\n"],"mappings":";;;;;;AAsBA,IAAa,sBAAb,MAAa,oBAUX;CACA,OAAO,0BAWLA,UAWA;AACA,SAAO,iBAAiB,YACtB,SAAS,QACT,IAAI,kBAAkB,CAAE,GACzB;CACF;CACD,YACmBA,UAWTC,mBAGJ,oBAAoB,0BAA0B,SAAS,EAC3D;EAfiB;EAWT;CAIN;CAEJ,MAAM,QACJC,KASA;EACA,MAAM,OAAO,MAAM,KAAK,SAAS,WAAY,IAAY,MAAM,OAAO;EACtE,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAY,IAAY,OAAO,QAAQ;EACzE,MAAM,SAAS,MAAM,KAAK,SAAS,WAChC,IAAY,QACb,SACD;EAED,MAAM,SAAS,SAAS,cAAc,IAAI,QAAQ;EAClD,MAAM,SAAS,SAAS,cAAc,IAAI,QAAQ,OAAO;EACzD,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM;GACxC,OAAO,KAAK,SAAS;GACrB,MAAM,IAAI,QAAQ;GAClB,QAAQ,KAAK,SAAS;EACvB,EAAC;EACF,MAAM,UAAU,MAAM,KAAK,SAAS,WAAW;GAC7C;GACA,UAAU,IAAI;GACd;GACA;EACD,EAAC;EAEF,MAAM,kBAAkB,IAAI;EAC5B,MAAM,WAAW,MAAM,KAAK,SAAS,QACnC;GACE;GACA;GACA;GACA;GACA,UAAU,IAAI;GACd;GACA;GACA;EACD,GACD,gBACD;EAGD,IAAI,OAAO;EACX,IAAI,WAAW,gBAAgB,aAAa;AAE5C,MAAI,SAAS,YAAY,SAAS,EAAE;AAClC,UAAO,SAAS;AAChB,cAAW,SAAS;EACrB;EAED,MAAM,SAAS,MAAM,KAAK,SAAS,YAAY,KAAK;AACpD,MAAI,aAAc,MAAM,KAAK,iBAAiB,SAAS,CAAC,IAAI,SAAU,EAAC;AAEvE,QAAM,uBAAuB,KAAK,UAAU,QAAQ,KAAK,iBAAiB;AAG1E,MACG,SAAS,WAAW,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,KAC3D,SAAS,WAAW,SAAS,QAAQ,OAAO,KAC7C,SAAS,OAET,QAAO;GAAE,MAAM;GAAQ;EAAU;AAGnC,SAAO;CACR;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestEndpointAdaptor-BaQaTy_1.cjs","names":["endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >","EnvironmentParser","serviceDiscovery: ServiceDiscovery<\n any,\n any\n >","ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >","ResponseBuilder"],"sources":["../src/endpoints/TestEndpointAdaptor.ts"],"sourcesContent":["import { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod } from '../types';\nimport {\n Endpoint,\n type EndpointSchemas,\n ResponseBuilder,\n type ResponseWithMetadata,\n} from './Endpoint';\n\nexport class TestEndpointAdaptor<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n static getDefaultServiceDiscover<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n >(\n endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {\n return ServiceDiscovery.getInstance(\n endpoint.logger,\n new EnvironmentParser({}),\n );\n }\n constructor(\n private readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n private serviceDiscovery: ServiceDiscovery<\n any,\n any\n > = TestEndpointAdaptor.getDefaultServiceDiscover(endpoint),\n ) {}\n\n async request(\n ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ): Promise<\n | InferStandardSchema<TOutSchema>\n | ResponseWithMetadata<InferStandardSchema<TOutSchema>>\n > {\n const body = await this.endpoint.parseInput((ctx as any).body, 'body');\n const query = await this.endpoint.parseInput((ctx as any).query, 'query');\n const params = await this.endpoint.parseInput(\n (ctx as any).params,\n 'params',\n );\n\n const header = Endpoint.createHeaders(ctx.headers);\n const cookie = Endpoint.createCookies(ctx.headers.cookie);\n const logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: ctx.headers.host,\n method: this.endpoint.method,\n }) as TLogger;\n const session = await this.endpoint.getSession({\n logger,\n services: ctx.services,\n header,\n cookie,\n });\n\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n body,\n query,\n params,\n session,\n services: ctx.services,\n logger,\n header,\n cookie,\n } as any,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = await this.endpoint.parseOutput(data);\n ctx.publisher && (await this.serviceDiscovery.register([ctx.publisher]));\n\n await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);\n\n // Return with metadata if any was set\n if (\n (metadata.headers && Object.keys(metadata.headers).length > 0) ||\n (metadata.cookies && metadata.cookies.size > 0) ||\n metadata.status\n ) {\n return { data: output, metadata };\n }\n\n return output;\n }\n}\n\nexport type TestRequestAdaptor<\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> = {\n services: ServiceRecord<TServices>;\n headers: Record<string, string>;\n publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n} & InferComposableStandardSchema<TInput>;\n"],"mappings":";;;;;;;AAsBA,IAAa,sBAAb,MAAa,oBAUX;CACA,OAAO,0BAWLA,UAWA;AACA,SAAO,sCAAiB,YACtB,SAAS,QACT,IAAIC,qCAAkB,CAAE,GACzB;CACF;CACD,YACmBD,UAWTE,mBAGJ,oBAAoB,0BAA0B,SAAS,EAC3D;EAfiB;EAWT;CAIN;CAEJ,MAAM,QACJC,KASA;EACA,MAAM,OAAO,MAAM,KAAK,SAAS,WAAY,IAAY,MAAM,OAAO;EACtE,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAY,IAAY,OAAO,QAAQ;EACzE,MAAM,SAAS,MAAM,KAAK,SAAS,WAChC,IAAY,QACb,SACD;EAED,MAAM,SAAS,0BAAS,cAAc,IAAI,QAAQ;EAClD,MAAM,SAAS,0BAAS,cAAc,IAAI,QAAQ,OAAO;EACzD,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM;GACxC,OAAO,KAAK,SAAS;GACrB,MAAM,IAAI,QAAQ;GAClB,QAAQ,KAAK,SAAS;EACvB,EAAC;EACF,MAAM,UAAU,MAAM,KAAK,SAAS,WAAW;GAC7C;GACA,UAAU,IAAI;GACd;GACA;EACD,EAAC;EAEF,MAAM,kBAAkB,IAAIC;EAC5B,MAAM,WAAW,MAAM,KAAK,SAAS,QACnC;GACE;GACA;GACA;GACA;GACA,UAAU,IAAI;GACd;GACA;GACA;EACD,GACD,gBACD;EAGD,IAAI,OAAO;EACX,IAAI,WAAW,gBAAgB,aAAa;AAE5C,MAAI,0BAAS,YAAY,SAAS,EAAE;AAClC,UAAO,SAAS;AAChB,cAAW,SAAS;EACrB;EAED,MAAM,SAAS,MAAM,KAAK,SAAS,YAAY,KAAK;AACpD,MAAI,aAAc,MAAM,KAAK,iBAAiB,SAAS,CAAC,IAAI,SAAU,EAAC;AAEvE,QAAM,yCAAuB,KAAK,UAAU,QAAQ,KAAK,iBAAiB;AAG1E,MACG,SAAS,WAAW,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,KAC3D,SAAS,WAAW,SAAS,QAAQ,OAAO,KAC7C,SAAS,OAET,QAAO;GAAE,MAAM;GAAQ;EAAU;AAGnC,SAAO;CACR;AACF"}
@@ -1,9 +0,0 @@
1
- import { FunctionBuilder } from "./FunctionBuilder-DBwR7jg7.mjs";
2
- import * as _geekmidas_logger4 from "@geekmidas/logger";
3
- import * as _geekmidas_schema3 from "@geekmidas/schema";
4
-
5
- //#region src/functions/index.d.ts
6
- declare const f: FunctionBuilder<_geekmidas_schema3.ComposableStandardSchema, undefined, [], _geekmidas_logger4.Logger, undefined, string>;
7
- //#endregion
8
- export { f };
9
- //# sourceMappingURL=index-BXTN4mwI.d.mts.map
@@ -1,9 +0,0 @@
1
- import { FunctionBuilder } from "./FunctionBuilder-BS1KgxA_.cjs";
2
- import * as _geekmidas_logger4 from "@geekmidas/logger";
3
- import * as _geekmidas_schema3 from "@geekmidas/schema";
4
-
5
- //#region src/functions/index.d.ts
6
- declare const f: FunctionBuilder<_geekmidas_schema3.ComposableStandardSchema, undefined, [], _geekmidas_logger4.Logger, undefined, string>;
7
- //#endregion
8
- export { f };
9
- //# sourceMappingURL=index-BxApEwAF.d.cts.map