Source: functions/deepFreeze.ts

/**
 * deepFreeze
 * @param {any} target
 * @memberof module:functions
 * @function
 */
export const deepFreeze = (target: any): any | Error => {
  if (Object.isFrozen(target)) {
    return target;
  }

  if (!Array.isArray(target) && Object.getPrototypeOf(target) !== Object.getPrototypeOf({})) {
    if (Object.getPrototypeOf(target) !== Object.getPrototypeOf(Function)) {
      throw new Error('not allow types');
    }
  }

  Object.freeze(target);
  Object.keys(target).forEach(key => deepFreeze(target[key]));

  return target;
};