Skip to content

Commit ba15383

Browse files
committed
Make query: to accept a FormData or a URLSearchParams
1 parent 928a5fd commit ba15383

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ Adds additional headers to the request. `X-CSRF-Token` and `Content-Type` are a
8686

8787
Appends query parameters to the URL. Query params in the URL are preserved and merged with the query options.
8888

89+
Accepts `Object`, `FormData` or `URLSearchParams`.
90+
8991
##### responseKind
9092

9193
Specifies which response format will be accepted. Default is `html`.

src/fetch_request.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FetchResponse } from './fetch_response'
22
import { RequestInterceptor } from './request_interceptor'
3-
import { getCookie, compact, metaContent } from './lib/utils'
3+
import { getCookie, compact, metaContent, stringEntriesFromFormData, mergeEntries } from './lib/utils'
44

55
export class FetchRequest {
66
constructor (method, url, options = {}) {
@@ -18,6 +18,7 @@ export class FetchRequest {
1818
} catch (error) {
1919
console.error(error)
2020
}
21+
2122
const response = new FetchResponse(await window.fetch(this.url, this.fetchOptions))
2223

2324
if (response.unauthenticated && response.authenticationURL) {
@@ -97,12 +98,17 @@ export class FetchRequest {
9798
const originalQuery = (this.originalUrl.split('?')[1] || '').split('#')[0]
9899
const params = new URLSearchParams(originalQuery)
99100

100-
if (this.options.query) {
101-
for (const [key, value] of Object.entries(this.options.query)) {
102-
params.append(key, value)
103-
}
101+
let requestQuery = this.options.query
102+
if (requestQuery instanceof window.FormData) {
103+
requestQuery = stringEntriesFromFormData(requestQuery)
104+
} else if (requestQuery instanceof window.URLSearchParams) {
105+
requestQuery = requestQuery.entries()
106+
} else {
107+
requestQuery = Object.entries(requestQuery || {})
104108
}
105109

110+
mergeEntries(params, requestQuery)
111+
106112
const query = params.toString()
107113
return (query.length > 0 ? `?${query}` : '')
108114
}

src/lib/utils.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,22 @@ export function metaContent (name) {
2929
const element = document.head.querySelector(`meta[name="${name}"]`)
3030
return element && element.content
3131
}
32+
33+
export function stringEntriesFromFormData (formData) {
34+
return [...formData].reduce((entries, [name, value]) => {
35+
return entries.concat(typeof value === 'string' ? [[name, value]] : [])
36+
}, [])
37+
}
38+
39+
export function mergeEntries (searchParams, entries) {
40+
for (const [name, value] of entries) {
41+
if (value instanceof window.File) continue
42+
43+
if (searchParams.has(name)) {
44+
searchParams.delete(name)
45+
searchParams.set(name, value)
46+
} else {
47+
searchParams.append(name, value)
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)