"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)); 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;