@geekmidas/constructs 0.0.18 → 0.0.20

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 (84) hide show
  1. package/dist/{EndpointBuilder-DlDft4mJ.mjs → EndpointBuilder-D47py-H1.mjs} +1 -1
  2. package/dist/{EndpointBuilder-DlDft4mJ.mjs.map → EndpointBuilder-D47py-H1.mjs.map} +1 -1
  3. package/dist/{EndpointBuilder-CFnjYXmL.cjs → EndpointBuilder-vxy3s960.cjs} +1 -1
  4. package/dist/{EndpointBuilder-CFnjYXmL.cjs.map → EndpointBuilder-vxy3s960.cjs.map} +1 -1
  5. package/dist/{EndpointFactory-mTfi8x1X.cjs → EndpointFactory-DSTXeokM.cjs} +2 -2
  6. package/dist/EndpointFactory-DSTXeokM.cjs.map +1 -0
  7. package/dist/{EndpointFactory-Ctln6czP.mjs → EndpointFactory-HOCnoBNT.mjs} +2 -2
  8. package/dist/EndpointFactory-HOCnoBNT.mjs.map +1 -0
  9. package/dist/{HonoEndpointAdaptor-DuyE06nH.mjs → HonoEndpointAdaptor-BI0tA0Fg.mjs} +2 -2
  10. package/dist/{HonoEndpointAdaptor-DuyE06nH.mjs.map → HonoEndpointAdaptor-BI0tA0Fg.mjs.map} +1 -1
  11. package/dist/{HonoEndpointAdaptor-DsqGuEIb.d.mts → HonoEndpointAdaptor-BTwjymKt.d.mts} +3 -3
  12. package/dist/{HonoEndpointAdaptor-DajXbh80.d.cts → HonoEndpointAdaptor-CDL4pkMO.d.cts} +3 -3
  13. package/dist/{HonoEndpointAdaptor-CfLRHHFw.cjs → HonoEndpointAdaptor-CdWWj3EJ.cjs} +2 -2
  14. package/dist/{HonoEndpointAdaptor-CfLRHHFw.cjs.map → HonoEndpointAdaptor-CdWWj3EJ.cjs.map} +1 -1
  15. package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-Bdh8rMSL.cjs} +1 -1
  16. package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-Bdh8rMSL.cjs.map} +1 -1
  17. package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-CJOWwaw1.mjs} +1 -1
  18. package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-CJOWwaw1.mjs.map} +1 -1
  19. package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-BWQmiYd8.mjs} +2 -2
  20. package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-BWQmiYd8.mjs.map} +1 -1
  21. package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-DieD_60p.cjs} +2 -2
  22. package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-DieD_60p.cjs.map} +1 -1
  23. package/dist/{TestEndpointAdaptor-DhRjJHyk.d.mts → TestEndpointAdaptor-Bl2ic-yr.d.mts} +9 -9
  24. package/dist/{TestEndpointAdaptor-B9tUIlCC.d.cts → TestEndpointAdaptor-ByXqQufk.d.cts} +9 -9
  25. package/dist/{TestEndpointAdaptor-B9hyZ-mF.cjs → TestEndpointAdaptor-C5qwQSnQ.cjs} +36 -16
  26. package/dist/TestEndpointAdaptor-C5qwQSnQ.cjs.map +1 -0
  27. package/dist/{TestEndpointAdaptor-DbwrL-RJ.mjs → TestEndpointAdaptor-DFDT9m8q.mjs} +37 -17
  28. package/dist/TestEndpointAdaptor-DFDT9m8q.mjs.map +1 -0
  29. package/dist/adaptors/aws.d.cts +1 -1
  30. package/dist/adaptors/hono.cjs +1 -1
  31. package/dist/adaptors/hono.d.cts +2 -2
  32. package/dist/adaptors/hono.d.mts +1 -1
  33. package/dist/adaptors/hono.mjs +1 -1
  34. package/dist/adaptors/testing.cjs +1 -1
  35. package/dist/adaptors/testing.d.cts +2 -2
  36. package/dist/adaptors/testing.d.mts +1 -1
  37. package/dist/adaptors/testing.mjs +1 -1
  38. package/dist/crons/Cron.d.cts +1 -1
  39. package/dist/crons/CronBuilder.d.cts +1 -1
  40. package/dist/crons/index.d.cts +5 -5
  41. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
  42. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
  43. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
  44. package/dist/endpoints/Endpoint.d.cts +1 -1
  45. package/dist/endpoints/EndpointBuilder.cjs +1 -1
  46. package/dist/endpoints/EndpointBuilder.d.cts +1 -1
  47. package/dist/endpoints/EndpointBuilder.mjs +1 -1
  48. package/dist/endpoints/EndpointFactory.cjs +2 -2
  49. package/dist/endpoints/EndpointFactory.d.cts +1 -1
  50. package/dist/endpoints/EndpointFactory.mjs +2 -2
  51. package/dist/endpoints/HonoEndpointAdaptor.cjs +1 -1
  52. package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
  53. package/dist/endpoints/HonoEndpointAdaptor.d.mts +1 -1
  54. package/dist/endpoints/HonoEndpointAdaptor.mjs +1 -1
  55. package/dist/endpoints/TestEndpointAdaptor.cjs +1 -1
  56. package/dist/endpoints/TestEndpointAdaptor.d.cts +2 -2
  57. package/dist/endpoints/TestEndpointAdaptor.d.mts +1 -1
  58. package/dist/endpoints/TestEndpointAdaptor.mjs +1 -1
  59. package/dist/endpoints/audit.d.cts +1 -1
  60. package/dist/endpoints/helpers.d.cts +1 -1
  61. package/dist/endpoints/index.cjs +2 -2
  62. package/dist/endpoints/index.d.cts +3 -3
  63. package/dist/endpoints/index.d.mts +2 -2
  64. package/dist/endpoints/index.mjs +2 -2
  65. package/dist/endpoints/processAudits.d.cts +1 -1
  66. package/dist/functions/index.d.cts +1 -1
  67. package/dist/index-CkBMFqhI.d.cts +10 -0
  68. package/dist/subscribers/Subscriber.cjs +1 -1
  69. package/dist/subscribers/Subscriber.mjs +1 -1
  70. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  71. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  72. package/dist/subscribers/index.cjs +2 -2
  73. package/dist/subscribers/index.d.mts +2 -2
  74. package/dist/subscribers/index.mjs +2 -2
  75. package/package.json +6 -6
  76. package/src/endpoints/HonoEndpointAdaptor.ts +2 -2
  77. package/src/endpoints/TestEndpointAdaptor.ts +51 -52
  78. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +3 -2
  79. package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +614 -0
  80. package/dist/EndpointFactory-Ctln6czP.mjs.map +0 -1
  81. package/dist/EndpointFactory-mTfi8x1X.cjs.map +0 -1
  82. package/dist/TestEndpointAdaptor-B9hyZ-mF.cjs.map +0 -1
  83. package/dist/TestEndpointAdaptor-DbwrL-RJ.mjs.map +0 -1
  84. package/dist/index-m7xBtcAW.d.cts +0 -10
