{"version":3,"file":"JsonInspector.cjs","sources":["../src/uid.ts","../src/type.ts","../src/isPrimitive.ts","../src/highlighter.tsx","../src/isObject.ts","../src/Leaf.tsx","../src/noop.ts","../src/SearchBar.tsx","../src/isEmpty.ts","../src/filterer.ts","../src/lens.ts","../src/JsonInspector.tsx"],"sourcesContent":["let id = Math.ceil(Math.random() * 10)\n\nexport const uid = () => {\n  return ++id\n}\n","export function type(value: unknown) {\n  return Object.prototype.toString.call(value).slice(8, -1)\n}\n","import {type} from './type'\n\nexport function isPrimitive(value: unknown): boolean {\n  const t = type(value)\n  return t !== 'Object' && t !== 'Array'\n}\n","import {Component} from 'react'\n\nexport interface HighlighterProps {\n  string: string\n  highlight?: RegExp | null\n}\n\nexport class Highlighter extends Component<HighlighterProps> {\n  shouldComponentUpdate(p: HighlighterProps) {\n    return p.highlight !== this.props.highlight\n  }\n\n  render() {\n    const str = this.props.string || ''\n    const highlight = this.props.highlight || ''\n    const highlightStart = str.search(highlight)\n\n    if (!highlight || highlightStart === -1) {\n      return <span>{str}</span>\n    }\n\n    const highlightLength = highlight.source.length\n    const highlightString = str.slice(\n      highlightStart,\n      highlightStart + highlightLength,\n    )\n\n    return (\n      <span>\n        {str.split(highlight).map(function (part, index) {\n          return (\n            <span key={index}>\n              {index > 0 ? (\n                <span className=\"json-inspector__hl\">{highlightString}</span>\n              ) : null}\n              {part}\n            </span>\n          )\n        })}\n      </span>\n    )\n  }\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import {Component, MouseEvent} from 'react'\n\nimport md5OMatic from 'md5-o-matic'\n\nimport {uid} from './uid'\nimport {type} from './type'\nimport {isPrimitive} from './isPrimitive'\n\nimport {Highlighter} from './highlighter'\nimport {isObject} from './isObject'\nimport type {JsonInspectorProps} from './JsonInspector'\n\nconst PATH_PREFIX = '.root.'\n\ninterface LeafProps {\n  data: unknown\n  label: string\n\n  id?: string\n  root?: boolean\n  prefix?: string\n  query?: RegExp | null\n\n  isExpanded?: (keyPath: string, value: unknown) => boolean\n\n  interactiveLabel?: JsonInspectorProps['interactiveLabel']\n  onClick: JsonInspectorProps['onClick']\n\n  // @todo what is this\n  verboseShowOriginal?: boolean\n  getOriginal?: (keypath: string) => unknown\n}\n\ninterface LeafState {\n  expanded: boolean\n\n  // @todo what is this\n  original?: unknown\n}\n\nexport class Leaf extends Component<LeafProps, LeafState> {\n  constructor(props: LeafProps) {\n    super(props)\n\n    this.state = {\n      expanded: this._isInitiallyExpanded(this.props),\n    }\n  }\n\n  render() {\n    const {label, data, root, id: inputId} = this.props\n    const id = 'id_' + uid()\n\n    const d = {\n      path: this.keypath(),\n      key: label.toString(),\n      value: data,\n    }\n\n    const onLabelClick = this._onClick.bind(this, d)\n\n    return (\n      <div\n        data-testid={root ? 'leaf-root' : 'leaf-child'}\n        aria-expanded={this.state.expanded}\n        data-root={root || undefined}\n        className={this.getClassName()}\n        id={'leaf-' + this._rootPath()}\n      >\n        <input\n          className=\"json-inspector__radio\"\n          type=\"radio\"\n          name={id}\n          id={inputId}\n          tabIndex={-1}\n        />\n        <label\n          className=\"json-inspector__line\"\n          htmlFor={id}\n          onClick={onLabelClick}\n        >\n          <div className=\"json-inspector__flatpath\">{d.path}</div>\n          <span className=\"json-inspector__key\">\n            {this.format(d.key)}\n            {':'}\n            {this.renderInteractiveLabel(d.key, true)}\n          </span>\n          {this.renderTitle()}\n          {this.renderShowOriginalButton()}\n        </label>\n        {this.renderChildren()}\n      </div>\n    )\n  }\n\n  renderTitle() {\n    const data = this.data()\n    const t = type(data)\n\n    if (Array.isArray(data)) {\n      const length = data.length\n      return (\n        <span className=\"json-inspector__value json-inspector__value_helper\">\n          {length > 0 ? '[…] ' : '[] '}\n          {items(length)}\n        </span>\n      )\n    }\n\n    if (typeof data === 'object' && data !== null) {\n      const keys = Object.keys(data).length\n      return (\n        <span className=\"json-inspector__value json-inspector__value_helper\">\n          {keys > 0 ? '{…} ' : '{} '}\n          {properties(keys)}\n        </span>\n      )\n    }\n\n    return (\n      <span\n        className={\n          'json-inspector__value json-inspector__value_' + t.toLowerCase()\n        }\n      >\n        {this.format(String(data))}\n        {this.renderInteractiveLabel(data, false)}\n      </span>\n    )\n  }\n\n  renderChildren() {\n    const {\n      verboseShowOriginal,\n      query,\n      id,\n      isExpanded,\n      interactiveLabel,\n      onClick,\n      getOriginal,\n    } = this.props\n    const childPrefix = this._rootPath()\n    const data = this.data()\n\n    if (this.state.expanded && (isObject(data) || Array.isArray(data))) {\n      return Object.keys(data).map((key) => {\n        const value = (data as any)[key]\n\n        const shouldGetOriginal =\n          !this.state.original || (verboseShowOriginal ? query : false)\n\n        return (\n          <Leaf\n            data={value}\n            label={key}\n            prefix={childPrefix}\n            onClick={onClick}\n            id={id}\n            query={query}\n            getOriginal={shouldGetOriginal ? getOriginal : undefined}\n            key={getLeafKey(key, value)}\n            isExpanded={isExpanded}\n            interactiveLabel={interactiveLabel}\n            verboseShowOriginal={verboseShowOriginal}\n          />\n        )\n      })\n    }\n\n    return null\n  }\n\n  renderShowOriginalButton() {\n    const {data, getOriginal, query} = this.props\n    if (\n      isPrimitive(data) ||\n      this.state.original ||\n      !getOriginal ||\n      !query ||\n      query.test(this.keypath())\n    ) {\n      return null\n    }\n\n    return (\n      <span\n        className=\"json-inspector__show-original\"\n        onClick={this._onShowOriginalClick}\n      />\n    )\n  }\n\n  renderInteractiveLabel(originalValue: unknown, isKey: boolean) {\n    const InteractiveLabel = this.props.interactiveLabel\n    if (typeof InteractiveLabel === 'function') {\n      return (\n        <InteractiveLabel\n          value={String(originalValue)}\n          originalValue={originalValue}\n          isKey={isKey}\n          keypath={this.keypath()}\n        />\n      )\n    }\n\n    return null\n  }\n\n  static getDerivedStateFromProps(props: LeafProps, state: LeafState) {\n    if (props.query) {\n      return {\n        expanded: !props.query.test(props.label),\n      }\n    }\n\n    return null\n  }\n\n  componentDidUpdate(prevProps: LeafProps) {\n    // Restore original expansion state when switching from search mode\n    // to full browse mode.\n    if (prevProps.query && !this.props.query) {\n      this.setState({\n        expanded: this._isInitiallyExpanded(this.props),\n      })\n    }\n  }\n\n  _rootPath() {\n    return (this.props.prefix || '') + '.' + this.props.label\n  }\n\n  keypath() {\n    return this._rootPath().slice(PATH_PREFIX.length)\n  }\n\n  data() {\n    return this.state.original || this.props.data\n  }\n\n  format(str: string) {\n    return <Highlighter string={str} highlight={this.props.query} />\n  }\n\n  getClassName() {\n    let cn = 'json-inspector__leaf'\n\n    if (this.props.root) {\n      cn += ' json-inspector__leaf_root'\n    }\n\n    if (this.state.expanded) {\n      cn += ' json-inspector__leaf_expanded'\n    }\n\n    if (!isPrimitive(this.props.data)) {\n      cn += ' json-inspector__leaf_composite'\n    }\n\n    return cn\n  }\n\n  toggle() {\n    this.setState({\n      expanded: !this.state.expanded,\n    })\n  }\n\n  _onClick(\n    data: {\n      path: string\n      key: string\n      value: unknown\n    },\n    e: MouseEvent,\n  ) {\n    this.toggle()\n    if (this.props.onClick) {\n      this.props.onClick(data)\n    }\n\n    e.stopPropagation()\n  }\n\n  _onShowOriginalClick = (e: MouseEvent) => {\n    this.setState({\n      original: this.props.getOriginal?.(this.keypath()),\n    })\n\n    e.stopPropagation()\n  }\n\n  _isInitiallyExpanded(p: LeafProps) {\n    if (p.root) {\n      return true\n    }\n\n    const keypath = this.keypath()\n\n    if (!p.query) {\n      return p.isExpanded ? p.isExpanded(keypath, p.data) : false\n    } else {\n      // When a search query is specified, first check if the keypath\n      // contains the search query: if it does, then the current leaf\n      // is itself a search result and there is no need to expand further.\n      //\n      // Having a `getOriginal` function passed signalizes that current\n      // leaf only displays a subset of data, thus should be rendered\n      // expanded to reveal the children that is being searched for.\n      return !p.query.test(keypath) && typeof p.getOriginal === 'function'\n    }\n  }\n}\n\nfunction items(count: number) {\n  return count + (count === 1 ? ' item' : ' items')\n}\n\nfunction properties(count: number) {\n  return count + (count === 1 ? ' property' : ' properties')\n}\n\nfunction getLeafKey(key: string, value: unknown) {\n  if (isPrimitive(value)) {\n    // TODO: Sanitize `value` better.\n    const hash = md5OMatic(String(value))\n    return key + ':' + hash\n  } else {\n    return key + '[' + type(value) + ']'\n  }\n}\n","export const noop = (...args: unknown[]) => {}\n","import {type ChangeEventHandler, useCallback} from 'react'\nimport {noop} from './noop'\n\nexport interface SearchBarProps {\n  onChange: (query: string) => void\n  data: unknown\n  query: string\n}\n\nexport const SearchBar = ({onChange = noop}: SearchBarProps) => {\n  const onSearchChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n    (evt) => onChange(evt.target.value),\n    [onChange],\n  )\n\n  return (\n    <input\n      className=\"json-inspector__search\"\n      type=\"search\"\n      placeholder=\"Search\"\n      onChange={onSearchChange}\n    />\n  )\n}\n","import {isObject} from './isObject'\n\nexport function isEmpty(object: unknown) {\n  if (isObject(object)) {\n    return Object.keys(object).length === 0\n  }\n\n  if (Array.isArray(object)) {\n    return object.length === 0\n  }\n\n  if (\n    object === null ||\n    typeof object !== 'string' ||\n    typeof object !== 'number'\n  ) {\n    return true\n  }\n\n  return Object.keys(object).length === 0\n}\n","import {isEmpty} from './isEmpty'\nimport {JsonInspectorProps} from './JsonInspector'\nimport {isObject} from './isObject'\n\nexport const getFilterer = memoize(\n  (data: unknown, opts?: JsonInspectorProps['filterOptions']) => {\n    const options = opts || {cacheResults: true}\n\n    const cache: Record<string, Record<string, unknown>> = {}\n\n    return function (query: string) {\n      if (!options.cacheResults) {\n        return find(data, query, options)\n      }\n\n      let subquery\n\n      if (!cache[query]) {\n        for (var i = query.length - 1; i > 0; i -= 1) {\n          subquery = query.slice(0, i)\n\n          if (cache[subquery]) {\n            cache[query] = find(cache[subquery], query, options)\n            break\n          }\n        }\n      }\n\n      if (!cache[query]) {\n        cache[query] = find(data, query, options)\n      }\n\n      return cache[query]\n    }\n  },\n)\n\nfunction find(\n  data: unknown,\n  query: string,\n  options: JsonInspectorProps['filterOptions'],\n) {\n  if (!isObject(data) && !Array.isArray(data)) {\n    return {}\n  }\n\n  return Object.keys(data).reduce(function (\n    acc: Record<string, unknown>,\n    key: string,\n  ) {\n    // This fails because data can be an array, but it technically speaking works.\n    // I'd rather refactor this entire thing, but for now I am just porting it with least-effort.\n    const value = (data as any)[key]\n\n    let matches\n\n    if (!value) {\n      return acc\n    }\n\n    if (typeof value !== 'object') {\n      if (contains(query, key, options) || contains(query, value, options)) {\n        acc[key] = value\n      }\n      return acc\n    }\n\n    // If _key_ matches, include it\n    if (contains(query, key, options)) {\n      acc[key] = value\n      return acc\n    }\n\n    matches = find(value, query, options)\n\n    if (!isEmpty(matches)) {\n      Object.assign(acc, pair(key, matches))\n    }\n\n    return acc\n  }, {})\n}\n\nfunction contains(\n  query: string,\n  value: unknown,\n  options: JsonInspectorProps['filterOptions'],\n) {\n  if (!value) {\n    return false\n  }\n\n  var haystack = String(value)\n  var needle = query\n\n  if (options?.ignoreCase) {\n    haystack = haystack.toLowerCase()\n    needle = needle.toLowerCase()\n  }\n\n  return haystack.indexOf(needle) !== -1\n}\n\nfunction pair(key: string, value: unknown) {\n  return {[key]: value}\n}\n\nfunction memoize<R>(\n  fn: (data: unknown, opts?: JsonInspectorProps['filterOptions']) => R,\n) {\n  let lastData: unknown | undefined\n  let lastOptions: JsonInspectorProps['filterOptions'] | undefined\n  let lastResult: R | undefined\n\n  return (data: unknown, options: JsonInspectorProps['filterOptions']): R => {\n    if (!lastResult || data !== lastData || options !== lastOptions) {\n      lastData = data\n      lastOptions = options\n      lastResult = fn(data, options)\n    }\n    return lastResult\n  }\n}\n","import {isObject} from './isObject'\n\nconst PATH_DELIMITER = '.'\n\nfunction integer(str: string): number {\n  return parseInt(str, 10)\n}\n\nexport function lens(data: unknown, path: string): unknown {\n  var p = path.split(PATH_DELIMITER)\n  var segment = p.shift()\n\n  if (!segment) {\n    return data\n  }\n\n  if (Array.isArray(data) && data[integer(segment)]) {\n    return lens(data[integer(segment)], p.join(PATH_DELIMITER))\n  }\n\n  if (isObject(data) && segment in data) {\n    return lens(data[segment], p.join(PATH_DELIMITER))\n  }\n\n  return undefined\n}\n","import {Component} from 'react'\nimport debounce from 'debounce'\n\nimport {Leaf} from './Leaf.js'\nimport {SearchBar, type SearchBarProps} from './SearchBar.js'\n\nimport {getFilterer} from './filterer.js'\nimport {isEmpty} from './isEmpty.js'\nimport {lens} from './lens.js'\nimport {noop} from './noop.js'\n\n/**\n * @public\n */\nexport interface JsonInspectorProps {\n  /**\n   * DOM id for the root node\n   */\n  id?: string\n  /**\n   * JSON object or array to inspect.\n   */\n  data: unknown\n  /**\n   * The class name to be added to the root component element.\n   */\n  className?: string\n  /**\n   * Search bar component that accepts `onChange`, `data` and `query`\n   * properties. Defaults to built-in search bar. Pass `false` to disable\n   * search.\n   */\n  search?: React.ComponentType<SearchBarProps> | false\n  /**\n   * Optional parameters for search (toolbar). Must be an object.\n   */\n  searchOptions?: {\n    /**\n     * wait time (ms) between search field `onChange` events before actually\n     * performing search. This can help provide a better user experience when\n     * searching larger data sets. Defaults to `0`.\n     */\n    debounceTime?: number\n  }\n  /**\n   * Can be used to create custom input fields for JSON property names and\n   * primitive values, see [#3][0] for more information.\n   *\n   * [0]: https://github.com/Lapple/react-json-inspector/issues/3\n   */\n  interactiveLabel?: React.ComponentType<{\n    /**\n     * either stringified property value or key value that is being interacted\n     * with\n     */\n    value: string\n    /**\n     * either the original property value or key value,\n     */\n    originalValue: unknown\n    /**\n     * flag to differentiate between interacting with keys or properties,\n     */\n    isKey: boolean\n    /**\n     * keypath of the node being interacted with, will be the same for keys\n     * and properties\n     */\n    keypath: string\n  }>\n  /**\n   * Callback to be run whenever any key-value pair is clicked. Receives an\n   * object with `key`, `value` and `path` properties.\n   */\n  onClick?: (options: {key: string; value: unknown; path: string}) => void\n  /**\n   * Function to check whether the entered search term is sufficient to query\n   * data. Defaults to `(query) => query.length >= 2`.\n   */\n  validateQuery?: (query: string) => boolean\n  /**\n   * Optional predicate that can determine whether the leaf node should be\n   * expanded on initial render. Receives two arguments: `keypath` and `value`.\n   * Defaults to `(keypath, value) => false`.\n   */\n  isExpanded?: (keyPath: string, value: unknown) => boolean\n  filterOptions?: {\n    /**\n     * Set to `false` to disable the filterer cache. This can sometimes\n     * provide performance enhancements with larger data sets. Defaults to\n     * `true`.\n     */\n    cacheResults?: boolean\n    /**\n     * Set to `true` to enable case insensitivity in search. Defaults to\n     * `false`.\n     */\n    ignoreCase?: boolean\n  }\n  /**\n   * Set to `true` for full showOriginal expansion of children containing\n   * search term. Defaults to `false`.\n   */\n  verboseShowOriginal?: boolean\n}\n\ninterface InspectorState {\n  query: string\n  filterer(\n    data: unknown,\n    options?: JsonInspectorProps['filterOptions'],\n  ): unknown\n}\n\nconst defaultValidateQuery = (query: string) => query.length >= 2\nconst defaultFilterOptions = {cacheResults: true, ignoreCase: false}\n\n/**\n * @public\n */\nexport class JsonInspector extends Component<\n  JsonInspectorProps,\n  InspectorState\n> {\n  static defaultProps = {\n    data: null,\n    search: SearchBar,\n    searchOptions: {\n      debounceTime: 0,\n    },\n    className: '',\n    id: 'json-' + Date.now(),\n    onClick: noop,\n    filterOptions: {\n      cacheResults: true,\n      ignoreCase: false,\n    },\n    validateQuery: function (query: string) {\n      return query.length >= 2\n    },\n    /**\n     * Decide whether the leaf node at given `keypath` should be\n     * expanded initially.\n     * @param  {String} keypath\n     * @param  {Any} value\n     * @return {Boolean}\n     */\n    isExpanded: function (keypath: string, value: unknown) {\n      return false\n    },\n    verboseShowOriginal: false,\n  }\n\n  constructor(props: JsonInspectorProps) {\n    super(props)\n    this.state = {\n      query: '',\n      filterer: getFilterer(props.data, props.filterOptions),\n    }\n  }\n\n  render() {\n    const {\n      data: rawData,\n      className,\n      onClick,\n      id,\n      isExpanded,\n      interactiveLabel,\n      verboseShowOriginal,\n      filterOptions = defaultFilterOptions,\n      validateQuery = defaultValidateQuery,\n    } = this.props\n\n    const isQueryValid =\n      this.state.query !== '' && validateQuery(this.state.query)\n\n    const data = isQueryValid ? this.state.filterer(this.state.query) : rawData\n\n    const isNotFound = isQueryValid && isEmpty(data)\n\n    return (\n      <div\n        data-testid=\"json-inspector\"\n        className={'json-inspector ' + className}\n      >\n        {this.renderToolbar()}\n        {isNotFound ? (\n          <div className=\"json-inspector__not-found\">Nothing found</div>\n        ) : (\n          <Leaf\n            data={data}\n            onClick={onClick}\n            id={id}\n            getOriginal={this.getOriginal}\n            query={\n              isQueryValid\n                ? new RegExp(\n                    this.state.query,\n                    filterOptions.ignoreCase ? 'i' : '',\n                  )\n                : null\n            }\n            label=\"root\"\n            root={true}\n            isExpanded={isExpanded}\n            interactiveLabel={interactiveLabel}\n            verboseShowOriginal={verboseShowOriginal}\n          />\n        )}\n      </div>\n    )\n  }\n\n  renderToolbar() {\n    const Search = this.props.search\n    if (!Search) {\n      return null\n    }\n\n    return (\n      <div className=\"json-inspector__toolbar\">\n        <Search\n          onChange={debounce(\n            this.search,\n            this.props.searchOptions?.debounceTime,\n          )}\n          data={this.props.data}\n          query={this.state.query}\n        />\n      </div>\n    )\n  }\n\n  search = (query: string) => {\n    this.setState({query})\n  }\n\n  static getDerivedStateFromProps(\n    nextProps: JsonInspectorProps,\n    prevState: InspectorState,\n  ) {\n    const filterer = getFilterer(nextProps.data, nextProps.filterOptions)\n    return filterer === prevState.filterer ? null : {...prevState, filterer}\n  }\n\n  shouldComponentUpdate(\n    nextProps: JsonInspectorProps,\n    prevState: InspectorState,\n  ) {\n    return (\n      prevState.query !== this.state.query ||\n      nextProps.data !== this.props.data ||\n      nextProps.onClick !== this.props.onClick\n    )\n  }\n\n  createFilterer = (\n    data: unknown,\n    options: JsonInspectorProps['filterOptions'],\n  ) => {\n    this.setState({\n      filterer: getFilterer(data, options),\n    })\n  }\n\n  getOriginal = (path: string) => {\n    return lens(this.props.data, path)\n  }\n}\n"],"names":["Component","jsx","id","jsxs","md5OMatic","useCallback","debounce"],"mappings":"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"}