12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- "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;
|