From 087fabdaeffd8e03ca85d9a90c8c9ca0b375b241 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Thu, 10 Feb 2022 15:47:50 +0800 Subject: [PATCH 1/2] support nodejs --- README.md | 12 ++++++++++++ package-lock.json | 40 ++++++++++++++++++++++++++++++++++------ package.json | 1 + src/index.js | 5 ++++- src/index.node.test.js | 26 ++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/index.node.test.js diff --git a/README.md b/README.md index d223435..1784071 100644 --- a/README.md +++ b/README.md @@ -74,3 +74,15 @@ const formData = serialize( 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'); +}); From 6656d8b23836930a992d999fa5e0e942fe906244 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Thu, 10 Feb 2022 15:48:01 +0800 Subject: [PATCH 2/2] improve readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1784071..1700581 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ 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);