Jason Gorst преди 1 месец
родител
ревизия
b1dd1fef4a
променени са 1 файла, в които са добавени 57 реда и са изтрити 2 реда
  1. 57 2
      app/utils/isBlank.js

+ 57 - 2
app/utils/isBlank.js

@@ -1,3 +1,58 @@
-export default function isBlank(element) {
-  return _isNil(element) || _isEmpty(element)
+export default function isBlank(value) {
+  if (_isNil(value)) {
+    return true
+  }
+
+  switch (checkType(value)) {
+    case "string":
+      return value === ""
+    case "Array":
+      return value.length === 0
+    case "Set":
+    case "Map":
+      return value.size === 0
+    default:
+      return false
+  }
+
+  function checkType(value) {
+    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof
+    if (value === null) {
+      return "null"
+    }
+
+    const baseType = typeof value
+
+    // Primitive types
+    if (!["object", "function"].includes(baseType)) {
+      return baseType
+    }
+
+    // Symbol.toStringTag often specifies the "display name" of the
+    //   object's class. It's used in Object.prototype.toString().
+    const tag = value[Symbol.toStringTag]
+    if (typeof tag === "string") {
+      return tag
+    }
+
+    // If it's a function whose source code starts with the "class" keyword
+    if (
+      baseType === "function" &&
+      Function.prototype.toString.call(value)
+        .startsWith("class")
+    ) {
+      return "class"
+    }
+
+    // The name of the constructor; for example `Array`, `GeneratorFunction`,
+    //   `Number`, `String`, `Boolean` or `MyCustomClass`
+    const className = value.constructor.name
+    if (typeof className === "string" && className !== "") {
+      return className
+    }
+
+    // At this point there's no robust way to get the type of value,
+    //   so we use the base implementation.
+    return baseType
+  }
 }