1- import { hasOwnProperty , isArray , isFile } from './objects'
1+ import { isFile } from './objects'
22
3- const getKey = ( parent : any , property : any ) => ( parent ? parent + '[' + property + ']' : property )
43export function objectToFormData ( obj : any , formData = new FormData ( ) , parent = '' ) : FormData {
5- if ( obj === null || obj === 'undefined' || obj . length === 0 ) {
4+ if ( obj == null || ( Array . isArray ( obj ) && obj . length === 0 ) ) {
65 formData . append ( parent , obj )
76 } else {
8- for ( const property in obj ) {
9- if ( hasOwnProperty ( obj , property ) ) {
10- appendToFormData ( formData , getKey ( parent , property ) , obj [ property ] )
11- }
7+ const propertyMap = new Map ( Object . entries ( obj ) )
8+ for ( const [ property , value ] of propertyMap ) {
9+ const key = parent ? ` ${ parent } [ ${ property } ]` : property
10+ appendToFormData ( formData , key , value )
1211 }
1312 }
1413 return formData
@@ -19,37 +18,34 @@ function appendToFormData(formData: FormData, key: string, value: any) {
1918 if ( typeof value === 'boolean' ) return formData . append ( key , value ? '1' : '0' )
2019 if ( value === null ) return formData . append ( key , '' )
2120 if ( typeof value !== 'object' ) return formData . append ( key , value )
22- if ( isArray ( value ) && hasFilesDeep ( value ) ) {
21+ if ( Array . isArray ( value ) && hasFilesDeep ( value ) ) {
2322 for ( let i = 0 ; i < value . length ; i ++ ) {
2423 formData . append ( key + '[' + i + ']' , value [ i ] , value [ i ] . name )
2524 }
2625 return formData
2726 }
28- objectToFormData ( value , formData , key )
27+ if ( typeof value === 'object' ) return objectToFormData ( value , formData , key )
28+ throw new Error ( `Unexpected value type: ${ typeof value } ` )
2929}
3030export function hasFilesDeep ( obj : any ) : boolean {
3131 if ( obj === null ) return false
3232 if ( typeof obj === 'object' ) {
33- for ( const key in obj ) {
34- if ( isFile ( obj [ key ] ) ) return true
33+ const values = Object . values ( obj )
34+ for ( let i = 0 ; i < values . length ; i ++ ) {
35+ if ( isFile ( values [ i ] ) ) return true
3536 }
3637 }
37- if ( isArray ( obj ) ) {
38- let f = ''
39- for ( const key in obj ) {
40- if ( hasOwnProperty ( obj , key ) ) {
41- f = key
42- break
43- }
44- }
45- return hasFilesDeep ( obj [ f ] )
38+ if ( Array . isArray ( obj ) ) {
39+ const firstNonNullElement = obj . find ( ( el ) => el !== null )
40+ return firstNonNullElement ? hasFilesDeep ( firstNonNullElement ) : false
4641 }
4742 return isFile ( obj )
4843}
4944export function hasFiles ( form : any ) {
5045 for ( const prop in form ) {
51- const hasProp = hasOwnProperty ( form , prop ) || typeof window !== 'undefined'
52- if ( hasProp && hasFilesDeep ( form [ prop ] ) ) return true
46+ if ( Object . prototype . hasOwnProperty . call ( form , prop ) && hasFilesDeep ( form [ prop ] ) ) {
47+ return true
48+ }
5349 }
5450 return false
5551}
0 commit comments