summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js')
-rw-r--r--deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js129
1 files changed, 73 insertions, 56 deletions
diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
index 006f85ef3a..7cfaec0fbd 100644
--- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
+++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
@@ -1,76 +1,93 @@
-var untilde = function(str) {
- return str.replace(/~./g, function(m) {
- switch (m) {
- case "~0":
- return "~";
- case "~1":
- return "/";
- }
- throw new Error("Invalid tilde escape: " + m);
- });
+var hasExcape = /~/
+var escapeMatcher = /~[01]/g
+function escapeReplacer (m) {
+ switch (m) {
+ case '~1': return '/'
+ case '~0': return '~'
+ }
+ throw new Error('Invalid tilde escape: ' + m)
}
-var traverse = function(obj, pointer, value) {
- // assert(isArray(pointer))
- var part = untilde(pointer.shift());
- if(!obj.hasOwnProperty(part)) {
- return null;
- }
- if(pointer.length !== 0) { // keep traversin!
- return traverse(obj[part], pointer, value);
- }
- // we're done
- if(typeof value === "undefined") {
- // just reading
- return obj[part];
- }
- // set new value, return old value
- var old_value = obj[part];
- if(value === null) {
- delete obj[part];
- } else {
- obj[part] = value;
- }
- return old_value;
+function untilde (str) {
+ if (!hasExcape.test(str)) return str
+ return str.replace(escapeMatcher, escapeReplacer)
}
-var validate_input = function(obj, pointer) {
- if(typeof obj !== "object") {
- throw new Error("Invalid input object.");
- }
+function setter (obj, pointer, value) {
+ var part
+ var hasNextPart
- if(pointer === "") {
- return [];
- }
+ 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
+ }
- if(!pointer) {
- throw new Error("Invalid JSON pointer.");
+ // 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]
}
- pointer = pointer.split("/");
- var first = pointer.shift();
- if (first !== "") {
- throw new Error("Invalid JSON pointer.");
+ 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
}
- return pointer;
+ throw new Error('Invalid JSON pointer.')
}
-var get = function(obj, pointer) {
- pointer = validate_input(obj, pointer);
- if (pointer.length === 0) {
- return obj;
+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
}
- return traverse(obj, pointer);
}
-var set = function(obj, pointer, value) {
- pointer = validate_input(obj, pointer);
- if (pointer.length === 0) {
- throw new Error("Invalid JSON pointer for set.")
+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)
+ }
}
- return traverse(obj, pointer, value);
}
exports.get = get
exports.set = set
+exports.compile = compile