Skip to content

Commit 766d4c1

Browse files
committed
feat!: add AdditionalRequest
1 parent a2a737f commit 766d4c1

File tree

49 files changed

+321
-253
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+321
-253
lines changed

README.md

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,60 @@ Benchmarks taken using https://github.com/frouriojs/benchmarks. This is a
6767
synthetic, "hello world" benchmark that aims to evaluate the framework
6868
overhead.
6969

70+
## Breaking change (2020/10/19) :warning:
71+
72+
Since frourio-express >= `0.18.0`, the way to add user properties to the request object has changed.
73+
74+
`server/api/user/hooks.ts`
75+
76+
```ts
77+
import passport from 'passport'
78+
import { defineHooks } from './$relay'
79+
import { getUserIdByToken } from '$/service/user'
80+
81+
// < 0.18.0
82+
// export type User = {
83+
// id: string
84+
// }
85+
86+
// >= 0.18.0
87+
export type AdditionalRequest = {
88+
user: {
89+
id: string
90+
}
91+
}
92+
93+
passport.use(
94+
// eslint-disable-next-line
95+
new (require('passport-trusted-header').Strategy)(
96+
{ headers: ['token'] },
97+
// eslint-disable-next-line
98+
(headers: { token: string }, done: Function) => {
99+
done(null, getUserIdByToken(headers.token))
100+
}
101+
)
102+
)
103+
104+
export default defineHooks(() => ({
105+
onRequest: [
106+
passport.initialize(),
107+
passport.authenticate('trusted-header', { session: false })
108+
]
109+
}))
110+
```
111+
112+
`server/api/user/controller.ts`
113+
114+
```ts
115+
import { defineController } from './$relay'
116+
import { getUserNameById } from '$/service/user'
117+
118+
export default defineController(() => ({
119+
// user was added by AdditionalRequest of ./hooks.ts
120+
get: async ({ user }) => ({ status: 200, body: await getUserNameById(user.id) })
121+
}))
122+
```
123+
70124
## Table of Contents
71125

