{"version":3,"file":"index.cjs","names":[],"sources":["../../../../@mongez/supportive-is/src/index.ts"],"sourcesContent":["declare let window: any;\r\ndeclare let document: any;\r\n\r\n/**\r\n * Determine whether the given value is a number whatever if its data type is String or Number\r\n */\r\nexport function isNumeric(value: any): boolean {\r\n  return /^[+-]?\\d+(\\.\\d+)?([Ee][+-]?\\d+)?$/.test(String(value));\r\n}\r\n\r\n/**\r\n * Check if the given value is int\r\n */\r\nexport const isInt = (value: any): boolean =>\r\n  typeof value === \"number\" && Number.isInteger(value);\r\n\r\n/**\r\n * Check if the given value is float\r\n */\r\nexport const isFloat = (value: any): boolean =>\r\n  typeof value === \"number\" &&\r\n  Number.isFinite(value) &&\r\n  /^-?\\d+\\.\\d+$/.test(String(value));\r\n\r\n/**\r\n * Check if the given value is a regex\r\n */\r\nexport const isRegex = (value: any): boolean =>\r\n  Boolean(value) && value.constructor?.name === \"RegExp\";\r\n\r\n/**\r\n * Check if the given value is an object\r\n */\r\nexport const isObject = (value: any): boolean =>\r\n  Boolean(value) && typeof value === \"object\";\r\n\r\n/**\r\n * Check if the given value is a plain object\r\n */\r\nexport const isPlainObject = (value: any): boolean => {\r\n  if (!value || typeof value !== \"object\") return false;\r\n  const proto = Object.getPrototypeOf(value);\r\n  if (proto === null) return true;\r\n  return value.constructor?.name === \"Object\";\r\n};\r\n\r\n/**\r\n * Check if the given value is validId\r\n */\r\nexport const isValidId = (value: any) =>\r\n  Boolean(value && /^[A-Za-z]+[\\w\\-\\:\\.]*$/.test(String(value)));\r\n\r\n/**\r\n * Check if the given value is a form element\r\n */\r\nexport const isFormElement = (value: any) =>\r\n  typeof HTMLFormElement === \"undefined\"\r\n    ? false\r\n    : value instanceof HTMLFormElement;\r\n\r\n/**\r\n * Check if the given value is a form data\r\n */\r\nexport const isFormData = (value: any) => value instanceof FormData;\r\n\r\n/**\r\n * Check if the given value is iterable\r\n */\r\nexport const isIterable = (value: any): boolean =>\r\n  value !== null &&\r\n  value !== undefined &&\r\n  typeof (value as any)[Symbol.iterator] === \"function\";\r\n\r\n/**\r\n * Check if the given value is a scalar value\r\n */\r\nexport const isScalar = (value: any) =>\r\n  [\"string\", \"boolean\", \"number\", \"symbol\", \"bigint\"].includes(typeof value);\r\n\r\n/**\r\n * Check if the given value is a string\r\n */\r\nexport const isString = (value: any) => typeof value === \"string\";\r\n\r\n/**\r\n * Check if the given value is a pr value\r\n */\r\nexport const isPrimitive = (value: any) =>\r\n  [\"string\", \"boolean\", \"number\", \"bigint\"].includes(typeof value);\r\n\r\n/**\r\n * Check if the given value is a promise\r\n */\r\nexport const isPromise = (value: any): boolean =>\r\n  Boolean(value) && value instanceof Promise;\r\n\r\n/**\r\n * Check if the given value is a date\r\n */\r\nexport const isDate = (value: any): boolean =>\r\n  Boolean(value) && typeof value === \"object\" && value instanceof Date;\r\n\r\n/**\r\n * Check if the given value is a generator\r\n */\r\nexport const isGenerator = (value: any): boolean =>\r\n  Boolean(value) &&\r\n  typeof value === \"object\" &&\r\n  typeof (value as any).next === \"function\" &&\r\n  typeof (value as any)[Symbol.iterator] === \"function\" &&\r\n  (value as any)[Symbol.iterator]() === value;\r\n\r\n/**\r\n * Check if the given value is empty\r\n * Zero does not considered empty\r\n * Empty object is considered empty\r\n * Empty array is considered empty\r\n */\r\nexport const isEmpty = (value: any): boolean => {\r\n  if ([0, true, false].includes(value)) return false;\r\n\r\n  if ([\"\", null, undefined].includes(value)) return true;\r\n\r\n  // NaN: treat as non-empty (it is still a number value)\r\n  if (typeof value === \"number\" && Number.isNaN(value)) return false;\r\n\r\n  // Date instances: a constructed Date is not empty\r\n  if (value instanceof Date) return false;\r\n\r\n  // check for map and set\r\n  if (value instanceof Map || value instanceof Set) {\r\n    return value.size === 0;\r\n  }\r\n\r\n  // Plain objects (no Symbol.iterator) — compare by own-key count\r\n  if (\r\n    typeof value === \"object\" &&\r\n    !Array.isArray(value) &&\r\n    typeof value[Symbol.iterator] !== \"function\"\r\n  ) {\r\n    return Object.keys(value).length === 0;\r\n  }\r\n\r\n  if (isIterable(value)) {\r\n    return value.length === 0;\r\n  }\r\n\r\n  // this is used here for zero\r\n  if (isNumeric(value)) return false;\r\n\r\n  return true;\r\n};\r\n\r\n/**\r\n * Check if the given value is a valid json\r\n */\r\nexport const isJson = (value: any) => {\r\n  if (!value || typeof value !== \"string\") return false;\r\n\r\n  if (![\"[\", \"{\"].includes(value?.[0])) return false;\r\n\r\n  try {\r\n    JSON.parse(value);\r\n    return true;\r\n  } catch (e) {\r\n    return false;\r\n  }\r\n};\r\n\r\n/**\r\n * Check if the given value is valid url\r\n */\r\nexport const isUrl = (value: any): boolean => {\r\n  if (!value || typeof value !== \"string\") return false;\r\n\r\n  try {\r\n    const url = new URL(value);\r\n    if (![\"http:\", \"https:\"].includes(url.protocol)) return false;\r\n    const hostname = url.hostname;\r\n    if (!hostname.includes(\".\")) return false;\r\n    // Reject empty labels (e.g. \"google..com\", \"google.\", \".com\")\r\n    const labels = hostname.split(\".\");\r\n    if (labels.some((label) => label.length === 0)) return false;\r\n    return true;\r\n  } catch (e) {\r\n    return false;\r\n  }\r\n};\r\n\r\n/**\r\n * Check if the given value is a valid email\r\n */\r\nexport const isEmail = (value: any): boolean =>\r\n  typeof value === \"string\" &&\r\n  /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(\r\n    value\r\n  );\r\n\r\n/**\r\n * Check if current user is opening from mobile\r\n */\r\nexport const isMobile = {\r\n  /**\r\n   * Determine whether the current visitor is opening from an Android device\r\n   */\r\n  android: () => navigator.userAgent.match(/Android/i) !== null,\r\n  /**\r\n   * Determine whether the current visitor is opening from an ios device\r\n   */\r\n  ios: () => navigator.userAgent.match(/iPhone|iPad|iPod/i) !== null,\r\n  /**\r\n   * Determine whether the current visitor is opening from an Iphone\r\n   */\r\n  iphone: () => navigator.userAgent.match(/iPhone/i) !== null,\r\n  /**\r\n   * Determine whether the current visitor is opening from an ipad\r\n   */\r\n  ipad: () => navigator.userAgent.match(/iPad/i) !== null,\r\n  /**\r\n   * Determine whether the current visitor is opening from an ipod\r\n   */\r\n  ipod: () => navigator.userAgent.match(/iPod/i) !== null,\r\n  /**\r\n   * Determine whether the current visitor is opening from an windows mobile\r\n   */\r\n  windows: () => navigator.userAgent.match(/IEMobile/i) !== null,\r\n  /**\r\n   * Determine whether the current visitor is opening from mobile whatever its type\r\n   */\r\n  any: () => isMobile.android() || isMobile.ios() || isMobile.windows(),\r\n};\r\n\r\n/**\r\n * Determine if current user is opening from  macOS\r\n */\r\nexport const isMac = () => navigator.userAgent.match(/mac/i) !== null;\r\n\r\n/**\r\n * Check if current browser is the given name\r\n */\r\nexport const isBrowser = (\r\n  browser: \"chrome\" | \"safari\" | \"firefox\" | \"opera\" | \"edge\" | \"ie\"\r\n): boolean => {\r\n  const browsersList: { [key: string]: boolean } = {\r\n    chrome: isChrome(),\r\n    firefox: isFirefox(),\r\n    opera: isOpera(),\r\n    edge: isEdge(),\r\n    ie: isIE(),\r\n    safari: isSafari(),\r\n  };\r\n\r\n  return browsersList[browser.toLowerCase()] === true;\r\n};\r\n\r\n/**\r\n * Check if current browser is chrome browser\r\n */\r\nexport const isChrome = () =>\r\n  !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);\r\n\r\n/**\r\n * Check if current browser is firefox\r\n */\r\nexport const isFirefox = () => typeof window.InstallTrigger !== \"undefined\";\r\n\r\n/**\r\n * Check if current browser is safari\r\n */\r\nexport const isSafari = (): boolean => {\r\n  if (typeof navigator === \"undefined\") return false;\r\n  const ua = navigator.userAgent || \"\";\r\n  // Real Safari contains \"Safari\" and does NOT contain \"Chrome\", \"Chromium\",\r\n  // \"Edg\", \"OPR\", or \"Android\" (the Android System WebView is Chromium).\r\n  return (\r\n    /Safari/i.test(ua) &&\r\n    !/Chrome|Chromium|Edg|OPR|Android/i.test(ua)\r\n  );\r\n};\r\n\r\n/**\r\n * Check if current browser is opera\r\n */\r\nexport const isOpera = (): boolean => {\r\n  if (typeof window === \"undefined\") return false;\r\n  const w = window as any;\r\n  return (\r\n    (!!w.opr && !!w.opr.addons) ||\r\n    !!w.opera ||\r\n    (typeof navigator !== \"undefined\" &&\r\n      navigator.userAgent.indexOf(\" OPR/\") >= 0)\r\n  );\r\n};\r\n\r\n/**\r\n * Check if current browser is internet explorer\r\n */\r\nexport const isIE = () => !!document.documentMode;\r\n\r\n/**\r\n * Check if current browser is edge\r\n */\r\nexport const isEdge = () => {\r\n  // Internet Explorer 6-11\r\n  const isIE = !!document.documentMode;\r\n\r\n  const isEdge = !isIE && !!window.StyleMedia;\r\n  return isEdge;\r\n};\r\n\r\n/**\r\n * Determine whether the current visitor is opening from desktop\r\n */\r\nexport const isDesktop = () => !isMobile.any();\r\n\r\n/**\r\n * A simple lightweight library to validate values against certain types of data\r\n * For full documentation on github\r\n * Repo: https://github.com/hassanzohdy/supportive-is\r\n *\r\n * First released 01/12/2017\r\n * Licensed under MIT (http://opensource.org/licenses/MIT)\r\n */\r\nexport const Is = {\r\n  /**\r\n   * Determine whether the given value is a number whatever if its data type is String or Number\r\n   */\r\n  numeric: isNumeric,\r\n  /**\r\n   * Determine whether the given value is an integer and its data type is number\r\n   * As Number.isInteger considers 1.0 to be valid integer, regex will be used instead\r\n   */\r\n  int: isInt,\r\n  /**\r\n   * Determine whether the given value is a float number and its data type is number\r\n   */\r\n  float: isFloat,\r\n  /**\r\n   * Determine whether the given value is a regular expression\r\n   */\r\n  regex: isRegex,\r\n  /**\r\n   * Determine whether the given value is an object\r\n   */\r\n  object: isObject,\r\n  /**\r\n   * Determine whether the given value is a plain object\r\n   */\r\n  plainObject: isPlainObject,\r\n  /**\r\n   * Determine whether the given value is an array\r\n   */\r\n  array: Array.isArray,\r\n  /**\r\n   * Determine whether the given value is valid html attribute `id`\r\n   */\r\n  validHtmlId: isValidId,\r\n  /**\r\n   * determine if the given value is an instance of form element\r\n   */\r\n  formElement: isFormElement,\r\n  /**\r\n   * @alias formElement\r\n   */\r\n  form: isFormElement,\r\n  /**\r\n   * determine if the given value is an instance of form data\r\n   */\r\n  formData: isFormData,\r\n  /**\r\n   * Determine whether the given value is iterable\r\n   */\r\n  iterable: isIterable,\r\n  /**\r\n   * Determine whether the given value is a scalar\r\n   * Scalar types are strings, booleans, integers and\r\n   */\r\n  scalar: isScalar,\r\n  /**\r\n   * Determine if the given value is a primitive value\r\n   */\r\n  primitive: isPrimitive,\r\n  /**\r\n   * Determine whether the given value is a promise\r\n   */\r\n  promise: isPromise,\r\n  /**\r\n   * Determine whether the given value is a date\r\n   */\r\n  date: isDate,\r\n  /**\r\n   * Determine whether the given value is a generator\r\n   */\r\n  generator: isGenerator,\r\n  /**\r\n   * Determine whether the given value if an empty\r\n   * This can be validated against any type of values\r\n   * undefined or nullable values will be considered empty\r\n   * Objects that doesn't have any properties will be considered empty\r\n   * Arrays and Strings will be empty based on its length\r\n   * The 0 'Zero\" number will not be considered empty\r\n   */\r\n  empty: isEmpty,\r\n  /**\r\n   * Determine whether the given value is a valid json string\r\n   */\r\n  json: isJson,\r\n  /**\r\n   * Determine whether the given value is a valid url\r\n   */\r\n  url: isUrl,\r\n  /**\r\n   * Determine whether the given value is a valid email\r\n   */\r\n  email: isEmail,\r\n  /**\r\n   * Determine the current visitor is opening from mobile\r\n   * Please Note this method depends on the user agent\r\n   */\r\n  mobile: isMobile,\r\n  /**\r\n   * Determine if current user is opening from  macOS\r\n   */\r\n  mac: isMac,\r\n  /**\r\n   * Determine whether the current visitor is opening from desktop\r\n   */\r\n  desktop: isDesktop,\r\n  /**\r\n   * Check if the current browser is the given name\r\n   * To detect browser version as well, pass the version number as the second argument\r\n   */\r\n  browser: isBrowser,\r\n  chrome: isChrome,\r\n  firefox: isFirefox,\r\n  safari: isSafari,\r\n  opera: isOpera,\r\n  ie: isIE,\r\n  edge: isEdge,\r\n};\r\n\r\nexport default Is;\r\n"],"mappings":"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"}