Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-create the module with TypeScript #152

Merged
merged 16 commits into from
Jun 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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} 🚀 ..`);
});