Blame view

node_modules/jsonpointer/jsonpointer.js 2.21 KB
f7563de62   Palak Handa   first commit
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  var hasExcape = /~/
  var escapeMatcher = /~[01]/g
  function escapeReplacer (m) {
    switch (m) {
      case '~1': return '/'
      case '~0': return '~'
    }
    throw new Error('Invalid tilde escape: ' + m)
  }
  
  function untilde (str) {
    if (!hasExcape.test(str)) return str
    return str.replace(escapeMatcher, escapeReplacer)
  }
  
  function setter (obj, pointer, value) {
    var part
    var hasNextPart
  
    for (var p = 1, len = pointer.length; p < len;) {
      part = untilde(pointer[p++])
      hasNextPart = len > p
  
      if (typeof obj[part] === 'undefined') {
        // support setting of /-
        if (Array.isArray(obj) && part === '-') {
          part = obj.length
        }
  
        // support nested objects/array when setting values
        if (hasNextPart) {
          if ((pointer[p] !== '' && pointer[p] < Infinity) || pointer[p] === '-') obj[part] = []
          else obj[part] = {}
        }
      }
  
      if (!hasNextPart) break
      obj = obj[part]
    }
  
    var oldValue = obj[part]
    if (value === undefined) delete obj[part]
    else obj[part] = value
    return oldValue
  }
  
  function compilePointer (pointer) {
    if (typeof pointer === 'string') {
      pointer = pointer.split('/')
      if (pointer[0] === '') return pointer
      throw new Error('Invalid JSON pointer.')
    } else if (Array.isArray(pointer)) {
      return pointer
    }
  
    throw new Error('Invalid JSON pointer.')
  }
  
  function get (obj, pointer) {
    if (typeof obj !== 'object') throw new Error('Invalid input object.')
    pointer = compilePointer(pointer)
    var len = pointer.length
    if (len === 1) return obj
  
    for (var p = 1; p < len;) {
      obj = obj[untilde(pointer[p++])]
      if (len === p) return obj
      if (typeof obj !== 'object') return undefined
    }
  }
  
  function set (obj, pointer, value) {
    if (typeof obj !== 'object') throw new Error('Invalid input object.')
    pointer = compilePointer(pointer)
    if (pointer.length === 0) throw new Error('Invalid JSON pointer for set.')
    return setter(obj, pointer, value)
  }
  
  function compile (pointer) {
    var compiled = compilePointer(pointer)
    return {
      get: function (object) {
        return get(object, compiled)
      },
      set: function (object, value) {
        return set(object, compiled, value)
      }
    }
  }
  
  exports.get = get
  exports.set = set
  exports.compile = compile