@geekmidas/constructs 0.0.5 → 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.
- package/dist/{AWSLambdaFunction-nic3vzt3.mjs → AWSLambdaFunction-DWIZYsCy.mjs} +2 -2
- package/dist/{AWSLambdaFunction-nic3vzt3.mjs.map → AWSLambdaFunction-DWIZYsCy.mjs.map} +1 -1
- package/dist/{AWSLambdaFunction-DW9qrBNR.cjs → AWSLambdaFunction-qA5LqPsv.cjs} +2 -2
- package/dist/{AWSLambdaFunction-DW9qrBNR.cjs.map → AWSLambdaFunction-qA5LqPsv.cjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-ZuQAhW9_.cjs → AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-ZuQAhW9_.cjs.map → AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-BhqrpTVc.mjs → AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-BhqrpTVc.mjs.map → AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-BEzWkW5m.cjs → AmazonApiGatewayEndpointAdaptor-B8mozTcG.cjs} +3 -3
- package/dist/{AmazonApiGatewayEndpointAdaptor-BEzWkW5m.cjs.map → AmazonApiGatewayEndpointAdaptor-B8mozTcG.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-CASfHEj9.mjs → AmazonApiGatewayEndpointAdaptor-Bmz6Cy1e.mjs} +3 -3
- package/dist/{AmazonApiGatewayEndpointAdaptor-CASfHEj9.mjs.map → AmazonApiGatewayEndpointAdaptor-Bmz6Cy1e.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-RPnkGENb.mjs → AmazonApiGatewayV1EndpointAdaptor-24g3dLn5.mjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-RPnkGENb.mjs.map → AmazonApiGatewayV1EndpointAdaptor-24g3dLn5.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-l1df4rFt.cjs → AmazonApiGatewayV1EndpointAdaptor-D4eZ-fx5.cjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-l1df4rFt.cjs.map → AmazonApiGatewayV1EndpointAdaptor-D4eZ-fx5.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-C5Ctz7C_.mjs → AmazonApiGatewayV2EndpointAdaptor-Cc40RThv.mjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-C5Ctz7C_.mjs.map → AmazonApiGatewayV2EndpointAdaptor-Cc40RThv.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DH9yJsC8.cjs → AmazonApiGatewayV2EndpointAdaptor-J6tACl-N.cjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DH9yJsC8.cjs.map → AmazonApiGatewayV2EndpointAdaptor-J6tACl-N.cjs.map} +1 -1
- package/dist/{Cron-JYYGj5ik.cjs → Cron-CmZ6esMM.cjs} +1 -1
- package/dist/{Cron-JYYGj5ik.cjs.map → Cron-CmZ6esMM.cjs.map} +1 -1
- package/dist/{Cron-BgJo6EW6.mjs → Cron-D6hnZLk7.mjs} +1 -1
- package/dist/{Cron-BgJo6EW6.mjs.map → Cron-D6hnZLk7.mjs.map} +1 -1
- package/dist/{CronBuilder-DVuhB_kA.mjs → CronBuilder-Dfv5JguE.mjs} +2 -2
- package/dist/{CronBuilder-DVuhB_kA.mjs.map → CronBuilder-Dfv5JguE.mjs.map} +1 -1
- package/dist/{CronBuilder-BDDS21OP.cjs → CronBuilder-Di7QK8Rt.cjs} +2 -2
- package/dist/{CronBuilder-BDDS21OP.cjs.map → CronBuilder-Di7QK8Rt.cjs.map} +1 -1
- package/dist/{Endpoint-BVZJb4OR.cjs → Endpoint-COGAflGh.cjs} +1 -1
- package/dist/{Endpoint-BVZJb4OR.cjs.map → Endpoint-COGAflGh.cjs.map} +1 -1
- package/dist/{Endpoint-DVEmKo6G.mjs → Endpoint-DLLZvqoh.mjs} +1 -1
- package/dist/{Endpoint-DVEmKo6G.mjs.map → Endpoint-DLLZvqoh.mjs.map} +1 -1
- package/dist/{EndpointBuilder-DDnqW7rT.cjs → EndpointBuilder-FJktpPOu.cjs} +2 -2
- package/dist/{EndpointBuilder-DDnqW7rT.cjs.map → EndpointBuilder-FJktpPOu.cjs.map} +1 -1
- package/dist/{EndpointBuilder-Bhy91l_c.mjs → EndpointBuilder-oXO_ka1-.mjs} +2 -2
- package/dist/{EndpointBuilder-Bhy91l_c.mjs.map → EndpointBuilder-oXO_ka1-.mjs.map} +1 -1
- package/dist/{EndpointFactory-Cw_6-53M.cjs → EndpointFactory-Kk1tpifs.cjs} +2 -2
- package/dist/{EndpointFactory-Cw_6-53M.cjs.map → EndpointFactory-Kk1tpifs.cjs.map} +1 -1
- package/dist/{EndpointFactory-CNz3Wa08.mjs → EndpointFactory-eG8bDhOh.mjs} +2 -2
- package/dist/{EndpointFactory-CNz3Wa08.mjs.map → EndpointFactory-eG8bDhOh.mjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-UzfHDM2R.cjs → FunctionExecutionWrapper-CElXEjPe.cjs} +1 -1
- package/dist/{FunctionExecutionWrapper-UzfHDM2R.cjs.map → FunctionExecutionWrapper-CElXEjPe.cjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-CPzSbfaI.mjs → FunctionExecutionWrapper-XGrSAAPD.mjs} +1 -1
- package/dist/{FunctionExecutionWrapper-CPzSbfaI.mjs.map → FunctionExecutionWrapper-XGrSAAPD.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-Y4AD3E9g.mjs → HonoEndpointAdaptor-BlT1rWHV.mjs} +4 -4
- package/dist/{HonoEndpointAdaptor-Y4AD3E9g.mjs.map → HonoEndpointAdaptor-BlT1rWHV.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-OtKS5Dsd.d.cts → HonoEndpointAdaptor-BrbM9vxd.d.cts} +3 -3
- package/dist/{HonoEndpointAdaptor-BY2Ovj31.d.mts → HonoEndpointAdaptor-CxcYKdzT.d.mts} +3 -3
- package/dist/{HonoEndpointAdaptor-BsGMcxYb.cjs → HonoEndpointAdaptor-Ds433Q8w.cjs} +4 -4
- package/dist/{HonoEndpointAdaptor-BsGMcxYb.cjs.map → HonoEndpointAdaptor-Ds433Q8w.cjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-DD3aygPp.mjs → TestEndpointAdaptor-Ct4I-gDo.mjs} +33 -7
- package/dist/TestEndpointAdaptor-Ct4I-gDo.mjs.map +1 -0
- package/dist/{TestEndpointAdaptor-CbNeUT3Y.cjs → TestEndpointAdaptor-FJUob2W_.cjs} +33 -7
- package/dist/TestEndpointAdaptor-FJUob2W_.cjs.map +1 -0
- package/dist/{TestEndpointAdaptor-Db0cm1fb.d.mts → TestEndpointAdaptor-vboVyJ0w.d.mts} +10 -4
- package/dist/{TestEndpointAdaptor-v7A-7hTs.d.cts → TestEndpointAdaptor-wwEaVHAt.d.cts} +10 -4
- package/dist/adaptors/aws.cjs +8 -8
- package/dist/adaptors/aws.d.cts +1 -1
- package/dist/adaptors/aws.d.mts +1 -1
- package/dist/adaptors/aws.mjs +8 -8
- package/dist/adaptors/hono.cjs +4 -4
- package/dist/adaptors/hono.d.cts +2 -2
- package/dist/adaptors/hono.d.mts +2 -2
- package/dist/adaptors/hono.mjs +4 -4
- package/dist/adaptors/testing.cjs +2 -2
- package/dist/adaptors/testing.d.cts +2 -2
- package/dist/adaptors/testing.d.mts +2 -2
- package/dist/adaptors/testing.mjs +2 -2
- package/dist/crons/Cron.cjs +1 -1
- package/dist/crons/Cron.d.cts +1 -1
- package/dist/crons/Cron.d.mts +1 -1
- package/dist/crons/Cron.mjs +1 -1
- package/dist/crons/CronBuilder.cjs +2 -2
- package/dist/crons/CronBuilder.d.cts +1 -1
- package/dist/crons/CronBuilder.d.mts +1 -1
- package/dist/crons/CronBuilder.mjs +2 -2
- package/dist/crons/index.cjs +2 -2
- package/dist/crons/index.d.cts +5 -5
- package/dist/crons/index.d.mts +5 -5
- package/dist/crons/index.mjs +2 -2
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +2 -2
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +2 -2
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +4 -4
- package/dist/endpoints/Endpoint.cjs +1 -1
- package/dist/endpoints/Endpoint.d.cts +1 -1
- package/dist/endpoints/Endpoint.d.mts +1 -1
- package/dist/endpoints/Endpoint.mjs +1 -1
- package/dist/endpoints/EndpointBuilder.cjs +2 -2
- package/dist/endpoints/EndpointBuilder.d.cts +1 -1
- package/dist/endpoints/EndpointBuilder.d.mts +1 -1
- package/dist/endpoints/EndpointBuilder.mjs +2 -2
- package/dist/endpoints/EndpointFactory.cjs +3 -3
- package/dist/endpoints/EndpointFactory.d.cts +1 -1
- package/dist/endpoints/EndpointFactory.d.mts +1 -1
- package/dist/endpoints/EndpointFactory.mjs +3 -3
- package/dist/endpoints/HonoEndpointAdaptor.cjs +4 -4
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.mjs +4 -4
- package/dist/endpoints/TestEndpointAdaptor.cjs +2 -2
- package/dist/endpoints/TestEndpointAdaptor.d.cts +3 -3
- package/dist/endpoints/TestEndpointAdaptor.d.mts +3 -3
- package/dist/endpoints/TestEndpointAdaptor.mjs +2 -2
- package/dist/endpoints/helpers.cjs +2 -2
- package/dist/endpoints/helpers.d.cts +1 -1
- package/dist/endpoints/helpers.d.mts +1 -1
- package/dist/endpoints/helpers.mjs +2 -2
- package/dist/endpoints/index.cjs +5 -3
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +6 -6
- package/dist/endpoints/index.d.mts +6 -6
- package/dist/endpoints/index.mjs +4 -4
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/endpoints/parseHonoQuery.cjs +1 -1
- package/dist/endpoints/parseHonoQuery.mjs +1 -1
- package/dist/endpoints/parseQueryParams.cjs +1 -1
- package/dist/endpoints/parseQueryParams.mjs +1 -1
- package/dist/functions/AWSLambdaFunction.cjs +2 -2
- package/dist/functions/AWSLambdaFunction.mjs +2 -2
- package/dist/functions/FunctionExecutionWrapper.cjs +1 -1
- package/dist/functions/FunctionExecutionWrapper.mjs +1 -1
- package/dist/functions/index.d.cts +1 -1
- package/dist/functions/index.d.mts +1 -1
- package/dist/{helpers-C9WBx7ms.mjs → helpers-CM0U-4Vk.mjs} +2 -2
- package/dist/{helpers-C9WBx7ms.mjs.map → helpers-CM0U-4Vk.mjs.map} +1 -1
- package/dist/{helpers-BSzj2AiQ.cjs → helpers-go4jiRvV.cjs} +2 -2
- package/dist/{helpers-BSzj2AiQ.cjs.map → helpers-go4jiRvV.cjs.map} +1 -1
- package/dist/index-BGr5gFrX.d.cts +9 -0
- package/dist/index-YM4W9XUq.d.mts +9 -0
- package/dist/{parseHonoQuery-BiPp8bEJ.cjs → parseHonoQuery-DopC24vB.cjs} +1 -1
- package/dist/{parseHonoQuery-BiPp8bEJ.cjs.map → parseHonoQuery-DopC24vB.cjs.map} +1 -1
- package/dist/{parseHonoQuery-yWRoKFFl.mjs → parseHonoQuery-znDKBhdE.mjs} +1 -1
- package/dist/{parseHonoQuery-yWRoKFFl.mjs.map → parseHonoQuery-znDKBhdE.mjs.map} +1 -1
- package/dist/{parseQueryParams-DSk9xl09.mjs → parseQueryParams-BJaRh3OB.mjs} +1 -1
- package/dist/{parseQueryParams-DSk9xl09.mjs.map → parseQueryParams-BJaRh3OB.mjs.map} +1 -1
- package/dist/{parseQueryParams-C2EjouGt.cjs → parseQueryParams-BzPop4I1.cjs} +1 -1
- package/dist/{parseQueryParams-C2EjouGt.cjs.map → parseQueryParams-BzPop4I1.cjs.map} +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
- package/dist/subscribers/index.d.cts +2 -2
- package/package.json +6 -7
- package/src/endpoints/TestEndpointAdaptor.ts +75 -14
- package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +309 -42
- package/src/endpoints/index.ts +9 -1
- package/dist/TestEndpointAdaptor-CbNeUT3Y.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-DD3aygPp.mjs.map +0 -1
- package/dist/index-BXTN4mwI.d.mts +0 -9
- 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.
|
|
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).
|
|
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(
|
|
409
|
-
|
|
410
|
-
|
|
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.
|
|
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(
|
|
431
|
+
expect(result.body).toEqual({
|
|
441
432
|
id: 'user-123',
|
|
442
433
|
name: 'John Doe',
|
|
443
434
|
});
|
|
444
|
-
expect(
|
|
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.
|
|
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(
|
|
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.
|
|
471
|
+
const result = await adapter.fullRequest({
|
|
481
472
|
services: mockServices,
|
|
482
473
|
headers: { host: 'example.com' },
|
|
483
474
|
});
|
|
484
475
|
|
|
485
|
-
expect(
|
|
486
|
-
const
|
|
487
|
-
expect(
|
|
488
|
-
expect(
|
|
489
|
-
expect(
|
|
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.
|
|
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(
|
|
506
|
+
expect(result.body).toEqual({
|
|
515
507
|
id: '123',
|
|
516
508
|
result: 'test',
|
|
517
509
|
});
|
|
518
|
-
expect(
|
|
519
|
-
expect(
|
|
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.
|
|
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(
|
|
560
|
+
expect(result.body).toEqual({
|
|
576
561
|
theme: 'dark',
|
|
577
562
|
updated: true,
|
|
578
563
|
});
|
|
579
|
-
expect(
|
|
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
|
});
|
package/src/endpoints/index.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { EndpointFactory } from './EndpointFactory';
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { EndpointFactory } from './EndpointFactory';
|
|
4
|
+
export {
|
|
5
|
+
Endpoint,
|
|
6
|
+
type EndpointOutput,
|
|
7
|
+
type EndpointSchemas,
|
|
8
|
+
type EndpointHandler,
|
|
9
|
+
type EndpointContext,
|
|
10
|
+
} from './Endpoint';
|
|
11
|
+
export { EndpointBuilder } from './EndpointBuilder';
|
|
4
12
|
|
|
5
13
|
export const e = new EndpointFactory();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TestEndpointAdaptor-CbNeUT3Y.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TestEndpointAdaptor-DD3aygPp.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,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
|