diff --git a/README.md b/README.md index d223435..1700581 100644 --- a/README.md +++ b/README.md @@ -68,9 +68,21 @@ const options = { const formData = serialize( object, options, // optional - existingFormData, // optional - keyPrefix, // optional + existingFormData, // optional: allows you to send an existing FormData instance to be used + keyPrefix, // optional: prefix all keys with this value ); console.log(formData); ``` + +## Usage in Node.js + +```js +const FormData = require('form-data'); + +const object = { foo: [1, 2, 3] }; + +const formData = serialize(object, undefined, new FormData()); + +console.log(formData); +``` diff --git a/package-lock.json b/package-lock.json index b174b8f..28a3096 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "4.4.1", "license": "MIT", "devDependencies": { + "form-data": "^4.0.0", "jest": "^27.4.7", "prettier": "^2.5.1", "pretty-quick": "^3.1.3", @@ -1794,9 +1795,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -2871,6 +2872,20 @@ } } }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5500,9 +5515,9 @@ } }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -6323,6 +6338,19 @@ "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "jsesc": { diff --git a/package.json b/package.json index 1b25f65..f034009 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "testEnvironment": "jsdom" }, "devDependencies": { + "form-data": "^4.0.0", "jest": "^27.4.7", "prettier": "^2.5.1", "pretty-quick": "^3.1.3", diff --git a/src/index.js b/src/index.js index d3a9deb..7147c64 100644 --- a/src/index.js +++ b/src/index.js @@ -24,6 +24,7 @@ function isDate(value) { function isReactNativeBlob(value) { return ( + typeof FormData !== 'undefined' && typeof new FormData().getParts === 'function' && isObject(value) && !isUndefined(value.uri) @@ -54,7 +55,9 @@ function initCfg(value) { function serialize(obj, cfg, fd, pre) { cfg = cfg || {}; - fd = fd || new FormData(); + if (typeof FormData !== 'undefined' && !fd) { + fd = new FormData(); + } cfg.indices = initCfg(cfg.indices); cfg.nullsAsUndefineds = initCfg(cfg.nullsAsUndefineds); diff --git a/src/index.node.test.js b/src/index.node.test.js new file mode 100644 index 0000000..7bd2a4f --- /dev/null +++ b/src/index.node.test.js @@ -0,0 +1,26 @@ +/** + * @jest-environment node + */ + +const FormData = require('form-data'); + +const { serialize } = require('.'); + +const formDataAppend = FormData.prototype.append; + +beforeEach(() => { + FormData.prototype.append = jest.fn(formDataAppend); +}); + +test('works in nodejs', () => { + const formData = new FormData(); + serialize( + { + foo: 'bar', + }, + null, + formData, + ); + + expect(formData.append).toHaveBeenCalledWith('foo', 'bar'); +});