glasswork 1.5.0 → 1.6.1
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/CHANGELOG.md +62 -1
- package/README.md +6 -2
- package/dist/audit/audit-logger.d.ts +6 -1
- package/dist/audit/audit-logger.d.ts.map +1 -1
- package/dist/audit/audit-logger.js +6 -1
- package/dist/audit/audit-logger.js.map +1 -1
- package/dist/auth/assert.d.ts +4 -0
- package/dist/auth/assert.d.ts.map +1 -1
- package/dist/auth/assert.js +7 -3
- package/dist/auth/assert.js.map +1 -1
- package/dist/auth/better-auth-provider.js +13 -4
- package/dist/auth/better-auth-provider.js.map +1 -1
- package/dist/auth/errors.d.ts +17 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +23 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/index.d.ts +2 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/middleware.d.ts +13 -0
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +19 -8
- package/dist/auth/middleware.js.map +1 -1
- package/dist/auth/types.d.ts +4 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/config/providers.d.ts.map +1 -1
- package/dist/config/providers.js +5 -4
- package/dist/config/providers.js.map +1 -1
- package/dist/core/bootstrap.d.ts +2 -2
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/bootstrap.js +142 -68
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/contract.d.ts +9 -2
- package/dist/core/contract.d.ts.map +1 -1
- package/dist/core/contract.js +2 -1
- package/dist/core/contract.js.map +1 -1
- package/dist/core/errors.d.ts +16 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +31 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/glasswork-config.d.ts +42 -0
- package/dist/core/glasswork-config.d.ts.map +1 -0
- package/dist/core/glasswork-config.js +2 -0
- package/dist/core/glasswork-config.js.map +1 -0
- package/dist/core/index.d.ts +6 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/job-services.d.ts +16 -0
- package/dist/core/job-services.d.ts.map +1 -0
- package/dist/core/job-services.js +19 -0
- package/dist/core/job-services.js.map +1 -0
- package/dist/core/lifecycle.d.ts +29 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +98 -15
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/module-graph.d.ts +2 -0
- package/dist/core/module-graph.d.ts.map +1 -1
- package/dist/core/module-graph.js +63 -10
- package/dist/core/module-graph.js.map +1 -1
- package/dist/core/module-inspection.d.ts +44 -0
- package/dist/core/module-inspection.d.ts.map +1 -0
- package/dist/core/module-inspection.js +114 -0
- package/dist/core/module-inspection.js.map +1 -0
- package/dist/core/module-runtime.d.ts +8 -0
- package/dist/core/module-runtime.d.ts.map +1 -1
- package/dist/core/module-runtime.js +60 -6
- package/dist/core/module-runtime.js.map +1 -1
- package/dist/core/request-scope.js +1 -1
- package/dist/core/request-scope.js.map +1 -1
- package/dist/core/types.d.ts +98 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/email/compiler/compiler.d.ts.map +1 -1
- package/dist/email/compiler/compiler.js +52 -43
- package/dist/email/compiler/compiler.js.map +1 -1
- package/dist/email/ses.d.ts +7 -0
- package/dist/email/ses.d.ts.map +1 -0
- package/dist/email/ses.js +6 -0
- package/dist/email/ses.js.map +1 -0
- package/dist/email/smtp.d.ts +7 -0
- package/dist/email/smtp.d.ts.map +1 -0
- package/dist/email/smtp.js +6 -0
- package/dist/email/smtp.js.map +1 -0
- package/dist/email/transports/ses-transport.d.ts.map +1 -1
- package/dist/email/transports/ses-transport.js +6 -4
- package/dist/email/transports/ses-transport.js.map +1 -1
- package/dist/email/transports/smtp-transport.d.ts +40 -0
- package/dist/email/transports/smtp-transport.d.ts.map +1 -0
- package/dist/email/transports/smtp-transport.js +67 -0
- package/dist/email/transports/smtp-transport.js.map +1 -0
- package/dist/http/error-handler.d.ts +7 -1
- package/dist/http/error-handler.d.ts.map +1 -1
- package/dist/http/error-handler.js +18 -6
- package/dist/http/error-handler.js.map +1 -1
- package/dist/http/error-response.dto.d.ts +6 -0
- package/dist/http/error-response.dto.d.ts.map +1 -1
- package/dist/http/error-response.dto.js +6 -0
- package/dist/http/error-response.dto.js.map +1 -1
- package/dist/http/errors.d.ts +12 -0
- package/dist/http/errors.d.ts.map +1 -1
- package/dist/http/errors.js +35 -23
- package/dist/http/errors.js.map +1 -1
- package/dist/http/index.d.ts +1 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/http/index.js.map +1 -1
- package/dist/http/route-authorization.d.ts.map +1 -1
- package/dist/http/route-authorization.js +3 -3
- package/dist/http/route-authorization.js.map +1 -1
- package/dist/http/route-helpers.d.ts +2 -1
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js +29 -2
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/http/route-openapi-context.d.ts +15 -1
- package/dist/http/route-openapi-context.d.ts.map +1 -1
- package/dist/http/route-openapi-context.js.map +1 -1
- package/dist/http/route-response.d.ts +6 -2
- package/dist/http/route-response.d.ts.map +1 -1
- package/dist/http/route-response.js +36 -16
- package/dist/http/route-response.js.map +1 -1
- package/dist/http/route-types.d.ts +12 -4
- package/dist/http/route-types.d.ts.map +1 -1
- package/dist/http/route-types.js.map +1 -1
- package/dist/http/route-validation.d.ts.map +1 -1
- package/dist/http/route-validation.js +21 -1
- package/dist/http/route-validation.js.map +1 -1
- package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +1 -0
- package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/eventbridge-scheduler-driver.js +12 -2
- package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
- package/dist/jobs/drivers/mock-driver.d.ts +4 -0
- package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/mock-driver.js +10 -3
- package/dist/jobs/drivers/mock-driver.js.map +1 -1
- package/dist/jobs/drivers/sqs-driver.d.ts +1 -1
- package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/sqs-driver.js +8 -2
- package/dist/jobs/drivers/sqs-driver.js.map +1 -1
- package/dist/jobs/errors.d.ts +14 -1
- package/dist/jobs/errors.d.ts.map +1 -1
- package/dist/jobs/errors.js +19 -2
- package/dist/jobs/errors.js.map +1 -1
- package/dist/jobs/index.d.ts +3 -3
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/job-service.d.ts +46 -7
- package/dist/jobs/job-service.d.ts.map +1 -1
- package/dist/jobs/job-service.js +63 -9
- package/dist/jobs/job-service.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +6 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +6 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/sqs.d.ts +7 -0
- package/dist/jobs/sqs.d.ts.map +1 -0
- package/dist/jobs/sqs.js +7 -0
- package/dist/jobs/sqs.js.map +1 -0
- package/dist/jobs/types.d.ts +6 -1
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs/utils.d.ts +6 -0
- package/dist/jobs/utils.d.ts.map +1 -1
- package/dist/jobs/utils.js +8 -0
- package/dist/jobs/utils.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +5 -4
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/observability/exception-tracking.d.ts +23 -0
- package/dist/observability/exception-tracking.d.ts.map +1 -1
- package/dist/observability/exception-tracking.js +101 -6
- package/dist/observability/exception-tracking.js.map +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +1 -1
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/sanitizers.d.ts.map +1 -1
- package/dist/observability/sanitizers.js +2 -0
- package/dist/observability/sanitizers.js.map +1 -1
- package/dist/openapi/drift.d.ts +17 -2
- package/dist/openapi/drift.d.ts.map +1 -1
- package/dist/openapi/drift.js +79 -5
- package/dist/openapi/drift.js.map +1 -1
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +2 -1
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/utils/environment.d.ts +10 -2
- package/dist/utils/environment.d.ts.map +1 -1
- package/dist/utils/environment.js +20 -3
- package/dist/utils/environment.js.map +1 -1
- package/dist/utils/module-interop.d.ts +9 -0
- package/dist/utils/module-interop.d.ts.map +1 -0
- package/dist/utils/module-interop.js +16 -0
- package/dist/utils/module-interop.js.map +1 -0
- package/dist/utils/optional-dependency.d.ts +6 -0
- package/dist/utils/optional-dependency.d.ts.map +1 -0
- package/dist/utils/optional-dependency.js +16 -0
- package/dist/utils/optional-dependency.js.map +1 -0
- package/dist/utils/serialize-prisma-types.d.ts +51 -15
- package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
- package/dist/utils/serialize-prisma-types.js +47 -16
- package/dist/utils/serialize-prisma-types.js.map +1 -1
- package/package.json +56 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-authorization.d.ts","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CACvC,SAAS,EAAE;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,YAAY,EAAE,OAAO,GACpB,IAAI,
|
|
1
|
+
{"version":3,"file":"route-authorization.d.ts","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CACvC,SAAS,EAAE;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,YAAY,EAAE,OAAO,GACpB,IAAI,CAwBN"}
|
|
@@ -6,14 +6,14 @@ export function enforceRouteAuthorization(authorize, routeContext) {
|
|
|
6
6
|
const isAuthenticated = routeContext.isAuthenticated ?? Boolean(user);
|
|
7
7
|
const allowGuest = authorize.allowGuest ?? false;
|
|
8
8
|
if (!isAuthenticated && !allowGuest) {
|
|
9
|
-
throw new UnauthorizedException('Authentication required');
|
|
9
|
+
throw new UnauthorizedException('Authentication required', { errorCode: 'auth-required' });
|
|
10
10
|
}
|
|
11
11
|
const canAccess = ability?.can?.(authorize.action, authorize.subject);
|
|
12
12
|
if (!canAccess) {
|
|
13
13
|
if (!isAuthenticated) {
|
|
14
|
-
throw new UnauthorizedException('Authentication required');
|
|
14
|
+
throw new UnauthorizedException('Authentication required', { errorCode: 'auth-required' });
|
|
15
15
|
}
|
|
16
|
-
throw new ForbiddenException(`You don't have permission to ${authorize.action} ${authorize.subject}
|
|
16
|
+
throw new ForbiddenException(`You don't have permission to ${authorize.action} ${authorize.subject}`, { errorCode: 'forbidden' });
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=route-authorization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-authorization.js","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,UAAU,yBAAyB,CACvC,SAIC,EACD,YAAqB;IAErB,MAAM,OAAO,GAAI,YAA2E;SACzF,OAAO,CAAC;IACX,MAAM,IAAI,GAAI,YAA0C,CAAC,IAAI,CAAC;IAC9D,MAAM,eAAe,GAClB,YAA8C,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC;IAEjD,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"route-authorization.js","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,UAAU,yBAAyB,CACvC,SAIC,EACD,YAAqB;IAErB,MAAM,OAAO,GAAI,YAA2E;SACzF,OAAO,CAAC;IACX,MAAM,IAAI,GAAI,YAA0C,CAAC,IAAI,CAAC;IAC9D,MAAM,eAAe,GAClB,YAA8C,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC;IAEjD,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,OAAgB,CAAC,CAAC;IAE/E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,gCAAgC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,EACvE,EAAE,SAAS,EAAE,WAAW,EAAE,CAC3B,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Context, Hono } from 'hono';
|
|
2
|
+
import type { ConfiguredStrictTypes } from '../core/glasswork-config.js';
|
|
2
3
|
import type { RouteFactory, RouteHandlers } from '../core/types.js';
|
|
3
4
|
import type { BoundRouteFunction, RouteConfig, STATUS_DESCRIPTIONS, ValibotSchema } from './route-types.js';
|
|
4
5
|
export type { OpenAPIContext } from './route-openapi-context.js';
|
|
@@ -11,5 +12,5 @@ export declare function createRoutes<TServices = Record<string, unknown>, TConte
|
|
|
11
12
|
/**
|
|
12
13
|
* Create a route handler with validation and OpenAPI metadata.
|
|
13
14
|
*/
|
|
14
|
-
export declare function route<TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean =
|
|
15
|
+
export declare function route<TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = ConfiguredStrictTypes, TContextVariables extends object = Context['var']>(router: Hono, config: RouteConfig<TBody, TQuery, TParams, TResponses, TPublic, TStrictTypes, TContextVariables>): RouteHandlers;
|
|
15
16
|
//# sourceMappingURL=route-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOpE,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAClF,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,iBAAiB,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAEjD,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,IAAI,GACjG,YAAY,CAKd;AAED;;GAEG;AACH,wBAAgB,KAAK,CACnB,KAAK,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACnD,MAAM,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACrD,UAAU,SAAS,OAAO,CACxB,MAAM,CAAC,MAAM,OAAO,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC,CACpE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxB,OAAO,SAAS,OAAO,GAAG,KAAK,EAC/B,YAAY,SAAS,OAAO,GAAG,qBAAqB,EACpD,iBAAiB,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAEjD,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,CAAC,GAChG,aAAa,CAmDf"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { detectEnvironment } from '../utils/environment.js';
|
|
1
2
|
import { enforceRouteAuthorization } from './route-authorization.js';
|
|
2
3
|
import { buildRouteContext } from './route-context.js';
|
|
3
4
|
import { buildOpenAPIMiddleware } from './route-openapi.js';
|
|
@@ -41,9 +42,35 @@ export function route(router, config) {
|
|
|
41
42
|
if (config.authorize) {
|
|
42
43
|
enforceRouteAuthorization(config.authorize, routeContext);
|
|
43
44
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
45
|
+
const statusTracking = trackExplicitStatus(c);
|
|
46
|
+
let result;
|
|
47
|
+
try {
|
|
48
|
+
result = await config.handler(routeContext);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
statusTracking.stop();
|
|
52
|
+
}
|
|
53
|
+
return handleResponse(result, config.responses, config.serialization, openAPIContext.serialization, config.strictTypes ?? openAPIContext.strictTypes, config.summary, c, openAPIContext.environment ?? detectEnvironment(), routeContext.logger, statusTracking.status);
|
|
46
54
|
});
|
|
47
55
|
return middlewares;
|
|
48
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Hono keeps the status private and reports 200 until a response exists, so an explicit
|
|
59
|
+
* `context.status(200)` is indistinguishable from the default. Record the status the
|
|
60
|
+
* handler sets, and restore Hono's method once the handler has finished.
|
|
61
|
+
*/
|
|
62
|
+
function trackExplicitStatus(c) {
|
|
63
|
+
const setStatus = c.status;
|
|
64
|
+
const tracking = {
|
|
65
|
+
status: undefined,
|
|
66
|
+
stop: () => {
|
|
67
|
+
c.status = setStatus;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
c.status = (code) => {
|
|
71
|
+
tracking.status = code;
|
|
72
|
+
setStatus(code);
|
|
73
|
+
};
|
|
74
|
+
return tracking;
|
|
75
|
+
}
|
|
49
76
|
//# sourceMappingURL=route-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Hono } from 'hono';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DecimalSerialization } from '../core/glasswork-config.js';
|
|
3
|
+
import type { Environment, OpenAPIResponseProcessor } from '../core/types.js';
|
|
3
4
|
import type { PinoLogger } from '../observability/pino-logger.js';
|
|
5
|
+
import type { SerializationConfig } from '../utils/serialize-prisma-types.js';
|
|
4
6
|
/**
|
|
5
7
|
* OpenAPI context stored in Hono app context.
|
|
6
8
|
* Set during bootstrap and used when defining routes.
|
|
@@ -15,6 +17,18 @@ export interface OpenAPIContext {
|
|
|
15
17
|
pino?: PinoLogger;
|
|
16
18
|
logger?: import('../utils/logger.js').Logger;
|
|
17
19
|
sanitizers?: import('../observability/sanitizers.js').ObservabilitySanitizers;
|
|
20
|
+
/**
|
|
21
|
+
* Environment resolved by `bootstrap()`. Production rejects responses that match no
|
|
22
|
+
* declared schema. Routes outside bootstrap fall back to `detectEnvironment()`.
|
|
23
|
+
*/
|
|
24
|
+
environment?: Environment;
|
|
25
|
+
/**
|
|
26
|
+
* Application-wide serialization built from the `serialization` bootstrap option. A route's
|
|
27
|
+
* own transformers run before its transformers. Routes outside bootstrap use the defaults.
|
|
28
|
+
*/
|
|
29
|
+
serialization?: SerializationConfig<DecimalSerialization>;
|
|
30
|
+
/** `serialization.strictTypes` from bootstrap; a route's own `strictTypes` takes precedence. */
|
|
31
|
+
strictTypes?: boolean;
|
|
18
32
|
}
|
|
19
33
|
/**
|
|
20
34
|
* Set the OpenAPI context for a Hono app instance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-openapi-context.d.ts","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"route-openapi-context.d.ts","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,oBAAoB,EAAE,MAAM,CAAC;IAC7C,UAAU,CAAC,EAAE,OAAO,gCAAgC,EAAE,uBAAuB,CAAC;IAC9E;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IAC1D,gGAAgG;IAChG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE1E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,GAAG,cAAc,CAE3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-openapi-context.js","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-openapi-context.js","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAkCA,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAwB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAS,EAAE,OAAuB;IAClE,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAS;IACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChG,CAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { Context } from 'hono';
|
|
2
|
+
import type { DecimalSerialization } from '../core/glasswork-config.js';
|
|
3
|
+
import type { Environment } from '../core/types.js';
|
|
2
4
|
import { type Logger } from '../utils/logger.js';
|
|
3
|
-
import { type SerializationConfig } from '../utils/serialize-prisma-types.js';
|
|
5
|
+
import { type SerializationConfig, type TypeTransformer } from '../utils/serialize-prisma-types.js';
|
|
4
6
|
import type { STATUS_DESCRIPTIONS, ValibotSchema } from './route-types.js';
|
|
5
|
-
export declare function handleResponse<TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>>>(result: unknown, responses: TResponses | undefined, serializationConfig:
|
|
7
|
+
export declare function handleResponse<TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>>>(result: unknown, responses: TResponses | undefined, serializationConfig: {
|
|
8
|
+
transformers?: TypeTransformer[];
|
|
9
|
+
} | undefined, applicationSerialization: SerializationConfig<DecimalSerialization> | undefined, strictTypes: boolean | undefined, routeSummary: string | undefined, context: Context, environment: Environment, logger?: Logger, explicitStatus?: number): Promise<Response | undefined>;
|
|
6
10
|
//# sourceMappingURL=route-response.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-response.d.ts","sourceRoot":"","sources":["../../src/http/route-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAEL,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"route-response.d.ts","sourceRoot":"","sources":["../../src/http/route-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,eAAe,EACrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA+F3E,wBAAsB,cAAc,CAClC,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC,EAE/F,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,mBAAmB,EAAE;IAAE,YAAY,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,GAAG,SAAS,EACrE,wBAAwB,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,GAAG,SAAS,EAC/E,WAAW,EAAE,OAAO,GAAG,SAAS,EAChC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,MAAM,GAAE,MAA+B,EACvC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAqD/B"}
|
|
@@ -1,21 +1,38 @@
|
|
|
1
1
|
import { safeParseAsync } from 'valibot';
|
|
2
2
|
import { createLogger } from '../utils/logger.js';
|
|
3
3
|
import { defaultConfig as defaultSerializationConfig, serializePrismaTypes, } from '../utils/serialize-prisma-types.js';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Route-level transformers run first, then the application-wide configuration from
|
|
6
|
+
* bootstrap (or the defaults), which ends with the built-in Date and Decimal handling.
|
|
7
|
+
*/
|
|
8
|
+
function serializeResponseData(data, routeTransformers, applicationConfig = defaultSerializationConfig) {
|
|
9
|
+
const config = routeTransformers?.length
|
|
6
10
|
? {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
...defaultSerializationConfig.transformers,
|
|
10
|
-
],
|
|
11
|
+
...applicationConfig,
|
|
12
|
+
transformers: [...routeTransformers, ...applicationConfig.transformers],
|
|
11
13
|
}
|
|
12
|
-
:
|
|
14
|
+
: applicationConfig;
|
|
13
15
|
return serializePrismaTypes(data, config);
|
|
14
16
|
}
|
|
15
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Picks the response status and schema. A status the handler set explicitly wins when the
|
|
19
|
+
* route declares a schema for it; otherwise the first declared success or redirect schema
|
|
20
|
+
* that accepts the data decides the status.
|
|
21
|
+
*/
|
|
22
|
+
async function parseResponse(data, responses, logger, environment, explicitStatus) {
|
|
16
23
|
if (!responses) {
|
|
17
24
|
return { data };
|
|
18
25
|
}
|
|
26
|
+
const explicitSchema = explicitStatus === undefined
|
|
27
|
+
? undefined
|
|
28
|
+
: responses[explicitStatus];
|
|
29
|
+
if (explicitSchema) {
|
|
30
|
+
const result = await safeParseAsync(explicitSchema, data);
|
|
31
|
+
if (result.success) {
|
|
32
|
+
return { data: result.output, statusCode: explicitStatus };
|
|
33
|
+
}
|
|
34
|
+
return rejectUnmatchedResponse(data, logger, environment, `the ${explicitStatus} schema`);
|
|
35
|
+
}
|
|
19
36
|
const successCodes = [
|
|
20
37
|
200, 201, 202, 204, 301, 302, 307, 308,
|
|
21
38
|
];
|
|
@@ -28,18 +45,21 @@ async function parseResponse(data, responses, logger) {
|
|
|
28
45
|
return { data: result.output, statusCode };
|
|
29
46
|
}
|
|
30
47
|
}
|
|
31
|
-
|
|
32
|
-
|
|
48
|
+
return rejectUnmatchedResponse(data, logger, environment, 'any defined success/redirect schema');
|
|
49
|
+
}
|
|
50
|
+
function rejectUnmatchedResponse(data, logger, environment, expected) {
|
|
51
|
+
if (environment === 'production') {
|
|
52
|
+
logger.error(`Response data does not match ${expected}. ` +
|
|
33
53
|
'Refusing to return unvalidated data in production.');
|
|
34
54
|
throw new Error('Response validation failed: Data does not match any defined response schema. ' +
|
|
35
55
|
'This prevents potentially sensitive data from being leaked.');
|
|
36
56
|
}
|
|
37
|
-
logger.warn(
|
|
57
|
+
logger.warn(`Response data does not match ${expected}. ` +
|
|
38
58
|
'Data will be returned as-is without validation or key stripping. ' +
|
|
39
59
|
'This would throw an error in production.');
|
|
40
60
|
return { data };
|
|
41
61
|
}
|
|
42
|
-
export async function handleResponse(result, responses, serializationConfig, strictTypes, routeSummary, context, logger = createLogger('Routes')) {
|
|
62
|
+
export async function handleResponse(result, responses, serializationConfig, applicationSerialization, strictTypes, routeSummary, context, environment, logger = createLogger('Routes'), explicitStatus) {
|
|
43
63
|
if (result instanceof Response) {
|
|
44
64
|
return result;
|
|
45
65
|
}
|
|
@@ -50,7 +70,7 @@ export async function handleResponse(result, responses, serializationConfig, str
|
|
|
50
70
|
let serializedResult;
|
|
51
71
|
try {
|
|
52
72
|
if (!strictTypes) {
|
|
53
|
-
serializedResult = serializeResponseData(result, serializationConfig);
|
|
73
|
+
serializedResult = serializeResponseData(result, serializationConfig?.transformers, applicationSerialization);
|
|
54
74
|
}
|
|
55
75
|
else {
|
|
56
76
|
serializedResult = result;
|
|
@@ -61,14 +81,14 @@ export async function handleResponse(result, responses, serializationConfig, str
|
|
|
61
81
|
error: error instanceof Error ? error.message : String(error),
|
|
62
82
|
route: routeSummary || 'unknown',
|
|
63
83
|
});
|
|
64
|
-
const errorMessage =
|
|
84
|
+
const errorMessage = environment === 'production'
|
|
65
85
|
? 'Failed to serialize response data'
|
|
66
86
|
: error instanceof Error
|
|
67
87
|
? error.message
|
|
68
88
|
: String(error);
|
|
69
|
-
return context.json({ error: 'Internal Server Error', message: errorMessage }, 500);
|
|
89
|
+
return context.json({ error: 'Internal Server Error', code: 'internal-server-error', message: errorMessage }, 500);
|
|
70
90
|
}
|
|
71
|
-
const { data: parsedResult, statusCode } = await parseResponse(serializedResult, responses, logger);
|
|
91
|
+
const { data: parsedResult, statusCode } = await parseResponse(serializedResult, responses, logger, environment, explicitStatus);
|
|
72
92
|
if (statusCode) {
|
|
73
93
|
context.status(statusCode);
|
|
74
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-response.js","sourceRoot":"","sources":["../../src/http/route-response.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"route-response.js","sourceRoot":"","sources":["../../src/http/route-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Context, MiddlewareHandler } from 'hono';
|
|
2
2
|
import type { DescribeRouteOptions } from 'hono-openapi';
|
|
3
3
|
import type { BaseIssue, BaseSchema, BaseSchemaAsync, InferOutput } from 'valibot';
|
|
4
|
+
import type { ConfiguredStrictTypes } from '../core/glasswork-config.js';
|
|
4
5
|
import type { RouteConfigExtensions, RouteFactory, RouteHandlers } from '../core/types.js';
|
|
5
|
-
import type { AcceptPrismaTypes,
|
|
6
|
+
import type { AcceptPrismaTypes, TypeTransformer } from '../utils/serialize-prisma-types.js';
|
|
6
7
|
/**
|
|
7
8
|
* OpenAPI extensions for route configuration
|
|
8
9
|
*/
|
|
@@ -54,8 +55,8 @@ export type { RouteFactory };
|
|
|
54
55
|
/**
|
|
55
56
|
* Bound route function type - route() pre-bound to a router's OpenAPI context.
|
|
56
57
|
*/
|
|
57
|
-
export type BoundRouteFunction<TContextVariables extends object = Context['var']> = <TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean =
|
|
58
|
-
export interface RouteConfig<TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean =
|
|
58
|
+
export type BoundRouteFunction<TContextVariables extends object = Context['var']> = <TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = ConfiguredStrictTypes>(config: RouteConfig<TBody, TQuery, TParams, TResponses, TPublic, TStrictTypes, TContextVariables>) => RouteHandlers;
|
|
59
|
+
export interface RouteConfig<TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = ConfiguredStrictTypes, TContextVariables extends object = Context['var']> extends RouteConfigExtensions {
|
|
59
60
|
tags?: string[];
|
|
60
61
|
summary?: string;
|
|
61
62
|
description?: string;
|
|
@@ -68,8 +69,15 @@ export interface RouteConfig<TBody extends ValibotSchema | undefined = undefined
|
|
|
68
69
|
responses?: TResponses;
|
|
69
70
|
openapi?: RouteOpenAPIOptions;
|
|
70
71
|
middleware?: MiddlewareHandler[];
|
|
72
|
+
/**
|
|
73
|
+
* Disable automatic serialization and require the handler to return the schema types exactly.
|
|
74
|
+
* Defaults to the `serialization.strictTypes` bootstrap option, as declared in `GlassworkConfig`.
|
|
75
|
+
*/
|
|
71
76
|
strictTypes?: TStrictTypes;
|
|
72
|
-
|
|
77
|
+
/** Transformers for this route, which run before the application-wide ones from bootstrap. */
|
|
78
|
+
serialization?: {
|
|
79
|
+
transformers?: TypeTransformer[];
|
|
80
|
+
};
|
|
73
81
|
authorize?: {
|
|
74
82
|
action: string;
|
|
75
83
|
subject: string | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-types.d.ts","sourceRoot":"","sources":["../../src/http/route-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"route-types.d.ts","sourceRoot":"","sources":["../../src/http/route-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-types.js","sourceRoot":"","sources":["../../src/http/route-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-types.js","sourceRoot":"","sources":["../../src/http/route-types.ts"],"names":[],"mappings":"AAgDA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,sBAAsB;IAC3B,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,uBAAuB;CACpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-validation.d.ts","sourceRoot":"","sources":["../../src/http/route-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"route-validation.d.ts","sourceRoot":"","sources":["../../src/http/route-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAGvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAS9E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EACzC,MAAM,EAAE,aAAa,GACpB,iBAAiB,CAanB"}
|
|
@@ -17,8 +17,28 @@ export function hasPaginationFields(schema) {
|
|
|
17
17
|
export function createValidationMiddleware(type, schema) {
|
|
18
18
|
return validator(type, schema, (result, c) => {
|
|
19
19
|
if (!result.success) {
|
|
20
|
-
return c.json({
|
|
20
|
+
return c.json({
|
|
21
|
+
error: 'Validation failed',
|
|
22
|
+
code: 'validation-failed',
|
|
23
|
+
issues: toValidationIssues(result.error),
|
|
24
|
+
}, 422);
|
|
21
25
|
}
|
|
22
26
|
});
|
|
23
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Reduce schema issues to `{ message, path }`, as `ValidationIssueDto` documents. Raw issues
|
|
30
|
+
* also hold the received input, which would echo the request body, such as a password,
|
|
31
|
+
* back to the client.
|
|
32
|
+
*/
|
|
33
|
+
function toValidationIssues(issues) {
|
|
34
|
+
if (!Array.isArray(issues))
|
|
35
|
+
return [];
|
|
36
|
+
return issues.map((issue) => ({
|
|
37
|
+
message: issue.message,
|
|
38
|
+
path: (issue.path ?? []).map((segment) => {
|
|
39
|
+
const key = typeof segment === 'object' && segment !== null ? segment.key : segment;
|
|
40
|
+
return typeof key === 'number' ? key : String(key);
|
|
41
|
+
}),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
24
44
|
//# sourceMappingURL=route-validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-validation.js","sourceRoot":"","sources":["../../src/http/route-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"route-validation.js","sourceRoot":"","sources":["../../src/http/route-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAiC;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,MAAM,SAAS,GAAG,MAA+C,CAAC;IAClE,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,MAAM,IAAI,SAAS,CAAC,OAAO,IAAI,UAAU,IAAI,SAAS,CAAC,OAAO,CAAC;IACxE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAAyC,EACzC,MAAqB;IAErB,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,MAA6C,EAAE,CAAU,EAAE,EAAE;QAC3F,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC;aACzC,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAOD;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAQ,MAAwB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YACpF,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -35,6 +35,7 @@ export interface ScheduleResult extends EnqueueResult {
|
|
|
35
35
|
export declare class EventBridgeSchedulerDriver {
|
|
36
36
|
private readonly config;
|
|
37
37
|
private client;
|
|
38
|
+
private disposed;
|
|
38
39
|
constructor(config: EventBridgeSchedulerConfig);
|
|
39
40
|
/**
|
|
40
41
|
* Lazily initialize the Scheduler client.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbridge-scheduler-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/eventbridge-scheduler-driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eventbridge-scheduler-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/eventbridge-scheduler-driver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,0BAA0B;IACzC,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,0BAA0B;IAC1B,WAAW,EAAE,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;;;;GAKG;AACH,qBAAa,0BAA0B;IAIzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAA6B,MAAM,EAAE,0BAA0B,EAAI;IAEnE;;OAEG;YACW,SAAS;IAavB;;;;;;;;OAQG;IACG,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDpE;IAED;;;;OAIG;IACG,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAShD;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAM7B;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;CAwBtB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { optionalDependency } from '../../utils/optional-dependency.js';
|
|
2
2
|
import { generateJobId } from '../utils.js';
|
|
3
|
+
const loadScheduler = optionalDependency('@aws-sdk/client-scheduler', 'EventBridgeSchedulerDriver', () => import('@aws-sdk/client-scheduler'));
|
|
3
4
|
/**
|
|
4
5
|
* EventBridge Scheduler driver for scheduling jobs with delays longer than 15 minutes.
|
|
5
6
|
*
|
|
@@ -9,6 +10,7 @@ import { generateJobId } from '../utils.js';
|
|
|
9
10
|
export class EventBridgeSchedulerDriver {
|
|
10
11
|
config;
|
|
11
12
|
client = null;
|
|
13
|
+
disposed = false;
|
|
12
14
|
constructor(config) {
|
|
13
15
|
this.config = config;
|
|
14
16
|
}
|
|
@@ -16,8 +18,13 @@ export class EventBridgeSchedulerDriver {
|
|
|
16
18
|
* Lazily initialize the Scheduler client.
|
|
17
19
|
*/
|
|
18
20
|
async getClient() {
|
|
21
|
+
if (this.disposed)
|
|
22
|
+
throw new Error('EventBridgeSchedulerDriver has been disposed');
|
|
19
23
|
if (!this.client) {
|
|
20
|
-
|
|
24
|
+
const { SchedulerClient } = await loadScheduler();
|
|
25
|
+
if (this.disposed)
|
|
26
|
+
throw new Error('EventBridgeSchedulerDriver has been disposed');
|
|
27
|
+
this.client ??= new SchedulerClient({
|
|
21
28
|
region: this.config.region,
|
|
22
29
|
...(this.config.endpoint && { endpoint: this.config.endpoint }),
|
|
23
30
|
});
|
|
@@ -47,6 +54,7 @@ export class EventBridgeSchedulerDriver {
|
|
|
47
54
|
metadata: config.message.metadata,
|
|
48
55
|
enqueuedAt: new Date().toISOString(),
|
|
49
56
|
});
|
|
57
|
+
const { CreateScheduleCommand } = await loadScheduler();
|
|
50
58
|
const command = new CreateScheduleCommand({
|
|
51
59
|
Name: scheduleName,
|
|
52
60
|
GroupName: this.config.scheduleGroupName ?? 'default',
|
|
@@ -85,6 +93,7 @@ export class EventBridgeSchedulerDriver {
|
|
|
85
93
|
*/
|
|
86
94
|
async cancel(scheduleName) {
|
|
87
95
|
const client = await this.getClient();
|
|
96
|
+
const { DeleteScheduleCommand } = await loadScheduler();
|
|
88
97
|
const command = new DeleteScheduleCommand({
|
|
89
98
|
Name: scheduleName,
|
|
90
99
|
GroupName: this.config.scheduleGroupName ?? 'default',
|
|
@@ -96,6 +105,7 @@ export class EventBridgeSchedulerDriver {
|
|
|
96
105
|
* Call this when you're done using the driver to prevent memory leaks.
|
|
97
106
|
*/
|
|
98
107
|
async dispose() {
|
|
108
|
+
this.disposed = true;
|
|
99
109
|
if (this.client) {
|
|
100
110
|
this.client.destroy();
|
|
101
111
|
this.client = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbridge-scheduler-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/eventbridge-scheduler-driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eventbridge-scheduler-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/eventbridge-scheduler-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,10 @@ export interface MockQueueDriverConfig {
|
|
|
28
28
|
* Resolver to get DI services for job execution.
|
|
29
29
|
* Called when a job is executed, returning the services container.
|
|
30
30
|
* Required when executeImmediately is true.
|
|
31
|
+
*
|
|
32
|
+
* When it returns a module's injected services (the cradle a factory receives), a job
|
|
33
|
+
* declared in a module's `jobs` runs in a new scope of that module, like in the worker.
|
|
34
|
+
* Other jobs, and plain objects, use the returned services as-is.
|
|
31
35
|
*/
|
|
32
36
|
serviceResolver?: () => Record<string, unknown>;
|
|
33
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mock-driver.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAc,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGhG,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC;IAEvB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAgC;IACjE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAM;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IAEjC,YAAY,MAAM,GAAE,qBAA0B,EAK7C;IAED;;OAEG;IACH,eAAe,CAAC,KAAK,QAAoC,GAAG,IAAI,CAE/D;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAIZ;IAED,IAAI,OAAO,IAAI,eAAe,GAAG,SAAS,CAEzC;IAEK,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAczD;IAED,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,oBAAoB;YAMd,kBAAkB;IAmChC,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,wBAAwB;IAO1B,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAOrE;IAEK,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAO5E;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { resolveJobServices } from '../../core/job-services.js';
|
|
1
2
|
import { createLogger } from '../../utils/logger.js';
|
|
2
3
|
import { runJobAttempt } from '../job-runner.js';
|
|
3
|
-
import { generateJobId } from '../utils.js';
|
|
4
|
+
import { generateJobId, toWirePayload } from '../utils.js';
|
|
4
5
|
/**
|
|
5
6
|
* In-memory queue driver for testing and local development.
|
|
6
7
|
*
|
|
@@ -85,7 +86,9 @@ export class MockQueueDriver {
|
|
|
85
86
|
this.warnMissingJobDefinition(message.jobName);
|
|
86
87
|
return;
|
|
87
88
|
}
|
|
88
|
-
const
|
|
89
|
+
const resolved = this.serviceResolver();
|
|
90
|
+
const owned = resolveJobServices(resolved, message.jobName);
|
|
91
|
+
const services = owned?.services ?? resolved;
|
|
89
92
|
const logger = this.resolveLogger(services);
|
|
90
93
|
const context = this.createJobContext({
|
|
91
94
|
services,
|
|
@@ -94,12 +97,16 @@ export class MockQueueDriver {
|
|
|
94
97
|
jobName: message.jobName,
|
|
95
98
|
});
|
|
96
99
|
try {
|
|
97
|
-
|
|
100
|
+
// Run with the payload a worker would receive after JSON transport.
|
|
101
|
+
await runJobAttempt(job, toWirePayload(message.payload), context);
|
|
98
102
|
}
|
|
99
103
|
catch (error) {
|
|
100
104
|
logger.error('Local job attempt failed', { jobId, jobName: message.jobName, error });
|
|
101
105
|
throw error;
|
|
102
106
|
}
|
|
107
|
+
finally {
|
|
108
|
+
await owned?.dispose();
|
|
109
|
+
}
|
|
103
110
|
}
|
|
104
111
|
resolveLogger(services) {
|
|
105
112
|
if (this.logger)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mock-driver.js","sourceRoot":"","sources":["../../../src/jobs/drivers/mock-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { SQSClient as SQSClientType } from '@aws-sdk/client-sqs';
|
|
2
2
|
import type { Duration, EnqueueResult, JobMessage, QueueDriver } from '../types.js';
|
|
3
3
|
import { type EventBridgeSchedulerConfig } from './eventbridge-scheduler-driver.js';
|
|
4
4
|
export interface SQSDriverConfig {
|