export function isEmpty()

in packages/shared/src/isEmpty.ts [10:90]


export function isEmpty(val: any, strict = false): boolean {
  // Null and Undefined...
  if (val == null) {
    return true
  }

  // Booleans...
  if (typeof val === 'boolean') {
    return false
  }

  // Numbers...
  if (typeof val === 'number') {
    return false
  }

  // Strings...
  if (typeof val === 'string') {
    return val.length === 0
  }

  // Functions...
  if (typeof val === 'function') {
    return val.length === 0
  }

  // Arrays...
  if (Array.isArray(val)) {
    if (val.length === 0) {
      return true
    }
    for (let i = 0; i < val.length; i++) {
      if (strict) {
        if (val[i] !== undefined && val[i] !== null) {
          return false
        }
      } else {
        if (
          val[i] !== undefined &&
          val[i] !== null &&
          val[i] !== '' &&
          val[i] !== 0
        ) {
          return false
        }
      }
    }
    return true
  }

  // Errors...
  if (instOf(val, 'Error')) {
    return val.message === ''
  }

  // Objects...
  if (val.toString === toString) {
    switch (val.toString()) {
      // Maps, Sets, Files and Errors...
      case '[object File]':
      case '[object Map]':
      case '[object Set]': {
        return val.size === 0
      }

      // Plain objects...
      case '[object Object]': {
        for (const key in val) {
          if (has.call(val, key)) {
            return false
          }
        }

        return true
      }
    }
  }

  // Anything else...
  return false
}