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.
|
|
'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 = Object.create(null);
queryArgs.forEach((arg) => { const idx = arg.indexOf('=');
if (idx >= 0) { let name = arg.substr(0, idx); let value = decodeURIComponent(arg.substr(idx + 1));
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;
|