Blame view

node_modules/loader-utils/lib/parseQuery.js 1.43 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
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
55
56
57
58
59
60
61
62
63
64
65
66
67
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;