{"version":3,"file":"json_explorer.mjs","sources":["../../../../../src/components/JSONFormatter/json_explorer/json_explorer.ts"],"sourcesContent":["// Based on work https://github.com/mohsen1/json-formatter-js\n// License MIT, Copyright (c) 2015 Mohsen Azimi\n\nimport { isNumber } from 'lodash';\n\nimport { isObject, getObjectName, getType, getValuePreview, cssClass, createElement } from './helpers';\n\nconst DATE_STRING_REGEX =\n  /(^\\d{1,4}[\\.|\\\\/|-]\\d{1,2}[\\.|\\\\/|-]\\d{1,4})(\\s*(?:0?[1-9]:[0-5]|1(?=[012])\\d:[0-5])\\d\\s*[ap]m)?$/;\nconst PARTIAL_DATE_REGEX = /\\d{2}:\\d{2}:\\d{2} GMT-\\d{4}/;\nconst JSON_DATE_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/;\n\n// When toggling, don't animated removal or addition of more than a few items\nconst MAX_ANIMATED_TOGGLE_ITEMS = 10;\n\nconst requestAnimationFrame =\n  (typeof window !== 'undefined' && window.requestAnimationFrame) ||\n  ((cb: () => void) => {\n    cb();\n    return 0;\n  });\n\nexport interface JsonExplorerConfig {\n  animateOpen?: boolean;\n  animateClose?: boolean;\n  theme?: string;\n}\n\nconst _defaultConfig: JsonExplorerConfig = {\n  animateOpen: true,\n  animateClose: true,\n};\n\n/**\n * @class JsonExplorer\n *\n * JsonExplorer allows you to render JSON objects in HTML with a\n * **collapsible** navigation.\n */\nexport class JsonExplorer {\n  // Hold the open state after the toggler is used\n  private _isOpen: boolean | null = null;\n\n  // A reference to the element that we render to\n  private element: HTMLDivElement | null = null;\n\n  private skipChildren = false;\n\n  /**\n   * @param {object} json The JSON object you want to render. It has to be an\n   * object or array. Do NOT pass raw JSON string.\n   *\n   * @param {number} [open=1] his number indicates up to how many levels the\n   * rendered tree should expand. Set it to `0` to make the whole tree collapsed\n   * or set it to `Infinity` to expand the tree deeply\n   *\n   * @param {object} [config=defaultConfig] -\n   *  defaultConfig = {\n   *   hoverPreviewEnabled: false,\n   *   hoverPreviewArrayCount: 100,\n   *   hoverPreviewFieldCount: 5\n   * }\n   *\n   * Available configurations:\n   *  #####Hover Preview\n   * * `hoverPreviewEnabled`:  enable preview on hover\n   * * `hoverPreviewArrayCount`: number of array items to show in preview Any\n   *    array larger than this number will be shown as `Array[XXX]` where `XXX`\n   *    is length of the array.\n   * * `hoverPreviewFieldCount`: number of object properties to show for object\n   *   preview. Any object with more properties that thin number will be\n   *   truncated.\n   *\n   * @param {string} [key=undefined] The key that this object in its parent\n   * context\n   */\n  constructor(\n    public json: any,\n    private open = 1,\n    private config: JsonExplorerConfig = _defaultConfig,\n    private key?: string\n  ) {}\n\n  /*\n   * is formatter open?\n   */\n  private get isOpen(): boolean {\n    if (this._isOpen !== null) {\n      return this._isOpen;\n    } else {\n      return this.open > 0;\n    }\n  }\n\n  /*\n   * set open state (from toggler)\n   */\n  private set isOpen(value: boolean) {\n    this._isOpen = value;\n  }\n\n  /*\n   * is this a date string?\n   */\n  private get isDate(): boolean {\n    return (\n      this.type === 'string' &&\n      (DATE_STRING_REGEX.test(this.json) || JSON_DATE_REGEX.test(this.json) || PARTIAL_DATE_REGEX.test(this.json))\n    );\n  }\n\n  /*\n   * is this a URL string?\n   */\n  private get isUrl(): boolean {\n    return this.type === 'string' && this.json.indexOf('http') === 0;\n  }\n\n  /*\n   * is this an array?\n   */\n  private get isArray(): boolean {\n    return Array.isArray(this.json);\n  }\n\n  /*\n   * is this an object?\n   * Note: In this context arrays are object as well\n   */\n  private get isObject(): boolean {\n    return isObject(this.json);\n  }\n\n  /*\n   * is this an empty object with no properties?\n   */\n  private get isEmptyObject(): boolean {\n    return !this.keys.length && !this.isArray;\n  }\n\n  /*\n   * is this an empty object or array?\n   */\n  private get isEmpty(): boolean {\n    return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray);\n  }\n\n  /*\n   * did we receive a key argument?\n   * This means that the formatter was called as a sub formatter of a parent formatter\n   */\n  private get hasKey(): boolean {\n    return typeof this.key !== 'undefined';\n  }\n\n  /*\n   * if this is an object, get constructor function name\n   */\n  private get constructorName(): string {\n    return getObjectName(this.json);\n  }\n\n  /*\n   * get type of this value\n   * Possible values: all JavaScript primitive types plus \"array\" and \"null\"\n   */\n  private get type(): string {\n    return getType(this.json);\n  }\n\n  /*\n   * get object keys\n   * If there is an empty key we pad it wit quotes to make it visible\n   */\n  private get keys(): string[] {\n    if (this.isObject) {\n      return Object.keys(this.json).map((key) => (key ? key : '\"\"'));\n    } else {\n      return [];\n    }\n  }\n\n  /**\n   * Toggles `isOpen` state\n   *\n   */\n  toggleOpen() {\n    this.isOpen = !this.isOpen;\n\n    if (this.element) {\n      if (this.isOpen) {\n        this.appendChildren(this.config.animateOpen);\n      } else {\n        this.removeChildren(this.config.animateClose);\n      }\n      this.element.classList.toggle(cssClass('open'));\n    }\n  }\n\n  /**\n   * Open all children up to a certain depth.\n   * Allows actions such as expand all/collapse all\n   *\n   */\n  openAtDepth(depth = 1) {\n    if (depth < 0) {\n      return;\n    }\n\n    this.open = depth;\n    this.isOpen = depth !== 0;\n\n    if (this.element) {\n      this.removeChildren(false);\n\n      if (depth === 0) {\n        this.element.classList.remove(cssClass('open'));\n      } else {\n        this.appendChildren(this.config.animateOpen);\n        this.element.classList.add(cssClass('open'));\n      }\n    }\n  }\n\n  isNumberArray() {\n    return this.json.length > 0 && this.json.length < 4 && (isNumber(this.json[0]) || isNumber(this.json[1]));\n  }\n\n  renderArray() {\n    const arrayWrapperSpan = createElement('span');\n    arrayWrapperSpan.appendChild(createElement('span', 'bracket', '['));\n\n    // some pretty handling of number arrays\n    if (this.isNumberArray()) {\n      this.json.forEach((val: any, index: number) => {\n        if (index > 0) {\n          arrayWrapperSpan.appendChild(createElement('span', 'array-comma', ','));\n        }\n        arrayWrapperSpan.appendChild(createElement('span', 'number', val));\n      });\n      this.skipChildren = true;\n    } else {\n      arrayWrapperSpan.appendChild(createElement('span', 'number', this.json.length));\n    }\n\n    arrayWrapperSpan.appendChild(createElement('span', 'bracket', ']'));\n    return arrayWrapperSpan;\n  }\n\n  /**\n   * Renders an HTML element and installs event listeners\n   *\n   * @returns {HTMLDivElement}\n   */\n  render(skipRoot = false): HTMLDivElement {\n    // construct the root element and assign it to this.element\n    this.element = createElement('div', 'row');\n\n    // construct the toggler link\n    const togglerLink = createElement('a', 'toggler-link');\n    const togglerIcon = createElement('span', 'toggler');\n\n    // if this is an object we need a wrapper span (toggler)\n    if (this.isObject) {\n      togglerLink.appendChild(togglerIcon);\n    }\n\n    // if this is child of a parent formatter we need to append the key\n    if (this.hasKey) {\n      togglerLink.appendChild(createElement('span', 'key', `${this.key}:`));\n    }\n\n    // Value for objects and arrays\n    if (this.isObject) {\n      // construct the value holder element\n      const value = createElement('span', 'value');\n\n      // we need a wrapper span for objects\n      const objectWrapperSpan = createElement('span');\n\n      // get constructor name and append it to wrapper span\n      const constructorName = createElement('span', 'constructor-name', this.constructorName);\n      objectWrapperSpan.appendChild(constructorName);\n\n      // if it's an array append the array specific elements like brackets and length\n      if (this.isArray) {\n        const arrayWrapperSpan = this.renderArray();\n        objectWrapperSpan.appendChild(arrayWrapperSpan);\n      }\n\n      // append object wrapper span to toggler link\n      value.appendChild(objectWrapperSpan);\n      togglerLink.appendChild(value);\n      // Primitive values\n    } else {\n      // make a value holder element\n      const value = this.isUrl ? createElement('a') : createElement('span');\n\n      // add type and other type related CSS classes\n      value.classList.add(cssClass(this.type));\n      if (this.isDate) {\n        value.classList.add(cssClass('date'));\n      }\n      if (this.isUrl) {\n        value.classList.add(cssClass('url'));\n        value.setAttribute('href', this.json);\n      }\n\n      // Append value content to value element\n      const valuePreview = getValuePreview(this.json, this.json);\n      value.appendChild(document.createTextNode(valuePreview));\n\n      // append the value element to toggler link\n      togglerLink.appendChild(value);\n    }\n\n    // construct a children element\n    const children = createElement('div', 'children');\n\n    // set CSS classes for children\n    if (this.isObject) {\n      children.classList.add(cssClass('object'));\n    }\n    if (this.isArray) {\n      children.classList.add(cssClass('array'));\n    }\n    if (this.isEmpty) {\n      children.classList.add(cssClass('empty'));\n    }\n\n    // set CSS classes for root element\n    if (this.config && this.config.theme) {\n      this.element.classList.add(cssClass(this.config.theme));\n    }\n    if (this.isOpen) {\n      this.element.classList.add(cssClass('open'));\n    }\n\n    // append toggler and children elements to root element\n    if (!skipRoot) {\n      this.element.appendChild(togglerLink);\n    }\n\n    if (!this.skipChildren) {\n      this.element.appendChild(children);\n    } else {\n      // remove togglerIcon\n      togglerLink.removeChild(togglerIcon);\n    }\n\n    // if formatter is set to be open call appendChildren\n    if (this.isObject && this.isOpen) {\n      this.appendChildren();\n    }\n\n    // add event listener for toggling\n    if (this.isObject) {\n      togglerLink.addEventListener('click', this.toggleOpen.bind(this));\n    }\n\n    return this.element;\n  }\n\n  /**\n   * Appends all the children to children element\n   * Animated option is used when user triggers this via a click\n   */\n  appendChildren(animated = false) {\n    const children = this.element && this.element.querySelector(`div.${cssClass('children')}`);\n\n    if (!children || this.isEmpty) {\n      return;\n    }\n\n    if (animated) {\n      let index = 0;\n      const addAChild = () => {\n        const key = this.keys[index];\n        const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n        children.appendChild(formatter.render());\n\n        index += 1;\n\n        if (index < this.keys.length) {\n          if (index > MAX_ANIMATED_TOGGLE_ITEMS) {\n            addAChild();\n          } else {\n            requestAnimationFrame(addAChild);\n          }\n        }\n      };\n\n      requestAnimationFrame(addAChild);\n    } else {\n      this.keys.forEach((key) => {\n        const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n        children.appendChild(formatter.render());\n      });\n    }\n  }\n\n  /**\n   * Removes all the children from children element\n   * Animated option is used when user triggers this via a click\n   */\n  removeChildren(animated = false) {\n    const childrenElement = this.element && this.element.querySelector<HTMLDivElement>(`div.${cssClass('children')}`);\n\n    if (animated) {\n      let childrenRemoved = 0;\n      const removeAChild = () => {\n        if (childrenElement && childrenElement.children.length) {\n          childrenElement.removeChild(childrenElement.children[0]);\n          childrenRemoved += 1;\n          if (childrenRemoved > MAX_ANIMATED_TOGGLE_ITEMS) {\n            removeAChild();\n          } else {\n            requestAnimationFrame(removeAChild);\n          }\n        }\n      };\n      requestAnimationFrame(removeAChild);\n    } else {\n      if (childrenElement) {\n        childrenElement.innerHTML = '';\n      }\n    }\n  }\n}\n"],"names":[],"mappings":"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"}