@@ -1,4 +1,5 @@
1
- import type { AuditStorage, AuditableAction } from '@geekmidas/audit';
1
+ import type { AuditActor, AuditStorage, AuditableAction } from '@geekmidas/audit';
2
+ import { DefaultAuditor } from '@geekmidas/audit';
2
3
  import { EnvironmentParser } from '@geekmidas/envkit';
3
4
  import type { EventPublisher } from '@geekmidas/events';
4
5
  import type { Logger } from '@geekmidas/logger';
@@ -22,7 +23,7 @@ import {
22
23
  } from './Endpoint';
23
24
  import type { MappedAudit } from './audit';
24
25
  import {
25
- createAuditContext,
26
+ type AuditExecutionContext,
26
27
  executeWithAuditTransaction,
27
28
  } from './processAudits';
28
29
 
@@ -185,26 +186,39 @@ export class TestEndpointAdaptor<
185
186
  cookie,
186
187
  });
187
188
 
188
- // Create audit context if audit storage is configured
189
- // The auditorStorage is required when endpoint uses .auditor()
190
- const auditorStorageService = (ctx as any).auditorStorage as
191
- | Service<TAuditStorageServiceName, TAuditStorage>
192
- | undefined;
193
- const endpointWithAuditor = auditorStorageService
194
- ? { ...this.endpoint, auditorStorageService }
195
- : this.endpoint;
189
+ // Create audit context if audit storage is provided
190
+ // The auditorStorage instance is required when endpoint uses .auditor()
191
+ const auditorStorage = (ctx as any).auditorStorage as TAuditStorage;
192
+ let auditContext: AuditExecutionContext<TAuditAction> | undefined;
196
193
 
197
- const auditContext = await createAuditContext(
198
- endpointWithAuditor as typeof this.endpoint,
199
- this.serviceDiscovery,
200
- logger,
201
- {
202
- session,
203
- header,
204
- cookie,
205
- services: ctx.services as Record<string, unknown>,
206
- },
207
- );
194
+ if (auditorStorage) {
195
+ // Extract actor if configured
196
+ let actor: AuditActor = { id: 'system', type: 'system' };
197
+ if (this.endpoint.actorExtractor) {
198
+ try {
199
+ actor = await this.endpoint.actorExtractor({
200
+ services: ctx.services as any,
201
+ session,
202
+ header,
203
+ cookie,
204
+ logger,
205
+ });
206
+ } catch (error) {
207
+ logger.error(error as Error, 'Failed to extract actor for audits');
208
+ }
209
+ }
210
+
211
+ const auditor = new DefaultAuditor<TAuditAction>({
212
+ actor,
213
+ storage: auditorStorage as AuditStorage,
214
+ metadata: {
215
+ endpoint: this.endpoint.route,
216
+ method: this.endpoint.method,
217
+ },
218
+ });
219
+
220
+ auditContext = { auditor, storage: auditorStorage as AuditStorage };
221
+ }
208
222
 
209
223
  // Warn if declarative audits are configured but no audit storage
