You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					69 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					69 lines
				
				1.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 |