| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | 
							- '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));
 
-       // 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;
 
 
  |