source: frontend/node_modules/jsonpointer/jsonpointer.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 11 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 2.5 KB
Line 
1var hasExcape = /~/
2var escapeMatcher = /~[01]/g
3function escapeReplacer (m) {
4 switch (m) {
5 case '~1': return '/'
6 case '~0': return '~'
7 }
8 throw new Error('Invalid tilde escape: ' + m)
9}
10
11function untilde (str) {
12 if (!hasExcape.test(str)) return str
13 return str.replace(escapeMatcher, escapeReplacer)
14}
15
16function setter (obj, pointer, value) {
17 var part
18 var hasNextPart
19
20 for (var p = 1, len = pointer.length; p < len;) {
21 if (pointer[p] === 'constructor' || pointer[p] === 'prototype' || pointer[p] === '__proto__') return obj
22
23 part = untilde(pointer[p++])
24 hasNextPart = len > p
25
26 if (typeof obj[part] === 'undefined') {
27 // support setting of /-
28 if (Array.isArray(obj) && part === '-') {
29 part = obj.length
30 }
31
32 // support nested objects/array when setting values
33 if (hasNextPart) {
34 if ((pointer[p] !== '' && pointer[p] < Infinity) || pointer[p] === '-') obj[part] = []
35 else obj[part] = {}
36 }
37 }
38
39 if (!hasNextPart) break
40 obj = obj[part]
41 }
42
43 var oldValue = obj[part]
44 if (value === undefined) delete obj[part]
45 else obj[part] = value
46 return oldValue
47}
48
49function compilePointer (pointer) {
50 if (typeof pointer === 'string') {
51 pointer = pointer.split('/')
52 if (pointer[0] === '') return pointer
53 throw new Error('Invalid JSON pointer.')
54 } else if (Array.isArray(pointer)) {
55 for (const part of pointer) {
56 if (typeof part !== 'string' && typeof part !== 'number') {
57 throw new Error('Invalid JSON pointer. Must be of type string or number.')
58 }
59 }
60 return pointer
61 }
62
63 throw new Error('Invalid JSON pointer.')
64}
65
66function get (obj, pointer) {
67 if (typeof obj !== 'object') throw new Error('Invalid input object.')
68 pointer = compilePointer(pointer)
69 var len = pointer.length
70 if (len === 1) return obj
71
72 for (var p = 1; p < len;) {
73 obj = obj[untilde(pointer[p++])]
74 if (len === p) return obj
75 if (typeof obj !== 'object' || obj === null) return undefined
76 }
77}
78
79function set (obj, pointer, value) {
80 if (typeof obj !== 'object') throw new Error('Invalid input object.')
81 pointer = compilePointer(pointer)
82 if (pointer.length === 0) throw new Error('Invalid JSON pointer for set.')
83 return setter(obj, pointer, value)
84}
85
86function compile (pointer) {
87 var compiled = compilePointer(pointer)
88 return {
89 get: function (object) {
90 return get(object, compiled)
91 },
92 set: function (object, value) {
93 return set(object, compiled, value)
94 }
95 }
96}
97
98exports.get = get
99exports.set = set
100exports.compile = compile
Note: See TracBrowser for help on using the repository browser.