69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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;
 |