Skip to content

Commit 6f0c483

Browse files
authored
Merge pull request #151 from supercharge/error-handler-switch-params
Error handler: switch error and ctx params
2 parents f977605 + 472ec44 commit 6f0c483

File tree

7 files changed

+47
-33
lines changed

7 files changed

+47
-33
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,20 @@
4747
- `@supercharge/http`
4848
- the `RequestHeaderBag` extends the `InputBag` which changes the behavior of the `has(key)` method: it returns `false` if the stored value is `undefined` and returns `true` otherwise
4949

50+
This pull request switches the parameters of the error report, handle, render method:
51+
- `@supercharge/core`
52+
- switch the parameters of the error’s and error handler’s `report`, `handle`, `render` methods:
53+
```ts
54+
// before
55+
handle(ctx: HttpContext, error: Error)
56+
report(ctx: HttpContext, error: Error)
57+
render(ctx: HttpContext, error: Error)
58+
59+
// now
60+
handle(error: Error, ctx: HttpContext)
61+
report(error: Error, ctx: HttpContext)
62+
render(error: Error, ctx: HttpContext)
63+
```
5064

5165

5266
## [3.20.4](https://github.com/supercharge/framework/compare/v3.20.3...v3.20.4) - 2023-10-15

packages/contracts/src/core/error-handler.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ export interface ErrorHandler {
1616
/**
1717
* Handle the given error.
1818
*/
19-
handle(ctx: HttpContext, error: Error): Promise<void>
19+
handle(error: Error, ctx: HttpContext): Promise<void>
2020

2121
/**
2222
* Report an error.
2323
*/
24-
report(context: HttpContext, error: Error): void | Promise<void>
24+
report(error: Error, ctx: HttpContext): void | Promise<void>
2525

2626
/**
2727
* Render an error into an HTTP response.
2828
*/
29-
render(context: HttpContext, error: Error): Promise<any>
29+
render(error: Error, ctx: HttpContext): Promise<any>
3030
}

