Skip to content

Commit

Permalink
fix uniform API
Browse files Browse the repository at this point in the history
  • Loading branch information
Eomm committed May 2, 2020
1 parent 6cb2308 commit 1e2b755
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 21 deletions.
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ npm install form-method
This module will transform your JSON to a payload ready to submit to an HTTP server!
The autosense feature will check if there is a `stream` or a `buffer` as input and it will act accordingly returning a `multipart/form-data` stream; otherwise it will create a `x-www-form-urlencoded` string.

The module return a JSON like this:

```js
{
payload: Stream, // the data Stream
headers: {} // a JSON with the `content-type` field set
}
```

### `x-www-form-urlencoded`

```js
Expand All @@ -27,8 +36,8 @@ const myForm = formMethod({
field2: ['value2', 'value2.2'] // array are supported too!!
})

myForm.getPayload() // return a string in application/x-www-form-urlencoded format
myForm.getHeaders() // return a JSON with the `content-type` field set
myForm.payload // Stream of the string in application/x-www-form-urlencoded format
myForm.headers // JSON with the `content-type` field set
```

### `multipart/form-data`
Expand All @@ -44,8 +53,8 @@ const myForm = formMethod({
wowBuffer: Buffer.from('a long string')
})

myForm.getPayload() // return a stream in multipart/form-data format
myForm.getHeaders() // return a JSON with the `content-type` field set
myForm.payload // Stream in multipart/form-data format
myForm.headers // JSON with the `content-type` field set to multipart/form-data
```


Expand Down
13 changes: 7 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const FormData = require('form-data')
const querystring = require('querystring')
const { Readable } = require('readable-stream') // to support node6

module.exports = function formMethod (json) {
if (!json || typeof json !== 'object') {
Expand All @@ -17,18 +18,18 @@ module.exports = function formMethod (json) {
}, false)

let payload
const header = { 'content-type': null }
const headers = { 'content-type': null }
if (hasFile) {
payload = form
Object.assign(header, form.getHeaders())
Object.assign(headers, form.getHeaders())
} else {
payload = querystring.stringify(json)
header['content-type'] = 'application/x-www-form-urlencoded'
payload = Readable.from(querystring.stringify(json))
headers['content-type'] = 'application/x-www-form-urlencoded'
}

return {
getPayload () { return payload },
getHeaders () { return header }
payload,
headers
}
}

Expand Down
7 changes: 6 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
"form-method",
"x-www-form-urlencoded",
"multipart",
"form-data"
"form-data",
"form-enctype",
"enctype"
],
"author": "Manuel Spigolon <[email protected]> (https://github.com/Eomm)",
"license": "MIT",
Expand All @@ -34,5 +36,8 @@
"multiparty": "^4.2.1",
"standard": "^14.3.3",
"tap": "^12.7.0"
},
"dependencies": {
"readable-stream": "^3.6.0"
}
}
28 changes: 18 additions & 10 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@ test('application/x-www-form-urlencoded', t => {
field2: 'value2'
})

t.deepEquals(form.getPayload(), 'field1=value1&field2=value2')
t.deepEquals(form.getHeaders(), { 'content-type': 'application/x-www-form-urlencoded' })
let payload = ''
form.payload.on('data', data => { payload += data })
form.payload.on('end', () => {
t.deepEquals(payload, 'field1=value1&field2=value2')
})
t.deepEquals(form.headers, { 'content-type': 'application/x-www-form-urlencoded' })
})

test('application/x-www-form-urlencoded array', t => {
Expand All @@ -33,8 +37,12 @@ test('application/x-www-form-urlencoded array', t => {
field2: 'value2'
})

t.deepEquals(form.getPayload(), 'field1=value1&field1=value3&field2=value2')
t.deepEquals(form.getHeaders(), { 'content-type': 'application/x-www-form-urlencoded' })
let payload = ''
form.payload.on('data', data => { payload += data })
form.payload.on('end', () => {
t.deepEquals(payload, 'field1=value1&field1=value3&field2=value2')
})
t.deepEquals(form.headers, { 'content-type': 'application/x-www-form-urlencoded' })
})

test('multipart/form-data', t => {
Expand All @@ -44,7 +52,7 @@ test('multipart/form-data', t => {
field2: fs.createReadStream('./LICENSE'),
field3: 'true'
})
t.ok(form.getHeaders()['content-type'].startsWith('multipart/form-data;'))
t.ok(form.headers['content-type'].startsWith('multipart/form-data;'))

const dispatch = function (req, res) {
const form = new multiparty.Form()
Expand All @@ -62,8 +70,8 @@ test('multipart/form-data', t => {
inject(dispatch, {
method: 'POST',
url: '/',
payload: form.getPayload(),
headers: form.getHeaders()
payload: form.payload,
headers: form.headers
}, (err, res) => {
t.error(err)
t.ok(res.headers['content-type'].startsWith('multipart/form-data;'))
Expand All @@ -75,7 +83,7 @@ test('multipart/form-data multiple file', t => {
const form = formMethod({
field1: [fs.createReadStream('./LICENSE'), fs.createReadStream('./LICENSE'), 'a string']
})
t.ok(form.getHeaders()['content-type'].startsWith('multipart/form-data;'))
t.ok(form.headers['content-type'].startsWith('multipart/form-data;'))

const dispatch = function (req, res) {
const form = new multiparty.Form()
Expand All @@ -92,8 +100,8 @@ test('multipart/form-data multiple file', t => {
inject(dispatch, {
method: 'POST',
url: '/',
payload: form.getPayload(),
headers: form.getHeaders()
payload: form.payload,
headers: form.headers
}, (err, res) => {
t.error(err)
t.ok(res.headers['content-type'].startsWith('multipart/form-data;'))
Expand Down

0 comments on commit 1e2b755

Please sign in to comment.