You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.5 KiB
69 lines
1.5 KiB
'use strict'; |
|
|
|
const JSON5 = require('json5'); |
|
|
|
const specialValues = { |
|
null: null, |
|
true: true, |
|
false: false, |
|
}; |
|
|
|
function parseQuery(query) { |
|
if (query.substr(0, 1) !== '?') { |
|
throw new Error( |
|
"A valid query string passed to parseQuery should begin with '?'" |
|
); |
|
} |
|
|
|
query = query.substr(1); |
|
|
|
if (!query) { |
|
return {}; |
|
} |
|
|
|
if (query.substr(0, 1) === '{' && query.substr(-1) === '}') { |
|
return JSON5.parse(query); |
|
} |
|
|
|
const queryArgs = query.split(/[,&]/g); |
|
const result = {}; |
|
|
|
queryArgs.forEach((arg) => { |
|
const idx = arg.indexOf('='); |
|
|
|
if (idx >= 0) { |
|
let name = arg.substr(0, idx); |
|
let value = decodeURIComponent(arg.substr(idx + 1)); |
|
|
|
// eslint-disable-next-line no-prototype-builtins |
|
if (specialValues.hasOwnProperty(value)) { |
|
value = specialValues[value]; |
|
} |
|
|
|
if (name.substr(-2) === '[]') { |
|
name = decodeURIComponent(name.substr(0, name.length - 2)); |
|
|
|
if (!Array.isArray(result[name])) { |
|
result[name] = []; |
|
} |
|
|
|
result[name].push(value); |
|
} else { |
|
name = decodeURIComponent(name); |
|
result[name] = value; |
|
} |
|
} else { |
|
if (arg.substr(0, 1) === '-') { |
|
result[decodeURIComponent(arg.substr(1))] = false; |
|
} else if (arg.substr(0, 1) === '+') { |
|
result[decodeURIComponent(arg.substr(1))] = true; |
|
} else { |
|
result[decodeURIComponent(arg)] = true; |
|
} |
|
} |
|
}); |
|
|
|
return result; |
|
} |
|
|
|
module.exports = parseQuery;
|
|
|