Skip to content

Commit 0ecf51b

Browse files
committed
🎉 feat: responseValue
1 parent 5706380 commit 0ecf51b

File tree

8 files changed

+202
-57
lines changed

8 files changed

+202
-57
lines changed

example/a.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
import { Elysia, t } from '../src'
1+
import { Elysia, t } from 'elysia'
22

33
new Elysia()
44
.macro('auth', {
55
headers: t.Object({ authorization: t.String() }),
66
resolve: ({ status }) =>
7-
Math.random() > 0.5 ? { role: 'user' } : status(401, 'not authorized')
7+
Math.random() > 0.5 ? { role: 'user' } : status(400)
88
})
9-
.post('/', ({ role }) => role, {
9+
.post('/', ({ role }) => `Hello ${role}`, {
1010
auth: true,
11-
beforeHandle: ({ role }) => {}
11+
beforeHandle({ role, status }) {
12+
if (role !== 'admin') return status(401)
13+
}
1214
})

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "elysia",
33
"description": "Ergonomic Framework for Human",
4-
"version": "1.4.0-exp.17",
4+
"version": "1.4.0-exp.18",
55
"author": {
66
"name": "saltyAom",
77
"url": "https://github.com/SaltyAom",

src/compose.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ export const composeHandler = ({
697697
const isAsyncHandler = typeof handler === 'function' && isAsync(handler)
698698

699699
const saveResponse =
700-
hasTrace || hooks.afterResponse?.length ? 'c.response= ' : ''
700+
hasTrace || hooks.afterResponse?.length ? 'c.response=c.responseValue= ' : ''
701701

702702
const responseKeys = Object.keys(validator.response ?? {})
703703
const hasMultipleResponses = responseKeys.length > 1
@@ -1616,7 +1616,7 @@ export const composeHandler = ({
16161616
? `af=await e.afterHandle[${i}](c)\n`
16171617
: `af=e.afterHandle[${i}](c)\n`
16181618

1619-
fnLiteral += `if(af!==undefined) c.response=be=af\n`
1619+
fnLiteral += `if(af!==undefined) c.response=c.responseValue=be=af\n`
16201620
}
16211621

16221622
endUnit('af')
@@ -1633,7 +1633,7 @@ export const composeHandler = ({
16331633
})
16341634

16351635
if (hooks.mapResponse?.length) {
1636-
fnLiteral += `c.response=be\n`
1636+
fnLiteral += `c.response=c.responseValue=be\n`
16371637

16381638
for (let i = 0; i < hooks.mapResponse.length; i++) {
16391639
const mapResponse = hooks.mapResponse[i]
@@ -1645,7 +1645,7 @@ export const composeHandler = ({
16451645
fnLiteral +=
16461646
`if(mr===undefined){` +
16471647
`mr=${isAsyncName(mapResponse) ? 'await ' : ''}e.mapResponse[${i}](c)\n` +
1648-
`if(mr!==undefined)be=c.response=mr` +
1648+
`if(mr!==undefined)be=c.response=c.responseValue=mr` +
16491649
'}'
16501650

16511651
endUnit()
@@ -1672,8 +1672,8 @@ export const composeHandler = ({
16721672

16731673
if (hooks.afterHandle?.length)
16741674
fnLiteral += isAsyncHandler
1675-
? `let r=c.response=await ${handle}\n`
1676-
: `let r=c.response=${handle}\n`
1675+
? `let r=c.response=c.responseValue=await ${handle}\n`
1676+
: `let r=c.response=c.responseValue=${handle}\n`
16771677
else
16781678
fnLiteral += isAsyncHandler
16791679
? `let r=await ${handle}\n`
@@ -1710,12 +1710,12 @@ export const composeHandler = ({
17101710

17111711
fnLiteral += validation.response('af')
17121712

1713-
fnLiteral += `c.response=af}`
1713+
fnLiteral += `c.response=c.responseValue=af}`
17141714
} else {
17151715
fnLiteral += `if(af!==undefined){`
17161716
reporter.resolve()
17171717

1718-
fnLiteral += `c.response=af}`
1718+
fnLiteral += `c.response=c.responseValue=af}`
17191719
}
17201720
}
17211721
}
@@ -1744,7 +1744,7 @@ export const composeHandler = ({
17441744
`mr=${
17451745
isAsyncName(mapResponse) ? 'await ' : ''
17461746
}e.mapResponse[${i}](c)\n` +
1747-
`if(mr!==undefined)r=c.response=mr\n`
1747+
`if(mr!==undefined)r=c.response=c.responseValue=mr\n`
17481748

17491749
endUnit()
17501750
}
@@ -1771,7 +1771,7 @@ export const composeHandler = ({
17711771
})
17721772

17731773
if (hooks.mapResponse?.length) {
1774-
fnLiteral += '\nc.response=r\n'
1774+
fnLiteral += '\nc.response=c.responseValue=r\n'
17751775

17761776
for (let i = 0; i < hooks.mapResponse.length; i++) {
17771777
const mapResponse = hooks.mapResponse[i]
@@ -1783,7 +1783,7 @@ export const composeHandler = ({
17831783
fnLiteral +=
17841784
`\nif(mr===undefined){` +
17851785
`mr=${isAsyncName(mapResponse) ? 'await ' : ''}e.mapResponse[${i}](c)\n` +
1786-
`if(mr!==undefined)r=c.response=mr` +
1786+
`if(mr!==undefined)r=c.response=c.responseValue=mr` +
17871787
`}\n`
17881788

17891789
endUnit()
@@ -1820,7 +1820,7 @@ export const composeHandler = ({
18201820
total: hooks.mapResponse?.length
18211821
})
18221822
if (hooks.mapResponse?.length) {
1823-
fnLiteral += 'c.response= r\n'
1823+
fnLiteral += 'c.response=c.responseValue= r\n'
18241824

18251825
for (let i = 0; i < hooks.mapResponse.length; i++) {
18261826
const mapResponse = hooks.mapResponse[i]
@@ -1832,7 +1832,7 @@ export const composeHandler = ({
18321832
fnLiteral +=
18331833
`if(mr===undefined){` +
18341834
`mr=${isAsyncName(mapResponse) ? 'await ' : ''}e.mapResponse[${i}](c)\n` +
1835-
`if(mr!==undefined)r=c.response=mr` +
1835+
`if(mr!==undefined)r=c.response=c.responseValue=mr` +
18361836
`}`
18371837

18381838
endUnit()
@@ -1922,7 +1922,7 @@ export const composeHandler = ({
19221922
)
19231923

19241924
fnLiteral +=
1925-
`c.response=er\n` +
1925+
`c.response=c.responseValue=er\n` +
19261926
`mep=e.mapResponse[${i}](c)\n` +
19271927
`if(mep instanceof Promise)er=await er\n` +
19281928
`if(mep!==undefined)er=mep\n`
@@ -2526,7 +2526,7 @@ export const composeErrorHandler = (app: AnyElysia) => {
25262526
)
25272527

25282528
fnLiteral +=
2529-
`context.response=_r` +
2529+
`context.response=context.responseValue=_r` +
25302530
`_r=${isAsyncName(mapResponse) ? 'await ' : ''}onMapResponse[${i}](context)\n`
25312531

25322532
endUnit()
@@ -2554,7 +2554,7 @@ export const composeErrorHandler = (app: AnyElysia) => {
25542554
fnLiteral +=
25552555
`if(error instanceof Error){` +
25562556
afterResponse() +
2557-
`\nif(typeof error.toResponse==='function')return context.response=error.toResponse()\n` +
2557+
`\nif(typeof error.toResponse==='function')return context.response=context.responseValue=error.toResponse()\n` +
25582558
adapter.unknownError +
25592559
`\n}`
25602560

@@ -2564,7 +2564,7 @@ export const composeErrorHandler = (app: AnyElysia) => {
25642564
})
25652565

25662566
fnLiteral +=
2567-
'\nif(!context.response)context.response=error.message??error\n'
2567+
'\nif(!context.response)context.response=context.responseValue=error.message??error\n'
25682568

25692569
if (hooks.mapResponse?.length) {
25702570
fnLiteral += 'let mr\n'
@@ -2579,7 +2579,7 @@ export const composeErrorHandler = (app: AnyElysia) => {
25792579
fnLiteral +=
25802580
`if(mr===undefined){` +
25812581
`mr=${isAsyncName(mapResponse) ? 'await ' : ''}onMapResponse[${i}](context)\n` +
2582-
`if(mr!==undefined)error=context.response=mr` +
2582+
`if(mr!==undefined)error=context.response=context.responseValue=mr` +
25832583
'}'
25842584

25852585
endUnit()

src/context.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ export type ErrorContext<
103103
route: string
104104
request: Request
105105
store: Singleton['store']
106-
response: Route['response']
107106
} & Singleton['decorator'] &
108107
Singleton['derive'] &
109108
Singleton['resolve']

src/types.ts

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,12 @@ export type AfterHandler<
11991199
Path extends string | undefined = undefined
12001200
> = (
12011201
context: Context<Route, Singleton, Path> & {
1202+
responseValue: {} extends Route['response']
1203+
? unknown
1204+
: Route['response'][keyof Route['response']]
1205+
/**
1206+
* @deprecated use `context.responseValue` instead
1207+
*/
12021208
response: {} extends Route['response']
12031209
? unknown
12041210
: Route['response'][keyof Route['response']]
@@ -1222,17 +1228,17 @@ export type MapResponse<
12221228
},
12231229
Path extends string | undefined = undefined
12241230
> = (
1225-
context: Context<
1226-
Omit<Route, 'response'>,
1227-
Singleton & {
1228-
derive: {
1229-
response: {} extends Route['response']
1230-
? unknown
1231-
: Route['response']
1232-
}
1233-
},
1234-
Path
1235-
>
1231+
context: Context<Route, Singleton, Path> & {
1232+
responseValue: {} extends Route['response']
1233+
? unknown
1234+
: Route['response'][keyof Route['response']]
1235+
/**
1236+
* @deprecated use `context.responseValue` instead
1237+
*/
1238+
response: {} extends Route['response']
1239+
? unknown
1240+
: Route['response'][keyof Route['response']]
1241+
}
12361242
) => MaybePromise<Response | void>
12371243

12381244
// Handler<
@@ -1328,6 +1334,12 @@ export type AfterResponseHandler<
13281334
}
13291335
> = (
13301336
context: Context<Route, Singleton> & {
1337+
responseValue: {} extends Route['response']
1338+
? unknown
1339+
: Route['response'][keyof Route['response']]
1340+
/**
1341+
* @deprecated use `context.responseValue` instead
1342+
*/
13311343
response: {} extends Route['response']
13321344
? unknown
13331345
: Route['response'][keyof Route['response']]
@@ -1659,27 +1671,39 @@ export type LocalHook<
16591671
/**
16601672
* Transform context's value
16611673
*/
1662-
transform?: MaybeArray<TransformHandler<Schema, Singleton & { resolve: Schema['resolve'] }>>
1674+
transform?: MaybeArray<
1675+
TransformHandler<Schema, Singleton & { resolve: Schema['resolve'] }>
1676+
>
16631677
/**
16641678
* Execute before main handler
16651679
*/
1666-
beforeHandle?: MaybeArray<OptionalHandler<Schema, Singleton & { resolve: Schema['resolve'] }>>
1680+
beforeHandle?: MaybeArray<
1681+
OptionalHandler<Schema, Singleton & { resolve: Schema['resolve'] }>
1682+
>
16671683
/**
16681684
* Execute after main handler
16691685
*/
1670-
afterHandle?: MaybeArray<AfterHandler<Schema, Singleton & { resolve: Schema['resolve'] }>>
1686+
afterHandle?: MaybeArray<
1687+
AfterHandler<Schema, Singleton & { resolve: Schema['resolve'] }>
1688+
>
16711689
/**
16721690
* Execute after main handler
16731691
*/
1674-
mapResponse?: MaybeArray<MapResponse<Schema, Singleton & { resolve: Schema['resolve'] }>>
1692+
mapResponse?: MaybeArray<
1693+
MapResponse<Schema, Singleton & { resolve: Schema['resolve'] }>
1694+
>
16751695
/**
16761696
* Execute after response is sent
16771697
*/
1678-
afterResponse?: MaybeArray<AfterResponseHandler<Schema, Singleton & { resolve: Schema['resolve'] }>>
1698+
afterResponse?: MaybeArray<
1699+
AfterResponseHandler<Schema, Singleton & { resolve: Schema['resolve'] }>
1700+
>
16791701
/**
16801702
* Catch error
16811703
*/
1682-
error?: MaybeArray<ErrorHandler<Errors, Schema, Singleton & { resolve: Schema['resolve'] }>>
1704+
error?: MaybeArray<
1705+
ErrorHandler<Errors, Schema, Singleton & { resolve: Schema['resolve'] }>
1706+
>
16831707
tags?: DocumentDecoration['tags']
16841708
}
16851709

test/lifecycle/after-handle.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,24 @@ describe('After Handle', () => {
8888
const app = new Elysia().get('/', () => 'NOOP', {
8989
afterHandle({ response }) {
9090
return response
91+
},
92+
mapResponse() {
93+
94+
}
95+
})
96+
97+
const res = await app.handle(req('/')).then((x) => x.text())
98+
99+
expect(res).toBe('NOOP')
100+
})
101+
102+
it('accept responseValue', async () => {
103+
const app = new Elysia().get('/', () => 'NOOP', {
104+
afterHandle({ responseValue }) {
105+
return responseValue
106+
},
107+
mapResponse() {
108+
91109
}
92110
})
93111

0 commit comments

Comments
 (0)