{"version":3,"file":"type.mjs","sources":["../../../src/tools/type.ts"],"sourcesContent":["const OBJECT_CONSTRUCTOR_STRING = Function.prototype.toString.call(Object)\n\ninterface BlobLike {\n  readonly size: number\n  readonly type: string\n  slice(start?: number, end?: number, contentType?: string): Blob\n}\n\ninterface FileLike extends BlobLike {\n  name: string\n  lastModified?: number\n  lastModifiedDate?: object\n}\n\n/**\n * The `Type` class is designed to check and determine data types\n *\n * @see bitrix/js/main/core/src/lib/type.js\n */\nclass TypeManager {\n  getTag(value: any): string {\n    return Object.prototype.toString.call(value)\n  }\n\n  /**\n   * Checks that value is string\n   * @param value\n   * @return {boolean}\n   *\n   * @memo get from pull.client.Utils\n   */\n  isString(value: any): value is string {\n    return typeof value === 'string' || value instanceof String\n  }\n\n  /**\n   * Returns true if a value is not an empty string\n   * @param value\n   * @returns {boolean} Returns true if a value is not an empty string\n   */\n  isStringFilled(value: any): value is string {\n    return this.isString(value) && value !== ''\n  }\n\n  /**\n   * Checks that value is function\n   * @param value\n   * @return {boolean}\n   *\n   * @memo get from pull.client.Utils\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  isFunction(value: any): value is Function {\n    return value === null\n      ? false\n      : typeof value === 'function' || value instanceof Function\n  }\n\n  /**\n   * Checks that value is an object\n   * @param value\n   * @return {boolean}\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  isObject(value: any): value is object | Function {\n    return !!value && (typeof value === 'object' || typeof value === 'function')\n  }\n\n  /**\n   * Checks that value is object like\n   * @param value\n   * @return {boolean}\n   */\n  isObjectLike<T>(value: any): value is T {\n    return !!value && typeof value === 'object'\n  }\n\n  /**\n   * Checks that value is plain object\n   * @param value\n   * @return {boolean}\n   */\n  isPlainObject(value: any): value is Record<string | number, any> {\n    if (!this.isObjectLike(value) || this.getTag(value) !== '[object Object]') {\n      return false\n    }\n\n    const proto = Object.getPrototypeOf(value)\n    if (proto === null) {\n      return true\n    }\n\n    const ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor\n\n    return (\n      typeof ctor === 'function'\n      && Function.prototype.toString.call(ctor) === OBJECT_CONSTRUCTOR_STRING\n    )\n  }\n\n  isJsonRpcRequest(value: any): boolean {\n    return (\n      typeof value === 'object'\n      && value\n      && 'jsonrpc' in value\n      && this.isStringFilled(value.jsonrpc)\n      && 'method' in value\n      && this.isStringFilled(value.method)\n    )\n  }\n\n  isJsonRpcResponse(value: any): boolean {\n    return (\n      typeof value === 'object'\n      && value\n      && 'jsonrpc' in value\n      && this.isStringFilled(value.jsonrpc)\n      && 'id' in value\n      && ('result' in value || 'error' in value)\n    )\n  }\n\n  /**\n   * Checks that value is boolean\n   * @param value\n   * @return {boolean}\n   */\n  isBoolean(value: any): value is boolean {\n    return value === true || value === false\n  }\n\n  /**\n   * Checks that value is number\n   * @param value\n   * @return {boolean}\n   */\n  isNumber(value: any): value is number {\n    return typeof value === 'number' && !Number.isNaN(value)\n  }\n\n  /**\n   * Checks that value is integer\n   * @param value\n   * @return {boolean}\n   */\n  isInteger(value: any): value is number {\n    return Number.isInteger(value)\n  }\n\n  /**\n   * Checks that value is float\n   * @param value\n   * @return {boolean}\n   */\n  isFloat(value: any): value is number {\n    return this.isNumber(value) && !this.isInteger(value)\n  }\n\n  /**\n   * Checks that value is nil\n   * @param value\n   * @return {boolean}\n   */\n  isNil(value: any): value is null | undefined {\n    return value === null || value === undefined\n  }\n\n  /**\n   * Checks that value is an array\n   * @param value\n   * @return {boolean}\n   */\n  isArray(value: any): value is any[] {\n    return !this.isNil(value) && Array.isArray(value)\n  }\n\n  /**\n   * Returns true if a value is an array, and it has at least one element\n   * @param value\n   * @returns {boolean} Returns true if a value is an array, and it has at least one element\n   */\n  isArrayFilled(value: any): value is any[] {\n    return this.isArray(value) && value.length > 0\n  }\n\n  /**\n   * Checks that value is array like\n   * @param value\n   * @return {boolean}\n   */\n  isArrayLike(value: any): value is ArrayLike<any> {\n    return (\n      !this.isNil(value)\n      && !this.isFunction(value)\n      && value.length > -1\n      && value.length <= Number.MAX_SAFE_INTEGER\n    )\n  }\n\n  /**\n   * Checks that value is Date\n   * @param value\n   * @return {boolean}\n   */\n  isDate(value: any): value is Date {\n    return value instanceof Date\n  }\n\n  /**\n   * Checks that is a DOM node\n   * @param value\n   * @return {boolean}\n   */\n  isDomNode(value: any): value is Node {\n    return (\n      this.isObjectLike<{\n        nodeType?: any\n      }>(value)\n      && !this.isPlainObject(value)\n      && 'nodeType' in value\n    )\n  }\n\n  /**\n   * Checks that value is element node\n   * @param value\n   * @return {boolean}\n   */\n  isElementNode(value: any): value is HTMLElement {\n    return this.isDomNode(value) && value.nodeType === Node.ELEMENT_NODE\n  }\n\n  /**\n   * Checks that value is a text node\n   * @param value\n   * @return {boolean}\n   */\n  isTextNode(value: any): value is Text {\n    return this.isDomNode(value) && value.nodeType === Node.TEXT_NODE\n  }\n\n  /**\n   * Checks that value is Map\n   * @param value\n   * @return {boolean}\n   */\n  isMap(value: any): value is Map<unknown, unknown> {\n    return this.isObjectLike(value) && this.getTag(value) === '[object Map]'\n  }\n\n  /**\n   * Checks that value is Set\n   * @param value\n   * @return {boolean}\n   */\n  isSet(value: any): value is Set<unknown> {\n    return this.isObjectLike(value) && this.getTag(value) === '[object Set]'\n  }\n\n  /**\n   * Checks that value is WeakMap\n   * @param value\n   * @return {boolean}\n   */\n  isWeakMap(value: any): value is WeakMap<object, unknown> {\n    return this.isObjectLike(value) && this.getTag(value) === '[object WeakMap]'\n  }\n\n  /**\n   * Checks that value is WeakSet\n   * @param value\n   * @return {boolean}\n   */\n  isWeakSet(value: any): value is WeakSet<object> {\n    return this.isObjectLike(value) && this.getTag(value) === '[object WeakSet]'\n  }\n\n  /**\n   * Checks that value is prototype\n   * @param value\n   * @return {boolean}\n   */\n  isPrototype(value: any): value is object {\n    return (\n      (\n        (\n          typeof (value && value.constructor) === 'function'\n          && value.constructor.prototype\n        ) || Object.prototype\n      ) === value\n    )\n  }\n\n  /**\n   * Checks that value is regexp\n   * @param value\n   * @return {boolean}\n   */\n  isRegExp(value: any): value is RegExp {\n    return this.isObjectLike(value) && this.getTag(value) === '[object RegExp]'\n  }\n\n  /**\n   * Checks that value is null\n   * @param value\n   * @return {boolean}\n   */\n  isNull(value: any): value is null {\n    return value === null\n  }\n\n  /**\n   * Checks that value is undefined\n   * @param value\n   * @return {boolean}\n   */\n  isUndefined(value: any): value is undefined {\n    return typeof value === 'undefined'\n  }\n\n  /**\n   * Checks that value is ArrayBuffer\n   * @param value\n   * @return {boolean}\n   */\n  isArrayBuffer(value: any): value is ArrayBuffer {\n    return (\n      this.isObjectLike(value) && this.getTag(value) === '[object ArrayBuffer]'\n    )\n  }\n\n  /**\n   * Checks that value is typed array\n   * @param value\n   * @return {boolean}\n   */\n  isTypedArray(value: any): value is\n  | Int8Array\n  | Uint8Array\n  | Uint8ClampedArray\n  | Int16Array\n  | Uint16Array\n  | Int32Array\n  | Uint32Array\n  | Float32Array\n  | Float64Array {\n    const regExpTypedTag\n      = /^\\[object (?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)\\]$/\n    return this.isObjectLike(value) && regExpTypedTag.test(this.getTag(value))\n  }\n\n  /**\n   * Checks that value is Blob\n   * @param value\n   * @return {boolean}\n   */\n  isBlob(value: any): value is BlobLike {\n    return (\n      this.isObjectLike(value)\n      && this.isNumber((value as BlobLike).size)\n      && this.isString((value as BlobLike).type)\n      && this.isFunction((value as BlobLike).slice)\n    )\n  }\n\n  /**\n   * Checks that value is File\n   * @param value\n   * @return {boolean}\n   */\n  isFile(value: any): value is FileLike {\n    return (\n      this.isBlob(value)\n      && this.isString((value as FileLike).name)\n      && (this.isNumber((value as FileLike).lastModified) || this.isObjectLike((value as FileLike).lastModifiedDate))\n    )\n  }\n\n  /**\n   * Checks that value is FormData\n   * @param value\n   * @return {boolean}\n   */\n  isFormData(value: any): value is FormData {\n    if (typeof FormData !== 'undefined' && value instanceof FormData) {\n      return true\n    }\n\n    return this.isObjectLike(value) && this.getTag(value) === '[object FormData]'\n  }\n\n  clone(obj: any, bCopyObj: boolean = true): any {\n    let _obj, i, l\n\n    if (this.isNil(obj) || typeof obj !== 'object') {\n      return obj\n    }\n\n    if (this.isDomNode(obj)) {\n      _obj = obj.cloneNode(bCopyObj)\n    } else if (typeof obj == 'object') {\n      if (this.isArray(obj)) {\n        _obj = []\n        for (i = 0, l = obj.length; i < l; i++) {\n          if (typeof obj[i] == 'object' && bCopyObj) {\n            _obj[i] = this.clone(obj[i], bCopyObj)\n          } else {\n            _obj[i] = obj[i]\n          }\n        }\n      } else {\n        _obj = {}\n        if (obj.constructor) {\n          if (this.isDate(obj)) {\n            _obj = new Date(obj)\n          } else {\n            _obj = new obj.constructor()\n          }\n        }\n\n        for (i in obj) {\n          if (!Object.prototype.hasOwnProperty.call(obj, i)) {\n            continue\n          }\n          if (typeof obj[i] === 'object' && bCopyObj) {\n            _obj[i] = this.clone(obj[i], bCopyObj)\n          } else {\n            _obj[i] = obj[i]\n          }\n        }\n      }\n    } else {\n      _obj = obj\n    }\n\n    return _obj\n  }\n}\n\nexport const Type = new TypeManager()\n"],"names":[],"mappings":"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"}