| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | '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;
 |