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