diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:01:11 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:02:09 +0200 |
commit | 363723fc84f7b8477592e0105aeb331ec9a017af (patch) | |
tree | 29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/set-getter/index.js | |
parent | 5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff) |
node_modules
Diffstat (limited to 'node_modules/set-getter/index.js')
-rw-r--r-- | node_modules/set-getter/index.js | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/node_modules/set-getter/index.js b/node_modules/set-getter/index.js new file mode 100644 index 000000000..ce9a6a0d4 --- /dev/null +++ b/node_modules/set-getter/index.js @@ -0,0 +1,83 @@ +/*! + * set-getter (https://github.com/doowb/set-getter) + * + * Copyright (c) 2016, Brian Woodward. + * Licensed under the MIT License. + */ + +'use strict'; + +var toPath = require('to-object-path'); + +/** + * Defines a getter function on an object using property path notation. + * + * ```js + * var obj = {}; + * getter(obj, 'foo', function() { + * return 'bar'; + * }); + * ``` + * @param {Object} `obj` Object to add property to. + * @param {String|Array} `prop` Property string or array to add. + * @param {Function} `getter` Getter function to add as a property. + * @api public + */ + +function setGetter(obj, prop, getter) { + var key = toPath(arguments); + return define(obj, key, getter); +} + +/** + * Define getter function on object or object hierarchy using dot notation. + * + * @param {Object} `obj` Object to define getter property on. + * @param {String} `prop` Property string to define. + * @param {Function} `getter` Getter function to define. + * @return {Object} Returns original object. + */ + +function define(obj, prop, getter) { + if (!~prop.indexOf('.')) { + defineProperty(obj, prop, getter); + return obj; + } + + var keys = prop.split('.'); + var last = keys.pop(); + var target = obj; + var key; + + while ((key = keys.shift())) { + while (key.slice(-1) === '\\') { + key = key.slice(0, -1) + '.' + keys.shift(); + } + target = target[key] || (target[key] = {}); + } + + defineProperty(target, last, getter); + return obj; +} + +/** + * Define getter function on object as a configurable and enumerable property. + * + * @param {Object} `obj` Object to define property on. + * @param {String} `prop` Property to define. + * @param {Function} `getter` Getter function to define. + */ + +function defineProperty(obj, prop, getter) { + Object.defineProperty(obj, prop, { + configurable: true, + enumerable: true, + get: getter + }); +} + +/** + * Expose `setGetter` + */ + +module.exports = setGetter; |