diff options
Diffstat (limited to 'node_modules/loader-utils/lib/parseQuery.js')
-rw-r--r-- | node_modules/loader-utils/lib/parseQuery.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/node_modules/loader-utils/lib/parseQuery.js b/node_modules/loader-utils/lib/parseQuery.js new file mode 100644 index 000000000..5748cded8 --- /dev/null +++ b/node_modules/loader-utils/lib/parseQuery.js @@ -0,0 +1,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; |