packages/core/src/errors/handler.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class ErrorHandler implements ErrorHandlerContract {
1919
/**
2020
* Stores the list of report callbacks.
2121
*/
22-
protected readonly reportCallbacks: Array<(ctx: HttpContext, error: HttpError) => void | Promise<void>>
22+
protected readonly reportCallbacks: Array<(error: HttpError, ctx: HttpContext) => void | Promise<void>>
2323

2424
/**
2525
* Create a new error handler instance.
@@ -85,7 +85,7 @@ export class ErrorHandler implements ErrorHandlerContract {
8585
/**
8686
* Register a reportable callback.
8787
*/
88-
reportable (reportUsing: (ctx: HttpContext, error: any) => void | Promise<void>): ErrorHandler {
88+
reportable (reportUsing: (error: any, ctx: HttpContext) => void | Promise<void>): ErrorHandler {
8989
return tap(this, () => {
9090
this.reportCallbacks.push(reportUsing)
9191
})
@@ -112,25 +112,25 @@ export class ErrorHandler implements ErrorHandlerContract {
112112
/**
113113
* Handle the given error.
114114
*/
115-
async handle (ctx: HttpContext, error: any): Promise<void> {
116-
await this.report(ctx, error)
117-
await this.render(ctx, error)
115+
async handle (error: any, ctx: HttpContext): Promise<void> {
116+
await this.report(error, ctx)
117+
await this.render(error, ctx)
118118
}
119119

120120
/**
121121
* Report an error.
122122
*/
123-
async report (ctx: HttpContext, error: any): Promise<void> {
123+
async report (error: any, ctx: HttpContext): Promise<void> {
124124
if (this.shouldNotReport(error)) {
125125
return
126126
}
127127

128-
if (await this.errorReported(ctx, error)) {
128+
if (await this.errorReported(error, ctx)) {
129129
return
130130
}
131131

132132
const handled = await Collect(this.reportCallbacks).any(async reportCallback => {
133-
return await reportCallback(ctx, error)
133+
return await reportCallback(error, ctx)
134134
})
135135

136136
if (handled) {
@@ -147,54 +147,54 @@ export class ErrorHandler implements ErrorHandlerContract {
147147
}
148148

149149
/**
150-
* Determine whether the given `error` is implementing a `handle` method and
151-
* that `handle` method returns a truthy value, like a valid HTTP response.
150+
* Determine whether the given `error` is implementing a `report` method and
151+
* that `report` method returns a truthy value, like a valid HTTP response.
152152
*/
153-
async errorReported (ctx: HttpContext, error: any): Promise<unknown> {
153+
async errorReported (error: any, ctx: HttpContext): Promise<unknown> {
154154
if (typeof error.report !== 'function') {
155155
return false
156156
}
157157

158-
return await error.report(error, ctx)
158+
return !!(await error.report(error, ctx))
159159
}
160160

161161
/**
162162
* Render the error into an HTTP response.
163163
*/
164-
async render (ctx: HttpContext, error: any): Promise<any> {
165-
if (await this.errorRendered(ctx, error)) {
164+
async render (error: any, ctx: HttpContext): Promise<any> {
165+
if (await this.errorRendered(error, ctx)) {
166166
return
167167
}
168168

169169
const httpError = HttpError.wrap(error)
170170

171171
if (ctx.request.wantsJson()) {
172-
return this.renderJsonResponse(ctx, httpError)
172+
return this.renderJsonResponse(httpError, ctx)
173173
}
174174

175175
if (this.app.env().isProduction()) {
176-
return this.renderJsonResponse(ctx, httpError)
176+
return this.renderJsonResponse(httpError, ctx)
177177
}
178178

179-
return await this.renderViewResponse(ctx, httpError)
179+
return await this.renderViewResponse(httpError, ctx)
180180
}
181181

182182
/**
183183
* Determine whether the given `error` is implementing a `render` method and
184184
* that `render` method returns a truthy value, like a valid HTTP response.
185185
*/
186-
async errorRendered (ctx: HttpContext, error: any): Promise<unknown> {
186+
async errorRendered (error: any, ctx: HttpContext): Promise<unknown> {
187187
if (typeof error.render !== 'function') {
188188
return false
189189
}
190190

191-
return await error.render(ctx, error)
191+
return await error.render(error, ctx)
192192
}
193193

194194
/**
195195
* Creates a JSON response depending on the app’s environment.
196196
*/
197-
protected renderJsonResponse (ctx: HttpContext, error: HttpError): void {
197+
protected renderJsonResponse (error: HttpError, ctx: HttpContext): void {
198198
const { message, stack, status: statusCode } = error
199199

200200
this.app.env().isProduction()
@@ -205,7 +205,7 @@ export class ErrorHandler implements ErrorHandlerContract {
205205
/**
206206
* Creates an HTML response depending on the app’s environment.
207207
*/
208-
protected async renderViewResponse (ctx: HttpContext, error: HttpError): Promise<void> {
208+
protected async renderViewResponse (error: HttpError, ctx: HttpContext): Promise<void> {
209209
if (await this.isMissingTemplateFor(error)) {
210210
return await this.renderYouchResponse(ctx, error)
211211
}

packages/core/test/error-handler.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ test('calls report callbacks', async () => {
183183

184184
class CustomErrorHandler extends ErrorHandler {
185185
register () {
186-
this.reportable((_, error) => {
186+
this.reportable(error => {
187187
reportedError = error
188188
})
189189
}
@@ -215,7 +215,7 @@ test('report callbacks can stop the reportable chain', async () => {
215215
.reportable(() => {
216216
return true
217217
})
218-
.reportable((_ctx, error) => {
218+
.reportable(error => {
219219
reportedError = error
220220
})
221221
}
@@ -448,7 +448,7 @@ class ReportedError extends ReportingError {
448448
}
449449

450450
class RenderError extends Error {
451-
render (ctx, error) {
451+
render (error, ctx) {
452452
return ctx.response.payload({
453453
message: error.message,
454454
foo: 'bar',

packages/http/src/middleware/handle-error.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ export class HandleErrorMiddleware extends Middleware {
1010
try {
1111
await next()
1212
} catch (error: any) {
13-
await this.handleError(ctx, error)
13+
await this.handleError(error, ctx)
1414
}
1515
}
1616

1717
/**
1818
* Process the given `error` and HTTP `ctx` using the error handler.
1919
*/
20-
private async handleError (ctx: HttpContext, error: Error): Promise<void> {
20+
private async handleError (error: Error, ctx: HttpContext): Promise<void> {
2121
if (this.app.hasBinding('error.handler')) {
22-
return await this.app.make<ErrorHandler>('error.handler').handle(ctx, error)
22+
return await this.app.make<ErrorHandler>('error.handler').handle(error, ctx)
2323
}
2424

2525
throw error

packages/http/test/helpers/error-handler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
export default class ErrorHandler {
3-
handle (ctx, error) {
3+
handle (error, ctx) {
44
// console.log('Received error in testing error handler', { error })
55

66
ctx.response.status(error.status || error.statusCode || 500)

packages/session/test/helpers/error-handler.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import { ErrorHandler as Handler } from '@supercharge/core'
33

44
export default class ErrorHandler extends Handler {
5-
handle (ctx, error) {
5+
handle (error, ctx) {
66
// console.error('Received error in testing error handler', { error })
77

8-
return super.handle(ctx, error)
8+
return super.handle(error, ctx)
99
}
1010
}

0 commit comments

Comments
 (0)