empty.js

// const debug = require('debug')('empty')

/**
 * @module is
 * @author sanghak,Lee <code.ryan.lee@gmail.com>
 */

/**
 * @description Check if parameter is empty.
 * 
 * 'empty' means 
 *   - an empty string
 *   - an empty array
 *   - an empty object (**allow `new Proxy({}, {})`**)
 *   - null
 *   - undefined
 * @param {object} value parameter
 * @returns {boolean}
 * @example
 * const is = require('is-0')
 * is.empty('') // true
 * is.empty(1) // false
 */
const empty = (value) => {
	// debug('value', value)
	// debug('typeof value', typeof value)
	// debug('Object.keys(value).length', value && Object.keys(value).length)
	// debug('Object.getOwnPropertyNames()', value && Object.getOwnPropertyNames(value))
	// debug('value.constructor.name', value && value.constructor && value.constructor.name)

	if (value === null) return true
	if (typeof value === 'undefined') return true
	if (typeof value === 'string' && value === '') return true
	if (Array.isArray(value) && value.length < 1) return true
	if (typeof value === 'object' && value.constructor.name === 'Object' && Object.keys(value).length < 1 && Object.getOwnPropertyNames(value) < 1) return true

	if (typeof value === 'object' && value.constructor.name === 'String' && Object.keys(value).length < 1) return true // new String()

	// debug('isEmpty false')
	return false
}

module.exports = empty