Skip to content

Commit

Permalink
Merge pull request #23 from marcbachmann/linting
Browse files Browse the repository at this point in the history
Lint files using javascript standard style
  • Loading branch information
marcbachmann committed Sep 29, 2015
2 parents 7e9d053 + 9a99231 commit cabb37d
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 122 deletions.
7 changes: 2 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
language: "node_js"
node_js:
- 0.6
- 0.8
- 0.10
- 0.11
- 0.12
- iojs-v1.0
- iojs-v2.0
- iojs
- 4.0
- node
84 changes: 41 additions & 43 deletions jsonpointer.js
Original file line number Diff line number Diff line change
@@ -1,99 +1,97 @@
var untilde = function(str) {
return str.replace(/~./g, function(m) {
var untilde = function (str) {
return str.replace(/~./g, function (m) {
switch (m) {
case "~0":
return "~";
case "~1":
return "/";
case '~0': return '~'
case '~1': return '/'
}
throw new Error("Invalid tilde escape: " + m);
});
throw new Error('Invalid tilde escape: ' + m)
})
}

var traverse = function(obj, pointer, value) {
var part = untilde(pointer.shift());
var isJustReading = arguments.length === 2;
var traverse = function (obj, pointer, value) {
var part = untilde(pointer.shift())
var isJustReading = arguments.length === 2

if (obj[part] == null) {
if (isJustReading) return null;
if (isJustReading) return null

// support setting of /-
if (part === '-' && obj instanceof Array) {
part = obj.length;
part = obj.length
}

// support nested objects/array when setting values
var nextPart = pointer[0];
var nextPart = pointer[0]
if (nextPart === '-' || !isNaN(nextPart)) {
obj[part] = [];
obj[part] = []
} else if (nextPart) {
obj[part] = {};
obj[part] = {}
}
}

// keep traversing
if (pointer.length !== 0) {
if (isJustReading) {
return traverse(obj[part], pointer);
return traverse(obj[part], pointer)
} else {
return traverse(obj[part], pointer, value);
return traverse(obj[part], pointer, value)
}
}

// we're done
if (isJustReading) {
return obj[part];
return obj[part]
}

// set new value, return old value
var oldValue = obj[part];
var oldValue = obj[part]
if (value === null) {
delete obj[part];
delete obj[part]
} else {
obj[part] = value;
obj[part] = value
}
return oldValue;
return oldValue
}

var compilePointer = function(pointer) {
if(pointer === "") {
return [];
var compilePointer = function (pointer) {
if (pointer === '') {
return []
}

if(!pointer) {
throw new Error("Invalid JSON pointer.");
if (!pointer) {
throw new Error('Invalid JSON pointer.')
}

if (!(pointer instanceof Array)) {
pointer = pointer.split("/");
if (pointer.shift() !== "") throw new Error("Invalid JSON pointer.")
pointer = pointer.split('/')
if (pointer.shift() !== '') throw new Error('Invalid JSON pointer.')
}

return pointer;
return pointer
}

var validate_input = function(obj, pointer) {
if(typeof obj !== "object") {
throw new Error("Invalid input object.");
var validateInput = function (obj, pointer) {
if (typeof obj !== 'object') {
throw new Error('Invalid input object.')
}

return compilePointer(pointer);
return compilePointer(pointer)
}

var get = function(obj, pointer) {
pointer = validate_input(obj, pointer);
var get = function (obj, pointer) {
pointer = validateInput(obj, pointer)
if (pointer.length === 0) {
return obj;
return obj
}
return traverse(obj, pointer);
return traverse(obj, pointer)
}

var set = function(obj, pointer, value) {
pointer = validate_input(obj, pointer);
var set = function (obj, pointer, value) {
pointer = validateInput(obj, pointer)
if (pointer.length === 0) {
throw new Error("Invalid JSON pointer for set.")
throw new Error('Invalid JSON pointer for set.')
}
return traverse(obj, pointer, value);
return traverse(obj, pointer, value)
}

exports.get = get
Expand Down
7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@
},
"main": "./jsonpointer",
"scripts": {
"test": "node test.js"
"test": "standard && node test.js"
},
"license": "MIT"
"license": "MIT",
"devDependencies": {
"standard": "^5.3.1"
}
}
144 changes: 72 additions & 72 deletions test.js
Original file line number Diff line number Diff line change
@@ -1,108 +1,108 @@
var assert = require('assert');
var jsonpointer = require('./jsonpointer');
var assert = require('assert')
var jsonpointer = require('./jsonpointer')

var obj = {
a: 1,
b: {
c: 2
},
d: {
e: [{a:3}, {b:4}, {c:5}]
e: [{ a: 3 }, { b: 4 }, { c: 5 }]
}
};
}

assert.equal(jsonpointer.get(obj, "/a"), 1);
assert.equal(jsonpointer.get(obj, "/b/c"), 2);
assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 3);
assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 4);
assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 5);
assert.equal(jsonpointer.get(obj, '/a'), 1)
assert.equal(jsonpointer.get(obj, '/b/c'), 2)
assert.equal(jsonpointer.get(obj, '/d/e/0/a'), 3)
assert.equal(jsonpointer.get(obj, '/d/e/1/b'), 4)
assert.equal(jsonpointer.get(obj, '/d/e/2/c'), 5)

// set returns old value
assert.equal(jsonpointer.set(obj, "/a", 2), 1);
assert.equal(jsonpointer.set(obj, "/b/c", 3), 2);
assert.equal(jsonpointer.set(obj, "/d/e/0/a", 4), 3);
assert.equal(jsonpointer.set(obj, "/d/e/1/b", 5), 4);
assert.equal(jsonpointer.set(obj, "/d/e/2/c", 6), 5);
assert.equal(jsonpointer.set(obj, '/a', 2), 1)
assert.equal(jsonpointer.set(obj, '/b/c', 3), 2)
assert.equal(jsonpointer.set(obj, '/d/e/0/a', 4), 3)
assert.equal(jsonpointer.set(obj, '/d/e/1/b', 5), 4)
assert.equal(jsonpointer.set(obj, '/d/e/2/c', 6), 5)

// set nested properties
assert.equal(jsonpointer.set(obj, "/f/g/h/i", 6), undefined);
assert.equal(jsonpointer.get(obj, "/f/g/h/i"), 6);
assert.equal(jsonpointer.set(obj, '/f/g/h/i', 6), undefined)
assert.equal(jsonpointer.get(obj, '/f/g/h/i'), 6)

// set an array
assert.equal(jsonpointer.set(obj, "/f/g/h/foo/-", 'test'), undefined);
arr = jsonpointer.get(obj, "/f/g/h/foo")
assert(Array.isArray(arr), 'set /- creates an array.');
assert.equal(arr[0], 'test');
assert.equal(jsonpointer.set(obj, '/f/g/h/foo/-', 'test'), undefined)
var arr = jsonpointer.get(obj, '/f/g/h/foo')
assert(Array.isArray(arr), 'set /- creates an array.')
assert.equal(arr[0], 'test')

assert.equal(jsonpointer.get(obj, "/a"), 2);
assert.equal(jsonpointer.get(obj, "/b/c"), 3);
assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 4);
assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 5);
assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 6);
assert.equal(jsonpointer.get(obj, '/a'), 2)
assert.equal(jsonpointer.get(obj, '/b/c'), 3)
assert.equal(jsonpointer.get(obj, '/d/e/0/a'), 4)
assert.equal(jsonpointer.get(obj, '/d/e/1/b'), 5)
assert.equal(jsonpointer.get(obj, '/d/e/2/c'), 6)

