diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:38:50 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:40:43 +0200 |
commit | 7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch) | |
tree | 6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/dot-prop/index.js | |
parent | 963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff) |
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/dot-prop/index.js')
-rw-r--r-- | node_modules/dot-prop/index.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/node_modules/dot-prop/index.js b/node_modules/dot-prop/index.js new file mode 100644 index 000000000..59a0e2264 --- /dev/null +++ b/node_modules/dot-prop/index.js @@ -0,0 +1,120 @@ +'use strict'; +const isObj = require('is-obj'); + +function getPathSegments(path) { + const pathArr = path.split('.'); + const parts = []; + + for (let i = 0; i < pathArr.length; i++) { + let p = pathArr[i]; + + while (p[p.length - 1] === '\\' && pathArr[i + 1] !== undefined) { + p = p.slice(0, -1) + '.'; + p += pathArr[++i]; + } + + parts.push(p); + } + + return parts; +} + +module.exports = { + get(obj, path, value) { + if (!isObj(obj) || typeof path !== 'string') { + return value === undefined ? obj : value; + } + + const pathArr = getPathSegments(path); + + for (let i = 0; i < pathArr.length; i++) { + if (!Object.prototype.propertyIsEnumerable.call(obj, pathArr[i])) { + return value; + } + + obj = obj[pathArr[i]]; + + if (obj === undefined || obj === null) { + // `obj` is either `undefined` or `null` so we want to stop the loop, and + // if this is not the last bit of the path, and + // if it did't return `undefined` + // it would return `null` if `obj` is `null` + // but we want `get({foo: null}, 'foo.bar')` to equal `undefined`, or the supplied value, not `null` + if (i !== pathArr.length - 1) { + return value; + } + + break; + } + } + + return obj; + }, + + set(obj, path, value) { + if (!isObj(obj) || typeof path !== 'string') { + return; + } + + const pathArr = getPathSegments(path); + + for (let i = 0; i < pathArr.length; i++) { + const p = pathArr[i]; + + if (!isObj(obj[p])) { + obj[p] = {}; + } + + if (i === pathArr.length - 1) { + obj[p] = value; + } + + obj = obj[p]; + } + }, + + delete(obj, path) { + if (!isObj(obj) || typeof path !== 'string') { + return; + } + + const pathArr = getPathSegments(path); + + for (let i = 0; i < pathArr.length; i++) { + const p = pathArr[i]; + + if (i === pathArr.length - 1) { + delete obj[p]; + return; + } + + obj = obj[p]; + + if (!isObj(obj)) { + return; + } + } + }, + + has(obj, path) { + if (!isObj(obj) || typeof path !== 'string') { + return false; + } + + const pathArr = getPathSegments(path); + + for (let i = 0; i < pathArr.length; i++) { + if (isObj(obj)) { + if (!(pathArr[i] in obj)) { + return false; + } + + obj = obj[pathArr[i]]; + } else { + return false; + } + } + + return true; + } +}; |