@@ -67,17 +67,64 @@ export function arrayify (thing) {
67
67
return normalizeArray ( thing )
68
68
}
69
69
70
- export function fromJSOrdered ( js ) {
71
- if ( isImmutable ( js ) )
70
+ export function fromJSOrdered ( js ) {
71
+ if ( isImmutable ( js ) ) {
72
72
return js // Can't do much here
73
-
74
- if ( js instanceof win . File )
73
+ }
74
+ if ( js instanceof win . File ) {
75
+ return js
76
+ }
77
+ if ( ! isObject ( js ) ) {
75
78
return js
79
+ }
80
+ if ( Array . isArray ( js ) ) {
81
+ return Im . Seq ( js ) . map ( fromJSOrdered ) . toList ( )
82
+ }
83
+ if ( js . entries ) {
84
+ // handle multipart/form-data
85
+ const objWithHashedKeys = createObjWithHashedKeys ( js )
86
+ return Im . OrderedMap ( objWithHashedKeys ) . map ( fromJSOrdered )
87
+ }
88
+ return Im . OrderedMap ( js ) . map ( fromJSOrdered )
89
+ }
76
90
77
- return ! isObject ( js ) ? js :
78
- Array . isArray ( js ) ?
79
- Im . Seq ( js ) . map ( fromJSOrdered ) . toList ( ) :
80
- Im . OrderedMap ( js ) . map ( fromJSOrdered )
91
+ /**
92
+ * Convert a FormData object into plain object
93
+ * Append a hashIdx and counter to the key name, if multiple exists
94
+ * if single, key name = <original>
95
+ * if multiple, key name = <original><hashIdx><count>
96
+ * @param {FormData } fdObj - a FormData object
97
+ * @return {Object } - a plain object
98
+ */
99
+ export function createObjWithHashedKeys ( fdObj ) {
100
+ if ( ! fdObj . entries ) {
101
+ return fdObj // not a FormData object with iterable
102
+ }
103
+ const newObj = { }
104
+ const hashIdx = "_**[]" // our internal identifier
105
+ const trackKeys = { }
106
+ for ( let pair of fdObj . entries ( ) ) {
107
+ if ( ! newObj [ pair [ 0 ] ] && ! ( trackKeys [ pair [ 0 ] ] && trackKeys [ pair [ 0 ] ] . containsMultiple ) ) {
108
+ newObj [ pair [ 0 ] ] = pair [ 1 ] // first key name: no hash required
109
+ } else {
110
+ if ( ! trackKeys [ pair [ 0 ] ] ) {
111
+ // initiate tracking key for multiple
112
+ trackKeys [ pair [ 0 ] ] = {
113
+ containsMultiple : true ,
114
+ length : 1
115
+ }
116
+ // "reassign" first pair to matching hashed format for multiple
117
+ let hashedKeyFirst = `${ pair [ 0 ] } ${ hashIdx } ${ trackKeys [ pair [ 0 ] ] . length } `
118
+ newObj [ hashedKeyFirst ] = newObj [ pair [ 0 ] ]
119
+ // remove non-hashed key of multiple
120
+ delete newObj [ pair [ 0 ] ] // first
121
+ }
122
+ trackKeys [ pair [ 0 ] ] . length += 1
123
+ let hashedKeyCurrent = `${ pair [ 0 ] } ${ hashIdx } ${ trackKeys [ pair [ 0 ] ] . length } `
124
+ newObj [ hashedKeyCurrent ] = pair [ 1 ]
125
+ }
126
+ }
127
+ return newObj
81
128
}
82
129
83
130
export function bindToState ( obj , state ) {
0 commit comments