summaryrefslogtreecommitdiffstats
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.js68
1 files changed, 68 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 0000000..12b3efc
--- /dev/null
+++ b/node_modules/loader-utils/lib/parseQuery.js
@@ -0,0 +1,68 @@
+'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;