210
224
  const audits = this.endpoint.audits as MappedAudit<
@@ -215,29 +229,18 @@ export class TestEndpointAdaptor<
215
229
  logger.warn('No auditor storage service available');
216
230
  }
217
231
 
218
- // Resolve database service if configured
219
- // The database is required when endpoint uses .database()
220
- const databaseService = (ctx as any).database as
221
- | Service<TDatabaseServiceName, TDatabase>
222
- | undefined;
223
- const rawDb = databaseService
224
- ? await this.serviceDiscovery
225
- .register([databaseService])
226
- .then((s) => s[databaseService.serviceName as keyof typeof s])
227
- : undefined;
232
+ // Use database instance directly from context
233
+ // The database instance is required when endpoint uses .database()
234
+ const rawDb = (ctx as any).database as TDatabase;
228
235
 
229
236
  // Execute handler with automatic audit transaction support
230
237
  const result = await executeWithAuditTransaction(
231
238
  auditContext,
232
239
  async (auditor) => {
233
- // Use audit transaction as db only if the storage uses the same database service
234
- const sameDatabase =
235
- auditContext?.storage?.databaseServiceName &&
236
- auditContext.storage.databaseServiceName ===
237
- databaseService?.serviceName;
238
- const db = sameDatabase
239
- ? (auditor?.getTransaction?.() ?? rawDb)
240
- : rawDb;
240
+ // Use audit transaction as db if available (when storage has same database)
241
+ // For testing, the tester controls whether to use transactional auditing
242
+ const trx = auditor?.getTransaction?.();
243
+ const db = trx ?? rawDb;
241
244
 
242
245
  const responseBuilder = new ResponseBuilder();
243
246
  const response = await this.endpoint.handler(
@@ -337,25 +340,21 @@ export class TestEndpointAdaptor<
337
340
  */
338
341
  type AuditStorageRequirement<
339
342
  TAuditStorage extends AuditStorage | undefined = undefined,
340
- TAuditStorageServiceName extends string = string,
341
343
  > = TAuditStorage extends undefined
342
344
  ? {}
343
345
  : {
344
- /** Audit storage service - required when endpoint uses .auditor() */
345
- auditorStorage: Service<TAuditStorageServiceName, TAuditStorage>;
346
+ /** Audit storage instance - required when endpoint uses .auditor() */
347
+ auditorStorage: TAuditStorage;
346
348
  };
347
349
 
348
350
  /**
349
351
  * Conditional database requirement - required when TDatabase is configured
350
352
  */
351
- type DatabaseRequirement<
352
- TDatabase = undefined,
353
- TDatabaseServiceName extends string = string,
354
- > = TDatabase extends undefined
353
+ type DatabaseRequirement<TDatabase = undefined> = TDatabase extends undefined
355
354
  ? {}
356
355
  : {
357
- /** Database service - required when endpoint uses .database() */
358
- database: Service<TDatabaseServiceName, TDatabase>;
356
+ /** Database instance - required when endpoint uses .database() */
357
+ database: TDatabase;
359
358
  };
360
359
 
361
360
  export type TestRequestAdaptor<
@@ -364,13 +363,13 @@ export type TestRequestAdaptor<
364
363
  TEventPublisher extends EventPublisher<any> | undefined = undefined,
365
364
  TEventPublisherServiceName extends string = string,
366
365
  TAuditStorage extends AuditStorage | undefined = undefined,
367
- TAuditStorageServiceName extends string = string,
366
+ _TAuditStorageServiceName extends string = string,
368
367
  TDatabase = undefined,
369
- TDatabaseServiceName extends string = string,
368
+ _TDatabaseServiceName extends string = string,
370
369
  > = {
371
370
  services: ServiceRecord<TServices>;
372
371
  headers: Record<string, string>;
373
372
  publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
374
373
  } & InferComposableStandardSchema<TInput> &
375
- AuditStorageRequirement<TAuditStorage, TAuditStorageServiceName> &
376
- DatabaseRequirement<TDatabase, TDatabaseServiceName>;
374
+ AuditStorageRequirement<TAuditStorage> &
375
+ DatabaseRequirement<TDatabase>;
@@ -1073,7 +1073,7 @@ describe('HonoEndpointAdaptor', () => {
1073
1073
  expect(error).toHaveProperty('message', 'Validation failed');
1074
1074
  });
1075
1075
 
1076
- it('should return empty object when no output schema is defined', async () => {
1076
+ it('should return empty response when no output schema is defined', async () => {
1077
1077
  const endpoint = new Endpoint({
1078
1078
  route: '/users/no-schema',
1079
1079
  method: 'GET',
@@ -1097,7 +1097,8 @@ describe('HonoEndpointAdaptor', () => {
1097
1097
 
1098
1098
  const response = await app.request('/users/no-schema');
1099
1099
  expect(response.status).toBe(200);
1100
- expect(await response.json()).toEqual({});
1100
+ // When no output schema is defined, response body is empty
1101
+ expect(await response.text()).toBe('');
1101
1102
  });
1102
1103
  });
1103
1104
  });