https://github.com/typeofweb/typesafe-hapi
Typechecking for HapiJS based on Joi schemas!
https://github.com/typeofweb/typesafe-hapi
hapi hapijs joi typescript
Last synced: 25 days ago
JSON representation
Typechecking for HapiJS based on Joi schemas!
- Host: GitHub
- URL: https://github.com/typeofweb/typesafe-hapi
- Owner: typeofweb
- License: mit
- Created: 2019-03-13T18:09:48.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2022-12-08T18:25:00.000Z (almost 3 years ago)
- Last Synced: 2024-12-29T03:03:12.798Z (9 months ago)
- Topics: hapi, hapijs, joi, typescript
- Language: TypeScript
- Homepage: https://typeofweb.com/
- Size: 214 KB
- Stars: 21
- Watchers: 6
- Forks: 1
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# typesafe-hapi
typesafe-hapi is a fork of [hapi](https://github.com/hapijs/hapi) which aims to improve typesafety. More precisely, this is a fork of [@types/hapi__hapi](https://www.npmjs.com/package/@types/hapi__hapi) because it has just redefined the essential APIs of hapi.
typesafe-hapi currently matches the API of hapi 18.3.x. It was tested with TypeScript 3.4.5.
## How it works
`typesafe-hapi` uses `typesafe-joi` to infer correct type from Joi schemas automatically. It uses possesed type information to typecheck:* request.query
* request.payload
* request.params
* response## Example
```ts
const payloadSchema = Joi.object({
user: Joi.object({
name: Joi.string().required(),
email: Joi.string().required(),
}).required(),
}).required();const querySchema = Joi.object({
search: Joi.string().optional().allow('', null),
}).required();const paramsSchema = Joi.object({
id: Joi.number().required()
}).required();const responseSchema = Joi.object({
id: Joi.number().required(),
name: Joi.string().required(),
email: Joi.string().required(),
search: Joi.string().optional().allow(null),
}).required();server.route({
method: 'POST',
path: '/:id',
options: {
validate: {
payload: payloadSchema,
query: querySchema,
params: paramsSchema,
},
response: {
schema: responseSchema,
},
},
handler(request) {
// type of `payload` is automatically inferred based on `options.validate.payload` schema
const payload = request.payload; // { user: { name: string; email: string; }; }
const query = request.query; // { search?: string | null | undefined; }
const params = request.params; // { id: number; }// return type is also typechecked based on `options.response.schema`
return {
id: params.id,
name: payload.user.name, // string
email: payload.user.email, // string
search: query.search, // string | null | undefined
};
},
});
```Neat, huh? See more examples in [index.test-d.ts](https://github.com/mmiszy/typesafe-hapi/blob/master/index.test-d.ts).
## Usage
Import and use hapi from `typesafe-hapi`:
```typescript
import * as Hapi from 'typesafe-hapi'
```In order to avoid any compatibility issues, and to be able to use existing packages and plugins easily, you should create an alias for `typesafe-hapi` and rename it to just `hapi`. In your `tsconfig.json`:
```json
{
"compilerOptions": {
// … other options
"paths": {
"hapi": ["node_modules/typesafe-hapi"],
"joi": ["node_modules/typesafe-joi"]
}
}
}
```