@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.
- package/dist/{EndpointBuilder-DlDft4mJ.mjs → EndpointBuilder-D47py-H1.mjs} +1 -1
- package/dist/{EndpointBuilder-DlDft4mJ.mjs.map → EndpointBuilder-D47py-H1.mjs.map} +1 -1
- package/dist/{EndpointBuilder-CFnjYXmL.cjs → EndpointBuilder-vxy3s960.cjs} +1 -1
- package/dist/{EndpointBuilder-CFnjYXmL.cjs.map → EndpointBuilder-vxy3s960.cjs.map} +1 -1
- package/dist/{EndpointFactory-mTfi8x1X.cjs → EndpointFactory-DSTXeokM.cjs} +2 -2
- package/dist/EndpointFactory-DSTXeokM.cjs.map +1 -0
- package/dist/{EndpointFactory-Ctln6czP.mjs → EndpointFactory-HOCnoBNT.mjs} +2 -2
- package/dist/EndpointFactory-HOCnoBNT.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DuyE06nH.mjs → HonoEndpointAdaptor-BI0tA0Fg.mjs} +2 -2
- package/dist/{HonoEndpointAdaptor-DuyE06nH.mjs.map → HonoEndpointAdaptor-BI0tA0Fg.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-DsqGuEIb.d.mts → HonoEndpointAdaptor-BTwjymKt.d.mts} +3 -3
- package/dist/{HonoEndpointAdaptor-DajXbh80.d.cts → HonoEndpointAdaptor-CDL4pkMO.d.cts} +3 -3
- package/dist/{HonoEndpointAdaptor-CfLRHHFw.cjs → HonoEndpointAdaptor-CdWWj3EJ.cjs} +2 -2
- package/dist/{HonoEndpointAdaptor-CfLRHHFw.cjs.map → HonoEndpointAdaptor-CdWWj3EJ.cjs.map} +1 -1
- package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-Bdh8rMSL.cjs} +1 -1
- package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-Bdh8rMSL.cjs.map} +1 -1
- package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-CJOWwaw1.mjs} +1 -1
- package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-CJOWwaw1.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-BWQmiYd8.mjs} +2 -2
- package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-BWQmiYd8.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-DieD_60p.cjs} +2 -2
- package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-DieD_60p.cjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-DhRjJHyk.d.mts → TestEndpointAdaptor-Bl2ic-yr.d.mts} +9 -9
- package/dist/{TestEndpointAdaptor-B9tUIlCC.d.cts → TestEndpointAdaptor-ByXqQufk.d.cts} +9 -9
- package/dist/{TestEndpointAdaptor-B9hyZ-mF.cjs → TestEndpointAdaptor-C5qwQSnQ.cjs} +36 -16
- package/dist/TestEndpointAdaptor-C5qwQSnQ.cjs.map +1 -0
- package/dist/{TestEndpointAdaptor-DbwrL-RJ.mjs → TestEndpointAdaptor-DFDT9m8q.mjs} +37 -17
- package/dist/TestEndpointAdaptor-DFDT9m8q.mjs.map +1 -0
- package/dist/adaptors/aws.d.cts +1 -1
- package/dist/adaptors/hono.cjs +1 -1
- package/dist/adaptors/hono.d.cts +2 -2
- package/dist/adaptors/hono.d.mts +1 -1
- package/dist/adaptors/hono.mjs +1 -1
- package/dist/adaptors/testing.cjs +1 -1
- package/dist/adaptors/testing.d.cts +2 -2
- package/dist/adaptors/testing.d.mts +1 -1
- package/dist/adaptors/testing.mjs +1 -1
- package/dist/crons/Cron.d.cts +1 -1
- package/dist/crons/CronBuilder.d.cts +1 -1
- package/dist/crons/index.d.cts +5 -5
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/Endpoint.d.cts +1 -1
- package/dist/endpoints/EndpointBuilder.cjs +1 -1
- package/dist/endpoints/EndpointBuilder.d.cts +1 -1
- package/dist/endpoints/EndpointBuilder.mjs +1 -1
- package/dist/endpoints/EndpointFactory.cjs +2 -2
- package/dist/endpoints/EndpointFactory.d.cts +1 -1
- package/dist/endpoints/EndpointFactory.mjs +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.cjs +1 -1
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/HonoEndpointAdaptor.mjs +1 -1
- package/dist/endpoints/TestEndpointAdaptor.cjs +1 -1
- package/dist/endpoints/TestEndpointAdaptor.d.cts +2 -2
- package/dist/endpoints/TestEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/TestEndpointAdaptor.mjs +1 -1
- package/dist/endpoints/audit.d.cts +1 -1
- package/dist/endpoints/helpers.d.cts +1 -1
- package/dist/endpoints/index.cjs +2 -2
- package/dist/endpoints/index.d.cts +3 -3
- package/dist/endpoints/index.d.mts +2 -2
- package/dist/endpoints/index.mjs +2 -2
- package/dist/endpoints/processAudits.d.cts +1 -1
- package/dist/functions/index.d.cts +1 -1
- package/dist/index-CkBMFqhI.d.cts +10 -0
- package/dist/subscribers/Subscriber.cjs +1 -1
- package/dist/subscribers/Subscriber.mjs +1 -1
- package/dist/subscribers/SubscriberBuilder.cjs +2 -2
- package/dist/subscribers/SubscriberBuilder.mjs +2 -2
- package/dist/subscribers/index.cjs +2 -2
- package/dist/subscribers/index.d.mts +2 -2
- package/dist/subscribers/index.mjs +2 -2
- package/package.json +6 -6
- package/src/endpoints/HonoEndpointAdaptor.ts +2 -2
- package/src/endpoints/TestEndpointAdaptor.ts +51 -52
- package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +3 -2
- package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +614 -0
- package/dist/EndpointFactory-Ctln6czP.mjs.map +0 -1
- package/dist/EndpointFactory-mTfi8x1X.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-B9hyZ-mF.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-DbwrL-RJ.mjs.map +0 -1
- 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
|
-
|
|
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
|
|
189
|
-
// The auditorStorage is required when endpoint uses .auditor()
|
|
190
|
-
const
|
|
191
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
//
|
|
219
|
-
// The database is required when endpoint uses .database()
|
|
220
|
-
const
|
|
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
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
|
345
|
-
auditorStorage:
|
|
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
|
|
358
|
-
database:
|
|
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
|
-
|
|
366
|
+
_TAuditStorageServiceName extends string = string,
|
|
368
367
|
TDatabase = undefined,
|
|
369
|
-
|
|
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
|
|
376
|
-
DatabaseRequirement<TDatabase
|
|
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
|
|
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
|
-
|
|
1100
|
+
// When no output schema is defined, response body is empty
|
|
1101
|
+
expect(await response.text()).toBe('');
|
|
1101
1102
|
});
|
|
1102
1103
|
});
|
|
1103
1104
|
});
|