mappersmith
Version:
It is a lightweight rest client for node.js and the browser
41 lines (34 loc) • 1.29 kB
text/typescript
import { REGEXP_CONTENT_TYPE_JSON } from '../response'
import type { Middleware } from './index'
export const CONTENT_TYPE_JSON = 'application/json;charset=utf-8'
const isJson = (contentType: string) => REGEXP_CONTENT_TYPE_JSON.test(contentType)
const alreadyEncoded = (body: unknown) => typeof body === 'string'
/**
* Automatically encode your objects into JSON
*
* Example:
* client.User.all({ body: { name: 'bob' } })
* // => body: {"name":"bob"}
* // => header: "Content-Type=application/json;charset=utf-8"
*/
export const EncodeJsonMiddleware: Middleware = () => ({
async prepareRequest(next) {
const request = await next()
try {
const body = request.body()
const contentType = request.header('content-type')
if (body) {
const shouldEncodeBody =
contentType == null ||
(typeof contentType === 'string' && isJson(contentType) && !alreadyEncoded(body))
const encodedBody = shouldEncodeBody ? JSON.stringify(body) : body
return request.enhance({
headers: { 'content-type': contentType == null ? CONTENT_TYPE_JSON : contentType },
body: encodedBody,
})
}
} catch (e) {} // eslint-disable-line no-empty
return request
},
})
export default EncodeJsonMiddleware