Source: assign.js

var hasOwnProperty = Object.prototype.hasOwnProperty;

/**
 * Same as <var>Object.assign</var>, but for ES5 environments.<br>
 *
 * <aside class='note'>
 *   <h3>A few things to consider</h3>
 *   <p>This is most likely to be removed in the future, if we
 *   decide to transpile our code and use the spread sintax instead.</p>
 *   <p>This will be used internally, instead of <var>Object.assign</var>,
 *   to prevent users from loading a polyfill. So, it's most likely
 *   that it will be included in your final bundle.</p>
 * </aside>
 *
 * @namespace
 * @memberof just
 * @param {object} target - What to apply the sources' properties to.
 * @param {?object} [...sources] - Objects containing the properties you want to apply.
 * @throws if <var>target</var> is null or not an object.
 * @returns {object} <var>target</var>.
 */
function assign (target/*, ...sources */) {

    'use strict'; // Make non writable properties throwable.

    var to, i, f, from, key;

    if (target === null || target === void 0) {

        throw new TypeError('can\'t convert ' + target + ' to object');

    }

    to = Object(target);

    for (i = 1, f = arguments.length; i < f; i++) {

        from = Object(arguments[i]);

        for (key in from) {

            if (hasOwnProperty.call(from, key)) {

                to[key] = from[key];

            }


        }

    }

    return to;

}

module.exports = assign;