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()
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