aboutsummaryrefslogtreecommitdiff
path: root/node_modules/loader-utils/lib/parseQuery.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/loader-utils/lib/parseQuery.js')
-rw-r--r--node_modules/loader-utils/lib/parseQuery.js54
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;