assert.equal(jsonpointer.get(obj, ""), obj);
assert.throws(function(){ jsonpointer.get(obj, "a"); }, validateError);
assert.throws(function(){ jsonpointer.get(obj, "a/"); }, validateError);
assert.equal(jsonpointer.get(obj, ''), obj)
assert.throws(function () { jsonpointer.get(obj, 'a') }, validateError)
assert.throws(function () { jsonpointer.get(obj, 'a/') }, validateError)

function validateError(err) {
if ( (err instanceof Error) && /Invalid JSON pointer/.test(err.message) ) {
return true;
function validateError (err) {
if ((err instanceof Error) && /Invalid JSON pointer/.test(err.message)) {
return true
}
}

var complexKeys = {
"a/b": {
'a/b': {
c: 1
},
d: {
"e/f": 2
'e/f': 2
},
"~1": 3,
"01": 4
'~1': 3,
'01': 4
}

assert.equal(jsonpointer.get(complexKeys, "/a~1b/c"), 1);
assert.equal(jsonpointer.get(complexKeys, "/d/e~1f"), 2);
assert.equal(jsonpointer.get(complexKeys, "/~01"), 3);
assert.equal(jsonpointer.get(complexKeys, "/01"), 4);
assert.equal(jsonpointer.get(complexKeys, "/a/b/c"), null);
assert.equal(jsonpointer.get(complexKeys, "/~1"), null);
assert.equal(jsonpointer.get(complexKeys, '/a~1b/c'), 1)
assert.equal(jsonpointer.get(complexKeys, '/d/e~1f'), 2)
assert.equal(jsonpointer.get(complexKeys, '/~01'), 3)
assert.equal(jsonpointer.get(complexKeys, '/01'), 4)
assert.equal(jsonpointer.get(complexKeys, '/a/b/c'), null)
assert.equal(jsonpointer.get(complexKeys, '/~1'), null)

// draft-ietf-appsawg-json-pointer-08 has special array rules
var ary = [ "zero", "one", "two" ];
assert.equal(jsonpointer.get(ary, "/01"), null);
var ary = [ 'zero', 'one', 'two' ]
assert.equal(jsonpointer.get(ary, '/01'), null)

assert.equal(jsonpointer.set(ary, "/-", "three"), null);
assert.equal(ary[3], "three");
assert.equal(jsonpointer.set(ary, '/-', 'three'), null)
assert.equal(ary[3], 'three')

// Examples from the draft:
var example = {
"foo": ["bar", "baz"],
"": 0,
"a/b": 1,
"c%d": 2,
"e^f": 3,
"g|h": 4,
"i\\j": 5,
"k\"l": 6,
" ": 7,
"m~n": 8
};
'foo': ['bar', 'baz'],
'': 0,
'a/b': 1,
'c%d': 2,
'e^f': 3,
'g|h': 4,
'i\\j': 5,
'k\'l': 6,
' ': 7,
'm~n': 8
}

assert.equal(jsonpointer.get(example, ""), example);
var ans = jsonpointer.get(example, "/foo");
assert.equal(ans.length, 2);
assert.equal(ans[0], "bar");
assert.equal(ans[1], "baz");
assert.equal(jsonpointer.get(example, "/foo/0"), "bar");
assert.equal(jsonpointer.get(example, "/"), 0);
assert.equal(jsonpointer.get(example, "/a~1b"), 1);
assert.equal(jsonpointer.get(example, "/c%d"), 2);
assert.equal(jsonpointer.get(example, "/e^f"), 3);
assert.equal(jsonpointer.get(example, "/g|h"), 4);
assert.equal(jsonpointer.get(example, "/i\\j"), 5);
assert.equal(jsonpointer.get(example, "/k\"l"), 6);
assert.equal(jsonpointer.get(example, "/ "), 7);
assert.equal(jsonpointer.get(example, "/m~0n"), 8);
assert.equal(jsonpointer.get(example, ''), example)
var ans = jsonpointer.get(example, '/foo')
assert.equal(ans.length, 2)
assert.equal(ans[0], 'bar')
assert.equal(ans[1], 'baz')
assert.equal(jsonpointer.get(example, '/foo/0'), 'bar')
assert.equal(jsonpointer.get(example, '/'), 0)
assert.equal(jsonpointer.get(example, '/a~1b'), 1)
assert.equal(jsonpointer.get(example, '/c%d'), 2)
assert.equal(jsonpointer.get(example, '/e^f'), 3)
assert.equal(jsonpointer.get(example, '/g|h'), 4)
assert.equal(jsonpointer.get(example, '/i\\j'), 5)
assert.equal(jsonpointer.get(example, '/k\'l'), 6)
assert.equal(jsonpointer.get(example, '/ '), 7)
assert.equal(jsonpointer.get(example, '/m~0n'), 8)

console.log("All tests pass.");
console.log('All tests pass.')

0 comments on commit cabb37d

Please sign in to comment.