Переглянути джерело

uses lodash isEmpty internals

Jason Gorst 1 місяць тому
батько
коміт
de1c44469f
1 змінених файлів з 79 додано та 0 видалено
  1. 79 0
      app/utils/isEmptyable.js

+ 79 - 0
app/utils/isEmptyable.js

@@ -0,0 +1,79 @@
+// noinspection ES6ConvertVarToLetConst
+
+export default function isEmptyable(value) {
+  return !_isNil &&
+    (looksLikeArray(value) ||
+      looksLikeMap(value) ||
+      isPrototype(value) ||
+      isKeyedObject(value)
+    )
+
+  function looksLikeArray(value) {
+    return _isArrayLike(value) && (_isArray(value) || typeof value == "string" || typeof value.splice == "function" || _isBuffer(value) || _isTypedArray(value) || _isArguments(value))
+  }
+
+  function looksLikeMap(value) {
+    const tag = getTag(value)
+    const mapTag = "[object Map]"
+    const setTag = "[object Set]"
+
+    return (tag === mapTag) || (tag === setTag)
+  }
+
+  function isKeyedObject(value) {
+    return _isObject(value) && (_keys(value).length > 0)
+  }
+
+  // lodash internals
+  function isPrototype(value) {
+    const objectProto = Object.prototype
+    const Ctor = value && value.constructor
+    const proto = (typeof Ctor === "function" && Ctor.prototype) || objectProto
+
+    return value === proto
+  }
+
+  function getTag(value) {
+    const nullTag = "[object Null]"
+    const symToStringTag = Symbol ? Symbol.toStringTag : undefined
+    const undefinedTag = "[object Undefined]"
+    const objectProto = Object.prototype
+    const hasOwnProperty = objectProto.hasOwnProperty
+    const nativeObjectToString = objectProto.toString
+
+    if (value == null) {
+      return value === undefined ? undefinedTag : nullTag
+    }
+
+    return symToStringTag && symToStringTag in Object(value)
+      ? getRawTag(value)
+      : objectToString(value)
+
+    function getRawTag(value) {
+      const isOwn = hasOwnProperty.call(value, symToStringTag)
+      const tag = value[symToStringTag]
+
+      try {
+        value[symToStringTag] = undefined
+        var unmasked = true
+      } catch (e) {
+      }
+
+      const result = nativeObjectToString.call(value)
+
+      if (unmasked) {
+        if (isOwn) {
+          value[symToStringTag] = tag
+        } else {
+          delete value[symToStringTag]
+        }
+      }
+
+      return result
+    }
+
+    function objectToString(value) {
+      return nativeObjectToString.call(value)
+    }
+  }
+}