Source: index.js

// classes
import CrioArray from './CrioArray';
import CrioObject from './CrioObject';

// is
import {isArray, isCrio, isObject} from './is';

/**
 * @module crio
 */

/**
 * @function crio
 *
 * @description
 * build a new crio object based on the object passed
 *
 * @param {*} [object={}] object to convert to crio
 *
 * @returns {CrioArray|CrioObject} object that has been crioed
 */
const crio = (object = {}) => {
  if (isCrio(object)) {
    return object;
  }

  if (isArray(object)) {
    return new CrioArray(object);
  }

  if (isObject(object)) {
    return new CrioObject(object);
  }

  throw new TypeError('Object passed must be either an array or a plain object.');
};

/**
 * @function crio.array
 *
 * @description
 * convenience method for making crio arrays
 *
 * @param {Array<*>} array array to crio
 * @returns {CrioArray} crio array
 */
crio.array = (array = []) => {
  if (!isArray(array)) {
    throw new TypeError('Object passed must be an array.');
  }

  return crio(array);
};

/**
 * @function crio.isArray
 *
 * @description
 * check if object is a crio array
 *
 * @param {*} object object to test
 * @returns {boolean} is the object a crio array
 */
crio.isArray = (object) => {
  return isCrio(object) && object.isArray();
};

crio.isCrio = isCrio;

/**
 * @function crio.isObject
 *
 * @description
 * check if object is a crio object
 *
 * @param {*} object object to test
 * @returns {boolean} is the object a crio object
 */
crio.isObject = (object) => {
  return isCrio(object) && object.isObject();
};

/**
 * @function crio.object
 *
 * @description
 * convenience method for making crio objects
 *
 * @param {Object} object object to crio
 * @returns {CrioObject} crio object
 */
crio.object = (object = {}) => {
  if (!isObject(object)) {
    throw new TypeError('Object passed must be a plain object.');
  }

  return crio(object);
};

export default crio;