UNPKG

utils-deep-set

Version:
64 lines (55 loc) 1.59 kB
'use strict'; // MODULES // var isString = require( 'validate.io-string-primitive' ), isArray = require( 'validate.io-array' ), validate = require( './validate.js' ), defaults = require( './defaults.js' ), dset = require( './deepset.js' ); // FACTORY // /** * FUNCTION: factory( path[, opts] ) * Creates a reusable deep set factory. * * @param {String|Array} path - key path * @param {Object} [opts] - function options * @param {Boolean} [opts.create=false] - boolean indicating whether to create a path if the key path does not already exist * @param {String} [opts.sep='.'] - key path separator * @returns {Function} deep set factory */ function factory( path, options ) { var isStr = isString( path ), props, opts, err; if ( !isStr && !isArray( path ) ) { throw new TypeError( 'deepSet()::invalid input argument. Key path must be a string primitive or a key array. Value: `' + path + '`.' ); } opts = defaults(); if ( arguments.length > 1 ) { err = validate( opts, options ); if ( err ) { throw err; } } if ( isStr ) { props = path.split( opts.sep ); } else { props = path; } /** * FUNCTION: deepSet( obj, value ) * Deep sets a nested property. * * @param {Object|Array} obj - input object * @param {*} value - value to set * @returns {Boolean} boolean indicating if the property was successfully set */ return function deepSet( obj, value ) { if ( typeof obj !== 'object' || obj === null ) { return false; } return dset( obj, props, opts.create, value ); }; } // end FUNCTION factory() // EXPORTS // module.exports = factory;