Blame view

node_modules/loader-utils/lib/parseQuery.js 1.29 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  "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;