72126
- [Install](#Install)
@@ -397,9 +451,10 @@ import passport from 'passport'
397451
import { defineHooks } from './$relay' // '$relay.ts' is automatically generated by frourio-express
398452
import { getUserIdByToken } from '$/service/user'
399453

400-
// Export the User in hooks.ts to receive the user in controller.ts
401-
export type User = {
402-
id: string
454+
export type AdditionalRequest = {
455+
user: {
456+
id: string
457+
}
403458
}
404459

405460
passport.use(
@@ -428,6 +483,7 @@ import { defineController } from './$relay'
428483
import { getUserNameById } from '$/service/user'
429484

430485
export default defineController(() => ({
486+
// user was added by AdditionalRequest of ./hooks.ts
431487
get: async ({ user }) => ({ status: 200, body: await getUserNameById(user.id) })
432488
}))
433489
```

servers/all/$server.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { validateOrReject } from 'class-validator'
77
import * as Validators from './validators'
88
import hooksFn0 from './api/hooks'
99
import hooksFn1 from './api/users/hooks'
10+
import hooksFn2 from './api/users/_userId@number/_name/hooks'
1011
import controllerFn0, { hooks as ctrlHooksFn0 } from './api/controller'
1112
import controllerFn1 from './api/500/controller'
1213
import controllerFn2 from './api/empty/noEmpty/controller'
@@ -48,11 +49,6 @@ type ServerResponse<K extends AspidaMethodParams> =
4849
>)
4950
| PartiallyPartial<BaseResponse<any, any, HttpStatusNoOk>, 'body' | 'headers'>
5051

51-
type ServerValues = {
52-
params?: Record<string, any>
53-
user?: any
54-
}
55-
5652
type BlobToFile<T extends AspidaMethodParams> = T['reqFormat'] extends FormData
5753
? {
5854
[P in keyof T['reqBody']]: Required<T['reqBody']>[P] extends Blob
@@ -73,7 +69,7 @@ type RequestParams<T extends AspidaMethodParams> = Pick<{
7369
headers: Required<T>['reqHeaders'] extends {} | null ? 'headers' : never
7470
}['query' | 'body' | 'headers']>
7571

76-
export type ServerMethods<T extends AspidaMethods, U extends ServerValues> = {
72+
export type ServerMethods<T extends AspidaMethods, U extends Record<string, any> = {}> = {
7773
[K in keyof T]: (
7874
req: RequestParams<T[K]> & U
7975
) => ServerResponse<T[K]> | Promise<ServerResponse<T[K]>>
@@ -193,6 +189,7 @@ export default (app: Express, options: FrourioOptions = {}) => {
193189
const basePath = options.basePath ?? ''
194190
const hooks0 = hooksFn0(app)
195191
const hooks1 = hooksFn1(app)
192+
const hooks2 = hooksFn2(app)
196193
const ctrlHooks0 = ctrlHooksFn0(app)
197194
const ctrlHooks1 = ctrlHooksFn1(app)
198195
const controller0 = controllerFn0()
@@ -312,6 +309,7 @@ export default (app: Express, options: FrourioOptions = {}) => {
312309
app.get(`${basePath}/users/:userId/:name`, [
313310
...hooks0.onRequest,
314311
hooks1.onRequest,
312+
hooks2.onRequest,
315313
hooks0.preParsing,
316314
createTypedParamsHandler(['userId']),
317315
methodToHandler(controller9.get)

servers/all/api/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/500/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/empty/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/empty/noEmpty/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/multiForm/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/texts/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/texts/_label@string/$relay.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {
8-
params: {
9-
label: string
10-
}
11-
}>
12-
13-
export type Hooks = {
7+
type Hooks = {
148
onRequest?: RequestHandler | RequestHandler[]
159
preParsing?: RequestHandler | RequestHandler[]
1610
preValidation?: RequestHandler | RequestHandler[]
1711
preHandler?: RequestHandler | RequestHandler[]
1812
}
13+
type ControllerMethods = ServerMethods<Methods, {
14+
params: {
15+
label: string
16+
}
17+
}>
1918

2019
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
2120
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/texts/sample/$relay.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../../$server'
55
import { Methods } from './'
66

7-
type ControllerMethods = ServerMethods<Methods, {}>
8-
9-
export type Hooks = {
7+
type Hooks = {
108
onRequest?: RequestHandler | RequestHandler[]
119
preParsing?: RequestHandler | RequestHandler[]
1210
preValidation?: RequestHandler | RequestHandler[]
1311
preHandler?: RequestHandler | RequestHandler[]
1412
}
13+
type ControllerMethods = ServerMethods<Methods>
1514

1615
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
1716
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/users/$relay.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
import { Express, RequestHandler } from 'express'
33
import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../$server'
5-
import { User } from './hooks'
5+
import { AdditionalRequest as AdditionalRequest0 } from './hooks'
6+
import { AdditionalRequest as AdditionalRequest1 } from './controller'
67
import { Methods } from './'
78

8-
type ControllerMethods = ServerMethods<Methods, {
9-
user: User
10-
}>
11-
12-
export type Hooks = {
13-
onRequest?: RequestHandler | RequestHandler[]
14-
preParsing?: RequestHandler | RequestHandler[]
15-
preValidation?: RequestHandler | RequestHandler[]
16-
preHandler?: RequestHandler | RequestHandler[]
9+
type AdditionalRequest = AdditionalRequest0 & AdditionalRequest1
10+
type AddedRequestHandler = RequestHandler extends (req: infer U, ...args: infer V) => infer W ? (req: U & Partial<AdditionalRequest>, ...args: V) => W : never
11+
type Hooks = {
12+
onRequest?: AddedRequestHandler | AddedRequestHandler[]
13+
preParsing?: AddedRequestHandler | AddedRequestHandler[]
14+
preValidation?: AddedRequestHandler | AddedRequestHandler[]
15+
preHandler?: AddedRequestHandler | AddedRequestHandler[]
1716
}
17+
type ControllerMethods = ServerMethods<Methods, AdditionalRequest>
1818

1919
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
2020
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }

servers/all/api/users/_userId@number/$relay.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@
22
import { Express, RequestHandler } from 'express'
33
import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../../$server'
5-
import { User } from './../hooks'
5+
import { AdditionalRequest as AdditionalRequest0 } from '../hooks'
6+
import { AdditionalRequest as AdditionalRequest1 } from './controller'
67
import { Methods } from './'
78

8-
type ControllerMethods = ServerMethods<Methods, {
9-
user: User
9+
type AdditionalRequest = AdditionalRequest0 & AdditionalRequest1
10+
type AddedRequestHandler = RequestHandler extends (req: infer U, ...args: infer V) => infer W ? (req: U & Partial<AdditionalRequest>, ...args: V) => W : never
11+
type Hooks = {
12+
onRequest?: AddedRequestHandler | AddedRequestHandler[]
13+
preParsing?: AddedRequestHandler | AddedRequestHandler[]
14+
preValidation?: AddedRequestHandler | AddedRequestHandler[]
15+
preHandler?: AddedRequestHandler | AddedRequestHandler[]
16+
}
17+
type ControllerMethods = ServerMethods<Methods, AdditionalRequest & {
1018
params: {
1119
userId: number
1220
}
1321
}>
1422

15-
export type Hooks = {
16-
onRequest?: RequestHandler | RequestHandler[]
17-
preParsing?: RequestHandler | RequestHandler[]
18-
preValidation?: RequestHandler | RequestHandler[]
19-
preHandler?: RequestHandler | RequestHandler[]
20-
}
21-
2223
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
2324
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }
2425
export function defineHooks<T extends Record<string, any>>(hooks: (app: Express) => Hooks | T, cb?: (deps: Deps<T>, app: Express) => Hooks) {

servers/all/api/users/_userId@number/_name/$relay.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,25 @@
22
import { Express, RequestHandler } from 'express'
33
import { Deps, depend } from 'velona'
44
import { ServerMethods } from '../../../../$server'
5-
import { User } from './../../hooks'
5+
import { AdditionalRequest as AdditionalRequest0 } from '../../hooks'
6+
import { AdditionalRequest as AdditionalRequest1 } from './hooks'
67
import { Methods } from './'
78

8-
type ControllerMethods = ServerMethods<Methods, {
9-
user: User
9+
type AdditionalRequest = AdditionalRequest0 & AdditionalRequest1
10+
type AddedRequestHandler = RequestHandler extends (req: infer U, ...args: infer V) => infer W ? (req: U & Partial<AdditionalRequest>, ...args: V) => W : never
11+
type Hooks = {
12+
onRequest?: AddedRequestHandler | AddedRequestHandler[]
13+
preParsing?: AddedRequestHandler | AddedRequestHandler[]
14+
preValidation?: AddedRequestHandler | AddedRequestHandler[]
15+
preHandler?: AddedRequestHandler | AddedRequestHandler[]
16+
}
17+
type ControllerMethods = ServerMethods<Methods, AdditionalRequest & {
1018
params: {
1119
userId: number
1220
name: string
1321
}
1422
}>
1523

16-
export type Hooks = {
17-
onRequest?: RequestHandler | RequestHandler[]
18-
preParsing?: RequestHandler | RequestHandler[]
19-
preValidation?: RequestHandler | RequestHandler[]
20-
preHandler?: RequestHandler | RequestHandler[]
21-
}
22-
2324
export function defineHooks<T extends Hooks>(hooks: (app: Express) => T): (app: Express) => T
2425
export function defineHooks<T extends Record<string, any>, U extends Hooks>(deps: T, cb: (d: Deps<T>, app: Express) => U): { (app: Express): U; inject(d: Deps<T>): (app: Express) => U }
2526
export function defineHooks<T extends Record<string, any>>(hooks: (app: Express) => Hooks | T, cb?: (deps: Deps<T>, app: Express) => Hooks) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { defineHooks } from './$relay'
2+
3+
export type AdditionalRequest = {
4+
cookie?: string
5+
}
6+
7+
export default defineHooks(() => ({
8+
onRequest: (_req, _, done) => {
9+
done()
10+
}
11+
}))
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { defineController } from './$relay'
22

3+
export type AdditionalRequest = {
4+
name: string
5+
}
6+
37
export default defineController(() => ({
48
get: ({ params }) => ({ status: 200, body: { id: params.userId, name: 'bbb' } })
59
}))

0 commit comments

Comments
 (0)