undefsafe
Advanced tools
Comparing version 1.0.0 to 1.1.0
'use strict'; | ||
function undefsafe(obj, path) { | ||
function undefsafe(obj, path, value) { | ||
var parts = path.split('.'); | ||
var key = null; | ||
var type = typeof obj; | ||
var parent = obj; | ||
@@ -16,2 +17,3 @@ // we're dealing with a primative | ||
while ((key = parts.shift())) { | ||
parent = obj; | ||
obj = obj[key]; | ||
@@ -27,2 +29,5 @@ if (obj === undefined || obj === null) { | ||
obj = undefined; | ||
} else if (value) { | ||
key = path.split('.').pop(); | ||
parent[key] = value; | ||
} | ||
@@ -35,2 +40,2 @@ | ||
module.exports = undefsafe; | ||
} | ||
} |
{ | ||
"name": "undefsafe", | ||
"version": "1.0.0", | ||
"description": "Undefined safe way of extracting object properties", | ||
@@ -11,7 +10,9 @@ "main": "lib/undefsafe.js", | ||
"scripts": { | ||
"test": "node_modules/mocha/bin/_mocha --ui bdd test/**/*.test.js" | ||
"test": "tap test/**/*.test.js -R spec", | ||
"cover": "tap test/*.test.js --cov --coverage-report=lcov", | ||
"semantic-release": "semantic-release pre && npm publish && semantic-release post" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/remy/undefsafe.git" | ||
"url": "https://github.com/remy/undefsafe.git" | ||
}, | ||
@@ -22,6 +23,8 @@ "keywords": [ | ||
"author": "Remy Sharp", | ||
"license": "MIT / http://rem.mit-license.org", | ||
"license": "MIT", | ||
"devDependencies": { | ||
"mocha": "~1.16.2" | ||
} | ||
} | ||
"semantic-release": "^4.3.5", | ||
"tap": "^5.7.1" | ||
}, | ||
"version": "1.1.0" | ||
} |
@@ -1,6 +0,7 @@ | ||
undefsafe | ||
========= | ||
# undefsafe | ||
Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined" | ||
Can also be used to safely set deep values. | ||
## Usage | ||
@@ -14,3 +15,3 @@ | ||
d: [1,2,3], | ||
e: false | ||
e: 'remy' | ||
} | ||
@@ -20,5 +21,22 @@ } | ||
console.log(undefsafe(object, 'a.b.e') === false); | ||
console.log(undefsafe(object, 'a.b.e')); // "remy" | ||
console.log(undefsafe(object, 'a.b.not.found')); // undefined | ||
``` | ||
Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console) | ||
## Setting | ||
```js | ||
var object = { | ||
a: { | ||
b: [1,2,3] | ||
} | ||
}; | ||
// modified object | ||
var res = undefsafe(object, 'a.b.0', 10); | ||
console.log(object); // { a: { b: [10, 2, 3] } } | ||
console.log(res); // 1 - previous value | ||
``` |
'use strict'; | ||
/*global describe:true, it: true */ | ||
var assert = require('assert'); | ||
var test = require('tap').test; | ||
var undefsafe = require('../lib/undefsafe'); | ||
describe('undefsafe', function () { | ||
it('should handle primatives', function () { | ||
var r = undefsafe(1, ''); | ||
assert(r === 1, 'undefsafe is 1: ' + r); | ||
}); | ||
test('should handle primatives', function (t) { | ||
var r = undefsafe(1, ''); | ||
t.equal(r, 1, 'undefsafe is 1: ' + r); | ||
t.end(); | ||
}); | ||
it('should handle empty objects', function () { | ||
var value = {}; | ||
var r; | ||
test('should handle empty objects', function (t) { | ||
var value = {}; | ||
var r; | ||
r = undefsafe(value, ''); | ||
assert(r === value, 'value is value' + r); | ||
r = undefsafe(value, ''); | ||
t.equal(r, value, 'value is value' + r); | ||
r = undefsafe(value, 'foo'); | ||
assert(r === undefined, 'value.foo is undefined: ' + r); | ||
r = undefsafe(value, 'foo'); | ||
t.equal(r, undefined, 'value.foo is undefined: ' + r); | ||
r = undefsafe(value, 'foo.bar'); | ||
assert(r === undefined, 'value.foo.bar is undefined: ' + r); | ||
}); | ||
r = undefsafe(value, 'foo.bar'); | ||
t.equal(r, undefined, 'value.foo.bar is undefined: ' + r); | ||
it('should handle null properties', function () { | ||
var value = { | ||
a: { | ||
b: null, | ||
}, | ||
}; | ||
var r; | ||
t.end(); | ||
}); | ||
r = undefsafe(value, 'a.b'); | ||
assert(r === null, 'value.a.b is null: ' + r); | ||
test('should handle null properties', function (t) { | ||
var value = { | ||
a: { | ||
b: null, | ||
}, | ||
}; | ||
var r; | ||
r = undefsafe(value, 'a.b.c'); | ||
assert(r === undefined, 'value.a.b.c is undefined: ' + r); | ||
}); | ||
r = undefsafe(value, 'a.b'); | ||
t.equal(r, null, 'value.a.b is null: ' + r); | ||
it('should find deep object properties', function () { | ||
var value = { | ||
a: { | ||
b: { | ||
c: { | ||
d: 10, | ||
e: { | ||
f: 20, | ||
}, | ||
g: true, | ||
h: false, | ||
i: undefined, | ||
j: null, | ||
r = undefsafe(value, 'a.b.c'); | ||
t.equal(r, undefined, 'value.a.b.c is undefined: ' + r); | ||
t.end(); | ||
}); | ||
test('should find deep object properties', function (t) { | ||
var value = { | ||
a: { | ||
b: { | ||
c: { | ||
d: 10, | ||
e: { | ||
f: 20, | ||
}, | ||
g: true, | ||
h: false, | ||
i: undefined, | ||
j: null, | ||
}, | ||
}, | ||
}; | ||
var r; | ||
}, | ||
}; | ||
var r; | ||
r = undefsafe(value, 'a'); | ||
assert(r === value.a, 'value.a: ' + r + ' ' + value.a); | ||
r = undefsafe(value, 'a'); | ||
t.equal(r, value.a, 'value.a: ' + r + ' ' + value.a); | ||
r = undefsafe(value, 'a.foo'); | ||
assert(r === undefined, 'value.a.foo is undefined: ' + r); | ||
r = undefsafe(value, 'a.foo'); | ||
t.equal(r, undefined, 'value.a.foo is undefined: ' + r); | ||
r = undefsafe(value, 'a.b.c.d'); | ||
assert(r === 10, 'value.a.b.c.d = 10'); | ||
r = undefsafe(value, 'a.b.c.d'); | ||
t.equal(r, 10, 'value.a.b.c.d = 10'); | ||
r = undefsafe(value, 'a.b.c.e'); | ||
assert(r === value.a.b.c.e, 'value.a.b.c.e = <object>'); | ||
r = undefsafe(value, 'a.b.c.e'); | ||
t.equal(r, value.a.b.c.e, 'value.a.b.c.e = <object>'); | ||
r = undefsafe(value, 'a.b.c.g'); | ||
assert(r === true, 'bool(true)'); | ||
r = undefsafe(value, 'a.b.c.g'); | ||
t.equal(r, true, 'bool(true)'); | ||
r = undefsafe(value, 'a.b.c.h'); | ||
assert(r === false, 'bool(false)'); | ||
r = undefsafe(value, 'a.b.c.h'); | ||
t.equal(r, false, 'bool(false)'); | ||
r = undefsafe(value, 'a.b.c.i'); | ||
assert(r === undefined, 'undefined'); | ||
r = undefsafe(value, 'a.b.c.i'); | ||
t.equal(r, undefined, 'undefined'); | ||
r = undefsafe(value, 'a.b.c.j'); | ||
assert(r === null, 'null'); | ||
}); | ||
}); | ||
r = undefsafe(value, 'a.b.c.j'); | ||
t.equal(r, null, 'null'); | ||
t.end(); | ||
}); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Copyleft License
License(Experimental) Copyleft license information was found
Found 1 instance in 1 package
No License Found
License(Experimental) License information could not be found
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found
Found 1 instance in 1 package
6907
11
0
191
41
2