1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- /*!
- * 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;
|