glasswork 1.5.0 → 1.6.0
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 +54 -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/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
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { optionalDependency } from '../../utils/optional-dependency.js';
|
|
2
|
+
const loadNodemailer = optionalDependency('nodemailer', 'SmtpTransport', () => import('nodemailer'));
|
|
3
|
+
/**
|
|
4
|
+
* SMTP transport backed by Nodemailer, for SMTP relays and local mail catchers such as
|
|
5
|
+
* Mailpit. Requires the `nodemailer` package.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { SmtpTransport } from 'glasswork/email/smtp';
|
|
10
|
+
*
|
|
11
|
+
* const transport = new SmtpTransport({ host: 'localhost', port: 1025 });
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export class SmtpTransport {
|
|
15
|
+
name = 'smtp';
|
|
16
|
+
#options;
|
|
17
|
+
#transporter;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
if (!options.transporter && !options.host && !options.nodemailer) {
|
|
20
|
+
throw new Error('SmtpTransport needs a transporter, a host or nodemailer options');
|
|
21
|
+
}
|
|
22
|
+
this.#options = options;
|
|
23
|
+
}
|
|
24
|
+
async send(message) {
|
|
25
|
+
const transporter = await this.#getTransporter();
|
|
26
|
+
const info = await transporter.sendMail({
|
|
27
|
+
from: message.from,
|
|
28
|
+
to: message.to,
|
|
29
|
+
cc: message.cc,
|
|
30
|
+
bcc: message.bcc,
|
|
31
|
+
replyTo: message.replyTo,
|
|
32
|
+
subject: message.subject,
|
|
33
|
+
html: message.html,
|
|
34
|
+
text: message.text,
|
|
35
|
+
headers: message.headers,
|
|
36
|
+
attachments: message.attachments?.map((attachment) => ({
|
|
37
|
+
filename: attachment.filename,
|
|
38
|
+
content: attachment.content,
|
|
39
|
+
contentType: attachment.contentType,
|
|
40
|
+
contentDisposition: attachment.disposition,
|
|
41
|
+
cid: attachment.contentId,
|
|
42
|
+
})),
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
messageId: info.messageId ?? '',
|
|
46
|
+
success: (info.rejected?.length ?? 0) === 0,
|
|
47
|
+
metadata: { accepted: info.accepted, rejected: info.rejected, response: info.response },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Close a transporter this transport created. A transporter you passed in stays open. */
|
|
51
|
+
async close() {
|
|
52
|
+
const transporter = this.#transporter;
|
|
53
|
+
this.#transporter = undefined;
|
|
54
|
+
if (transporter)
|
|
55
|
+
(await transporter).close?.();
|
|
56
|
+
}
|
|
57
|
+
#getTransporter() {
|
|
58
|
+
if (this.#options.transporter)
|
|
59
|
+
return Promise.resolve(this.#options.transporter);
|
|
60
|
+
this.#transporter ??= loadNodemailer().then(({ createTransport }) => {
|
|
61
|
+
const { host, port, secure, auth, nodemailer } = this.#options;
|
|
62
|
+
return createTransport({ host, port, secure, auth, ...nodemailer });
|
|
63
|
+
});
|
|
64
|
+
return this.#transporter;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=smtp-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smtp-transport.js","sourceRoot":"","sources":["../../../src/email/transports/smtp-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,9 +13,15 @@ interface ExceptionTracker {
|
|
|
13
13
|
interface ExceptionTrackingConfig {
|
|
14
14
|
trackStatusCodes: (statusCode: number) => boolean;
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
/** What the error handler knows about a failed request, passed to `responseHandler`. */
|
|
17
|
+
export interface FormattedError {
|
|
18
|
+
/** Safe message for the response body. */
|
|
17
19
|
message: string;
|
|
18
20
|
statusCode: ContentfulStatusCode;
|
|
21
|
+
/** Stable machine-readable code, such as `not-found`. */
|
|
22
|
+
code: string;
|
|
23
|
+
/** The error that was thrown, for custom response handlers and logging. */
|
|
24
|
+
error: unknown;
|
|
19
25
|
}
|
|
20
26
|
interface ErrorHandlerOptions {
|
|
21
27
|
/** Injected logger for all error paths, including error handler failures. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAoC,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGlG;;GAEG;AACH,UAAU,gBAAgB;IACxB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACzE;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD;AAKD,
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAoC,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGlG;;GAEG;AACH,UAAU,gBAAgB;IACxB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACzE;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD;AAKD,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,oBAAoB,CAAC;IACjC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC3B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5F;;;OAGG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;OAGG;IACH,cAAc,CAAC,EAAE,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;CACpE;AA4ID;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAyDlF;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAuB,CAAC"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { HTTPException } from 'hono/http-exception';
|
|
2
2
|
import { createLogger, getDefaultLogLevel } from '../utils/logger.js';
|
|
3
|
-
import { DomainException, getStatusCodeFromErrorCode } from './errors.js';
|
|
3
|
+
import { DomainException, getErrorCodeForStatus, getStatusCodeFromErrorCode } from './errors.js';
|
|
4
4
|
/**
|
|
5
5
|
* Default response handler - returns JSON error
|
|
6
6
|
*/
|
|
7
7
|
function defaultResponseHandler(error, context) {
|
|
8
|
-
return context.json({
|
|
9
|
-
error: error.message,
|
|
10
|
-
}, error.statusCode);
|
|
8
|
+
return context.json({ error: error.message, code: error.code }, error.statusCode);
|
|
11
9
|
}
|
|
12
10
|
/**
|
|
13
11
|
* Track exception if configured and criteria are met.
|
|
@@ -46,6 +44,8 @@ function handleDomainException(err, context, logLevel, exceptionTracker, trackin
|
|
|
46
44
|
const error = {
|
|
47
45
|
message: err.message,
|
|
48
46
|
statusCode: statusCode,
|
|
47
|
+
code: err.errorCode,
|
|
48
|
+
error: err,
|
|
49
49
|
};
|
|
50
50
|
// Log 5xx errors with stack trace (if log level allows)
|
|
51
51
|
if (logLevel !== 'silent' && statusCode >= 500) {
|
|
@@ -64,6 +64,8 @@ function handleHTTPException(err, context, logLevel, exceptionTracker, trackingC
|
|
|
64
64
|
const error = {
|
|
65
65
|
message: err.message,
|
|
66
66
|
statusCode: err.status,
|
|
67
|
+
code: getErrorCodeForStatus(err.status),
|
|
68
|
+
error: err,
|
|
67
69
|
};
|
|
68
70
|
// Log 5xx HTTP errors (if log level allows)
|
|
69
71
|
if (logLevel !== 'silent' && err.status >= 500) {
|
|
@@ -84,7 +86,12 @@ function handleUnexpectedError(err, context, logLevel, exceptionTracker, trackin
|
|
|
84
86
|
trackException(normalizedError, 500, context, exceptionTracker, trackingConfig, {
|
|
85
87
|
unexpected: true,
|
|
86
88
|
});
|
|
87
|
-
return {
|
|
89
|
+
return {
|
|
90
|
+
message: 'Internal server error',
|
|
91
|
+
statusCode: 500,
|
|
92
|
+
code: 'internal-server-error',
|
|
93
|
+
error: err,
|
|
94
|
+
};
|
|
88
95
|
}
|
|
89
96
|
/**
|
|
90
97
|
* Create an error handler middleware for Hono
|
|
@@ -117,7 +124,12 @@ export function createErrorHandler(options = {}) {
|
|
|
117
124
|
// Error handler itself threw - log and return generic error
|
|
118
125
|
// Use error level logger for this critical error
|
|
119
126
|
logger.error('Error in error handler:', handlerErr);
|
|
120
|
-
error = {
|
|
127
|
+
error = {
|
|
128
|
+
message: 'Internal server error',
|
|
129
|
+
statusCode: 500,
|
|
130
|
+
code: 'internal-server-error',
|
|
131
|
+
error: handlerErr,
|
|
132
|
+
};
|
|
121
133
|
}
|
|
122
134
|
return responseHandler(error, context);
|
|
123
135
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAA8B,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,10 @@ import { type InferOutput } from 'valibot';
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
export declare const ErrorResponseDto: import("valibot").ObjectSchema<{
|
|
22
|
+
/** Human-readable message; may change between releases. */
|
|
22
23
|
readonly error: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 1000, undefined>]>;
|
|
24
|
+
/** Stable machine-readable code for clients to translate, such as `not-found`. */
|
|
25
|
+
readonly code: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 100, undefined>]>;
|
|
23
26
|
}, undefined>;
|
|
24
27
|
export type ErrorResponse = InferOutput<typeof ErrorResponseDto>;
|
|
25
28
|
/**
|
|
@@ -53,6 +56,7 @@ export type ValidationIssue = InferOutput<typeof ValidationIssueDto>;
|
|
|
53
56
|
* ```json
|
|
54
57
|
* {
|
|
55
58
|
* "error": "Validation failed",
|
|
59
|
+
* "code": "validation-failed",
|
|
56
60
|
* "issues": [
|
|
57
61
|
* {
|
|
58
62
|
* "message": "Invalid email",
|
|
@@ -64,6 +68,8 @@ export type ValidationIssue = InferOutput<typeof ValidationIssueDto>;
|
|
|
64
68
|
*/
|
|
65
69
|
export declare const ValidationErrorResponseDto: import("valibot").ObjectSchema<{
|
|
66
70
|
readonly error: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 1000, undefined>]>;
|
|
71
|
+
/** Always `validation-failed`. */
|
|
72
|
+
readonly code: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 100, undefined>]>;
|
|
67
73
|
readonly issues: import("valibot").SchemaWithPipe<readonly [import("valibot").ArraySchema<import("valibot").ObjectSchema<{
|
|
68
74
|
readonly message: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 500, undefined>]>;
|
|
69
75
|
readonly path: import("valibot").SchemaWithPipe<readonly [import("valibot").ArraySchema<import("valibot").UnionSchema<[import("valibot").StringSchema<undefined>, import("valibot").NumberSchema<undefined>], undefined>, undefined>, import("valibot").MaxLengthAction<(string | number)[], 20, undefined>]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-response.dto.d.ts","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,WAAW,EAAkD,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"error-response.dto.d.ts","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,WAAW,EAAkD,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,gBAAgB;IAC3B,2DAA2D;;IAE3D,kFAAkF;;aAElF,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;aAG7B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,0BAA0B;;IAErC,kCAAkC;;;;;;;;;aAGlC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
|
@@ -19,7 +19,10 @@ import { array, maxLength, number, object, pipe, string, union } from 'valibot';
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
export const ErrorResponseDto = object({
|
|
22
|
+
/** Human-readable message; may change between releases. */
|
|
22
23
|
error: pipe(string(), maxLength(1000)),
|
|
24
|
+
/** Stable machine-readable code for clients to translate, such as `not-found`. */
|
|
25
|
+
code: pipe(string(), maxLength(100)),
|
|
23
26
|
});
|
|
24
27
|
/**
|
|
25
28
|
* Validation issue - simplified version of Valibot's internal structure
|
|
@@ -51,6 +54,7 @@ export const ValidationIssueDto = object({
|
|
|
51
54
|
* ```json
|
|
52
55
|
* {
|
|
53
56
|
* "error": "Validation failed",
|
|
57
|
+
* "code": "validation-failed",
|
|
54
58
|
* "issues": [
|
|
55
59
|
* {
|
|
56
60
|
* "message": "Invalid email",
|
|
@@ -62,6 +66,8 @@ export const ValidationIssueDto = object({
|
|
|
62
66
|
*/
|
|
63
67
|
export const ValidationErrorResponseDto = object({
|
|
64
68
|
error: pipe(string(), maxLength(1000)),
|
|
69
|
+
/** Always `validation-failed`. */
|
|
70
|
+
code: pipe(string(), maxLength(100)),
|
|
65
71
|
issues: pipe(array(ValidationIssueDto), maxLength(100)),
|
|
66
72
|
});
|
|
67
73
|
//# sourceMappingURL=error-response.dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-response.dto.js","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAoB,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"error-response.dto.js","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAoB,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,2DAA2D;IAC3D,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,kFAAkF;IAClF,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACrC,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;CAC9D,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;IAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,kCAAkC;IAClC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACxD,CAAC,CAAC"}
|
package/dist/http/errors.d.ts
CHANGED
|
@@ -8,6 +8,12 @@ export interface DomainExceptionOptions {
|
|
|
8
8
|
* Set to true to force tracking, false to never track
|
|
9
9
|
*/
|
|
10
10
|
track?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Stable, machine-readable code for clients, returned as `code` in the error response.
|
|
13
|
+
* Defaults to the exception's category in kebab case, such as `not-found`. Clients
|
|
14
|
+
* translate codes; messages may change.
|
|
15
|
+
*/
|
|
16
|
+
errorCode?: string;
|
|
11
17
|
}
|
|
12
18
|
/**
|
|
13
19
|
* Base domain exception class for business logic errors.
|
|
@@ -33,8 +39,12 @@ export declare class DomainException extends Error {
|
|
|
33
39
|
* If set, overrides default tracking rules based on status codes.
|
|
34
40
|
*/
|
|
35
41
|
readonly track?: boolean;
|
|
42
|
+
/** Stable code for clients; see {@link DomainExceptionOptions.errorCode}. */
|
|
43
|
+
readonly errorCode: string;
|
|
36
44
|
constructor(message: string, code: string, options?: DomainExceptionOptions);
|
|
37
45
|
}
|
|
46
|
+
/** Turns an exception category such as `NOT_FOUND` into the default client code `not-found`. */
|
|
47
|
+
export declare function toErrorCode(category: string): string;
|
|
38
48
|
/**
|
|
39
49
|
* Standard HTTP exception classes
|
|
40
50
|
*/
|
|
@@ -102,4 +112,6 @@ export declare class GatewayTimeoutException extends DomainException {
|
|
|
102
112
|
* Map error codes to HTTP status codes
|
|
103
113
|
*/
|
|
104
114
|
export declare function getStatusCodeFromErrorCode(code: string): number;
|
|
115
|
+
/** Default client code for an HTTP status, such as `not-found` for 404. */
|
|
116
|
+
export declare function getErrorCodeForStatus(status: number): string;
|
|
105
117
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/http/errors.js
CHANGED
|
@@ -22,13 +22,20 @@ export class DomainException extends Error {
|
|
|
22
22
|
* If set, overrides default tracking rules based on status codes.
|
|
23
23
|
*/
|
|
24
24
|
track;
|
|
25
|
+
/** Stable code for clients; see {@link DomainExceptionOptions.errorCode}. */
|
|
26
|
+
errorCode;
|
|
25
27
|
constructor(message, code, options) {
|
|
26
28
|
super(message);
|
|
27
29
|
this.code = code;
|
|
28
30
|
this.name = this.constructor.name;
|
|
29
31
|
this.track = options?.track;
|
|
32
|
+
this.errorCode = options?.errorCode ?? toErrorCode(code);
|
|
30
33
|
}
|
|
31
34
|
}
|
|
35
|
+
/** Turns an exception category such as `NOT_FOUND` into the default client code `not-found`. */
|
|
36
|
+
export function toErrorCode(category) {
|
|
37
|
+
return category.toLowerCase().replaceAll('_', '-');
|
|
38
|
+
}
|
|
32
39
|
/**
|
|
33
40
|
* Standard HTTP exception classes
|
|
34
41
|
*/
|
|
@@ -132,32 +139,37 @@ export class GatewayTimeoutException extends DomainException {
|
|
|
132
139
|
super(message, 'GATEWAY_TIMEOUT', options);
|
|
133
140
|
}
|
|
134
141
|
}
|
|
142
|
+
const STATUS_BY_CATEGORY = {
|
|
143
|
+
BAD_REQUEST: 400,
|
|
144
|
+
UNAUTHORIZED: 401,
|
|
145
|
+
FORBIDDEN: 403,
|
|
146
|
+
NOT_FOUND: 404,
|
|
147
|
+
METHOD_NOT_ALLOWED: 405,
|
|
148
|
+
REQUEST_TIMEOUT: 408,
|
|
149
|
+
CONFLICT: 409,
|
|
150
|
+
GONE: 410,
|
|
151
|
+
PRECONDITION_FAILED: 412,
|
|
152
|
+
PAYLOAD_TOO_LARGE: 413,
|
|
153
|
+
UNSUPPORTED_MEDIA_TYPE: 415,
|
|
154
|
+
VALIDATION_ERROR: 422,
|
|
155
|
+
UNPROCESSABLE_ENTITY: 422,
|
|
156
|
+
LOCKED: 423,
|
|
157
|
+
TOO_MANY_REQUESTS: 429,
|
|
158
|
+
INTERNAL_SERVER_ERROR: 500,
|
|
159
|
+
NOT_IMPLEMENTED: 501,
|
|
160
|
+
BAD_GATEWAY: 502,
|
|
161
|
+
SERVICE_UNAVAILABLE: 503,
|
|
162
|
+
GATEWAY_TIMEOUT: 504,
|
|
163
|
+
};
|
|
135
164
|
/**
|
|
136
165
|
* Map error codes to HTTP status codes
|
|
137
166
|
*/
|
|
138
167
|
export function getStatusCodeFromErrorCode(code) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
REQUEST_TIMEOUT: 408,
|
|
146
|
-
CONFLICT: 409,
|
|
147
|
-
GONE: 410,
|
|
148
|
-
PRECONDITION_FAILED: 412,
|
|
149
|
-
PAYLOAD_TOO_LARGE: 413,
|
|
150
|
-
UNSUPPORTED_MEDIA_TYPE: 415,
|
|
151
|
-
VALIDATION_ERROR: 422,
|
|
152
|
-
UNPROCESSABLE_ENTITY: 422,
|
|
153
|
-
LOCKED: 423,
|
|
154
|
-
TOO_MANY_REQUESTS: 429,
|
|
155
|
-
INTERNAL_SERVER_ERROR: 500,
|
|
156
|
-
NOT_IMPLEMENTED: 501,
|
|
157
|
-
BAD_GATEWAY: 502,
|
|
158
|
-
SERVICE_UNAVAILABLE: 503,
|
|
159
|
-
GATEWAY_TIMEOUT: 504,
|
|
160
|
-
};
|
|
161
|
-
return codeMap[code] || 500;
|
|
168
|
+
return STATUS_BY_CATEGORY[code] || 500;
|
|
169
|
+
}
|
|
170
|
+
/** Default client code for an HTTP status, such as `not-found` for 404. */
|
|
171
|
+
export function getErrorCodeForStatus(status) {
|
|
172
|
+
const category = Object.entries(STATUS_BY_CATEGORY).find(([name, value]) => value === status && name !== 'VALIDATION_ERROR')?.[0];
|
|
173
|
+
return category ? toErrorCode(category) : `http-${status}`;
|
|
162
174
|
}
|
|
163
175
|
//# sourceMappingURL=errors.js.map
|
package/dist/http/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/http/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { Hono } from 'hono';
|
|
|
8
8
|
export type { OpenAPIV3 } from 'openapi-types';
|
|
9
9
|
export { createRateLimitMiddleware } from '../middleware/rate-limit.js';
|
|
10
10
|
export { defaultOpenAPIComponents } from '../openapi/defaults.js';
|
|
11
|
-
export { assertOpenAPIMatches, OpenAPIDriftError } from '../openapi/drift.js';
|
|
11
|
+
export { assertOpenAPIMatches, diffOpenAPI, type OpenAPIDifference, OpenAPIDriftError, writeOpenAPIDocument, } from '../openapi/drift.js';
|
|
12
12
|
export { configureOpenAPI } from '../openapi/openapi.js';
|
|
13
13
|
export { applyProcessors, createBuiltinProcessors, createCorsHeadersProcessor, createRateLimitHeadersProcessor, paginationHeadersProcessor, responseHeadersProcessor, } from '../openapi/openapi-processors.js';
|
|
14
14
|
export { createErrorHandler, defaultErrorHandler } from './error-handler.js';
|
package/dist/http/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,KAAK,aAAa,EAClB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,0BAA0B,EAC1B,KAAK,eAAe,EACpB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,KAAK,sBAAsB,EAC3B,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/http/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import '../hono-context.js';
|
|
|
6
6
|
export { Hono } from 'hono';
|
|
7
7
|
export { createRateLimitMiddleware } from '../middleware/rate-limit.js';
|
|
8
8
|
export { defaultOpenAPIComponents } from '../openapi/defaults.js';
|
|
9
|
-
export { assertOpenAPIMatches, OpenAPIDriftError } from '../openapi/drift.js';
|
|
9
|
+
export { assertOpenAPIMatches, diffOpenAPI, OpenAPIDriftError, writeOpenAPIDocument, } from '../openapi/drift.js';
|
|
10
10
|
export { configureOpenAPI } from '../openapi/openapi.js';
|
|
11
11
|
export { applyProcessors, createBuiltinProcessors, createCorsHeadersProcessor, createRateLimitHeadersProcessor, paginationHeadersProcessor, responseHeadersProcessor, } from '../openapi/openapi-processors.js';
|
|
12
12
|
export { createErrorHandler, defaultErrorHandler } from './error-handler.js';
|
package/dist/http/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAG5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAG5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,WAAW,EAEX,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAEf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -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"}
|