Skip to content

Commit

Permalink
feat: Re-create the module with TypeScript (#152)
Browse files Browse the repository at this point in the history
* refactor: imporve the return type for shouldParseBodyAs method
* test: coverage 100%
* feat: support the already parsed body
* feat: prevent runtime problems
* feat: add patchNode option to support patching ctx.req.body
* feat: add parsedMethods option to parse only the passed ones
* feat: support extra value under the content-type + use async/await over done in testing
  • Loading branch information
3imed-jaberi committed Jun 25, 2023
1 parent 5678a79 commit b89581a
Show file tree
Hide file tree
Showing 21 changed files with 1,146 additions and 672 deletions.
25 changes: 25 additions & 0 deletions .github/workflows/ci.yml
@@ -0,0 +1,25 @@
name: Continuous Integration

on:
- push
- pull_request

jobs:
ci:
runs-on: ubuntu-latest
strategy:
matrix:
node-version:
- 16
- 18
- 20
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
- name: Install dependencies
run: yarn install
- name: Check linter
run: yarn lint
- name: Run tests
run: yarn test-ci
15 changes: 0 additions & 15 deletions .github/workflows/nodejs.yml

This file was deleted.

4 changes: 4 additions & 0 deletions .gitignore
Expand Up @@ -16,6 +16,10 @@ npm-debug.log
yarn-debug.log
yarn-error.log

# Build #
###################
dist
build

# NYC #
###################
Expand Down
1 change: 0 additions & 1 deletion .npmrc

This file was deleted.

22 changes: 22 additions & 0 deletions .xo-config.json
@@ -0,0 +1,22 @@
{
"prettier": true,
"space": true,
"extends": [
"xo-lass"
],
"rules": {
"node/no-deprecated-api": "off",
"no-unused-vars": "off",
"no-prototype-builtins": "off",
"prefer-rest-params": "off",
"n/prefer-global/process": "off",
"@typescript-eslint/restrict-template-expressions": "off",
"@typescript-eslint/naming-convention": "off",
"@typescript-eslint/prefer-nullish-coalescing": "off",
"unicorn/no-array-reduce": "off"
},
"ignores": [
"test/**",
"examples/**"
]
}
111 changes: 63 additions & 48 deletions README.md
@@ -1,41 +1,42 @@
# [**koa-bodyparser**](https://github.com/koajs/bodyparser)

# [**@koa/bodyparser**](https://github.com/koajs/bodyparser)

[![NPM version][npm-image]][npm-url]
[![build status][travis-image]][travis-url]
![build status][github-action-image]
[![Coveralls][coveralls-image]][coveralls-url]
[![David deps][david-image]][david-url]
[![node version][node-image]][node-url]

[npm-image]: https://img.shields.io/npm/v/koa-bodyparser.svg?style=flat-square
[npm-url]: https://npmjs.com/package/koa-bodyparser
[travis-image]: https://img.shields.io/travis/koajs/bodyparser.svg?style=flat-square
[travis-url]: https://travis-ci.org/koajs/bodyparser
[npm-image]: https://img.shields.io/npm/v/@koa/bodyparser.svg?style=flat-square
[npm-url]: https://www.npmjs.com/package/@koa/router
[github-action-image]: https://github.com/koajs/bodyparser/actions/workflows/ci.yml/badge.svg?style=flat-square
[coveralls-image]: https://img.shields.io/coveralls/koajs/bodyparser.svg?style=flat-square
[coveralls-url]: https://coveralls.io/r/koajs/bodyparser?branch=master
[david-image]: https://img.shields.io/david/koajs/bodyparser.svg?style=flat-square
[david-url]: https://david-dm.org/koajs/bodyparser
[node-image]: https://img.shields.io/badge/node.js-%3E=_8-green.svg?style=flat-square
[node-image]: https://img.shields.io/badge/node.js-%3E=_14-green.svg?style=flat-square
[node-url]: http://nodejs.org/download/

A body parser for koa, based on [co-body](https://github.com/tj/co-body). support `json`, `form` and `text` type body.
Koa body parsing middleware, based on [co-body](https://github.com/tj/co-body). support `json`, `form` and `text` type body.

Parse incoming request bodies in a middleware before your handlers, available under the `ctx.request.body` property.

> Notice: this module doesn't support parsing multipart format data, please use [`@koa/multer`](https://github.com/koajs/multer) to parse multipart format data.
> ⚠ Notice: **This module doesn't support parsing multipart format data**, please use [`@koa/multer`](https://github.com/koajs/multer) to parse multipart format data.
## Install

[![NPM](https://nodei.co/npm/koa-bodyparser.png?downloads=true)](https://nodei.co/npm/koa-bodyparser/)
[![NPM](https://nodei.co/npm/@koa/bodyparser.png?downloads=true)](https://nodei.co/npm/@koa/bodyparser)

```bash
$ npm i @koa/bodyparser
```

## Usage

```js
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const Koa = require("koa");
const bodyParser = require("@koa/bodyparser");

const app = new Koa();
app.use(bodyParser());

app.use(async ctx => {
app.use((ctx) => {
// the parsed body will store in ctx.request.body
// if nothing was parsed, body will be an empty object {}
ctx.body = ctx.request.body;
Expand All @@ -44,49 +45,61 @@ app.use(async ctx => {

## Options

* **enableTypes**: parser will only parse when request type hits enableTypes, support `json/form/text/xml`, default is `['json', 'form']`.
* **encoding**: requested encoding. Default is `utf-8` by `co-body`.
* **formLimit**: limit of the `urlencoded` body. If the body ends up being larger than this limit, a 413 error code is returned. Default is `56kb`.
* **jsonLimit**: limit of the `json` body. Default is `1mb`.
* **textLimit**: limit of the `text` body. Default is `1mb`.
* **xmlLimit**: limit of the `xml` body. Default is `1mb`.
* **strict**: when set to true, JSON parser will only accept arrays and objects. Default is `true`. See [strict mode](https://github.com/cojs/co-body#options) in `co-body`. In strict mode, `ctx.request.body` will always be an object(or array), this avoid lots of type judging. But text body will always return string type.
* **detectJSON**: custom json request detect function. Default is `null`.
- **patchNode**: patch request body to Node's `ctx.req`, default is `false`.
- **enableTypes**: parser will only parse when request type hits enableTypes, support `json/form/text/xml`, default is `['json', 'form']`.
- **encoding**: requested encoding. Default is `utf-8` by `co-body`.
- **formLimit**: limit of the `urlencoded` body. If the body ends up being larger than this limit, a 413 error code is returned. Default is `56kb`.
- **jsonLimit**: limit of the `json` body. Default is `1mb`.
- **textLimit**: limit of the `text` body. Default is `1mb`.
- **xmlLimit**: limit of the `xml` body. Default is `1mb`.
- **jsonStrict**: when set to true, JSON parser will only accept arrays and objects. Default is `true`. See [strict mode](https://github.com/cojs/co-body#options) in `co-body`. In strict mode, `ctx.request.body` will always be an object(or array), this avoid lots of type judging. But text body will always return string type.
- **detectJSON**: custom json request detect function. Default is `null`.

```js
app.use(bodyParser({
detectJSON: function (ctx) {
return /\.json$/i.test(ctx.path);
}
}));
app.use(
bodyParser({
detectJSON(ctx) {
return /\.json$/i.test(ctx.path);
},
})
);
```

* **extendTypes**: support extend types:
- **extendTypes**: support extend types:

```js
app.use(bodyParser({
extendTypes: {
json: ['application/x-javascript'] // will parse application/x-javascript type body as a JSON string
}
}));
app.use(
bodyParser({
extendTypes: {
// will parse application/x-javascript type body as a JSON string
json: ["application/x-javascript"],
},
})
);
```

* **onerror**: support custom error handle, if `koa-bodyparser` throw an error, you can customize the response like:
- **onError**: support custom error handle, if `koa-bodyparser` throw an error, you can customize the response like:

```js
app.use(bodyParser({
onerror: function (err, ctx) {
ctx.throw(422, 'body parse error');
}
}));
app.use(
bodyParser({
onError(err, ctx) {
ctx.throw(422, "body parse error");
},
})
);
```

* **disableBodyParser**: you can dynamic disable body parser by set `ctx.disableBodyParser = true`.
- **enableRawChecking**: support the already parsed body on the raw request by override and prioritize the parsed value over the sended payload. (default is `false`)

- **parsedMethods**: declares the HTTP methods where bodies will be parsed, default `['POST', 'PUT', 'PATCH']`.

- **disableBodyParser**: you can dynamic disable body parser by set `ctx.disableBodyParser = true`.

```js
app.use(async (ctx, next) => {
if (ctx.path === '/disable') ctx.disableBodyParser = true;
await next();
app.use((ctx, next) => {
if (ctx.path === "/disable") ctx.disableBodyParser = true;
return next();
});
app.use(bodyParser());
```
Expand All @@ -98,14 +111,16 @@ You can access raw request body by `ctx.request.rawBody` after `koa-bodyparser`
1. `koa-bodyparser` parsed the request body.
2. `ctx.request.rawBody` is not present before `koa-bodyparser`.

## Koa 1 Support
## Koa v1.x.x Support

To use `koa-bodyparser` with koa@1, please use [bodyparser 2.x](https://github.com/koajs/bodyparser/tree/2.x).
To use `koa-bodyparser` with koa@1.x.x, please use [bodyparser 2.x](https://github.com/koajs/bodyparser/tree/2.x).

```bash
npm install koa-bodyparser@2 --save
```

#### Licences

---

[MIT](LICENSE)
8 changes: 4 additions & 4 deletions example.js β†’ examples/cjs/index.example.cjs
@@ -1,16 +1,16 @@
const Koa = require('koa');
const bodyParser = require('.');
const bodyParser = require('../../dist').default;

const app = new Koa();
app.use(bodyParser());

app.use(async function() {
app.use((ctx) => {
// the parsed body will store in this.request.body
this.body = this.request.body;
ctx.body = ctx.request.body;
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () =>
console.log(`Server ready at http://localhost:${PORT} πŸš€ ..`)
console.log(`Server ready at http://localhost:${PORT} πŸš€ ..`),
);
14 changes: 14 additions & 0 deletions examples/esm/index.example.mjs
@@ -0,0 +1,14 @@
import Koa from 'koa';
import bodyParser from '../../dist/index.mjs';

const app = new Koa();
app.use(bodyParser());

app.use((ctx) => {
// the parsed body will store in this.request.body
ctx.body = ctx.request.body;
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => console.log(`Server ready at http://localhost:${PORT} πŸš€ ..`));
16 changes: 16 additions & 0 deletions examples/typescript/index.example.ts
@@ -0,0 +1,16 @@
import Koa from 'koa';
import {bodyParser} from '../../src';

const app = new Koa();
app.use(bodyParser());

app.use((ctx) => {
// the parsed body will store in this.request.body
ctx.body = ctx.request.body; // eslint-disable-line @typescript-eslint/no-unsafe-assignment
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
console.log(`Server ready at http://localhost:${PORT} πŸš€ ..`);
});

0 comments on commit b89581a

Please sign in to comment.