prefix: string
handler?: (v: string) => string | number
multiple?: boolean
+ isBoolean?: boolean
}
}
type ParseQueryStringFilterResult = {
- [key: string]: string | number | (string | number)[]
+ [key: string]: string | number | boolean | (string | number | boolean)[]
}
@Injectable()
const value = object[name]
if (value === undefined || value === null) continue
- if (Array.isArray(value) && value.length !== 0) {
+ if (Array.isArray(value)) {
for (const v of value) params = params.append(name, v)
} else {
params = params.append(name, value)
parseQueryStringFilter (q: string, prefixes: QueryStringFilterPrefixes): ParseQueryStringFilterResult {
if (!q) return {}
- // Tokenize the strings using spaces
- const tokens = q.split(' ').filter(token => !!token)
+ // Tokenize the strings using spaces that are not in quotes
+ const tokens = q.match(/(?:[^\s"]+|"[^"]*")+/g)
+ .filter(token => !!token)
// Build prefix array
const prefixeStrings = Object.values(prefixes)
const matchedTokens = tokens.filter(t => t.startsWith(prefix))
.map(t => t.slice(prefix.length)) // Keep the value filter
+ .map(t => t.replace(/^"|"$/g, ''))
.map(t => {
if (prefixObj.handler) return prefixObj.handler(t)
return t
})
.filter(t => !!t || t === 0)
+ .map(t => prefixObj.isBoolean ? t === 'true' : t)
if (matchedTokens.length === 0) continue