data(key, value) {
    if (typeof key === 'string') {
      // Set `key`.
      if (arguments.length === 2) {
        assertUnfrozen('data', this.frozen)
        this.namespace[key] = value
        return this
      }

      // Get `key`.
      return (own.call(this.namespace, key) && this.namespace[key]) || undefined
    }

    // Set space.
    if (key) {
      assertUnfrozen('data', this.frozen)
      this.namespace = key
      return this
    }

    // Get space.
    return this.namespace
  }
Configure the processor with info available to all plugins.
Information is stored in an object.

Typically, options can be given to a specific plugin, but sometimes it
makes sense to have information shared with several plugins.
For example, a list of HTML elements that are self-closing, which is
needed during all phases.

> **Note**: setting information cannot occur on *frozen* processors.
> Call the processor first to create a new unfrozen processor.

> **Note**: to register custom data in TypeScript, augment the
> {@linkcode Data} interface.

@example
  This example show how to get and set info:

  ```js
  import {unified} from 'unified'

  const processor = unified().data('alpha', 'bravo')

  processor.data('alpha') // => 'bravo'

  processor.data() // => {alpha: 'bravo'}

  processor.data({charlie: 'delta'})

  processor.data() // => {charlie: 'delta'}
  ```

@template {keyof Data} Key

@overload
@returns {Data}

@overload
@param {Data} dataset
@returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}

@overload
@param {Key} key
@returns {Data[Key]}

@overload
@param {Key} key
@param {Data[Key]} value
@returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}

@param {Data | Key} [key]
  Key to get or set, or entire dataset to set, or nothing to get the
  entire dataset (optional).
@param {Data[Key]} [value]
  Value to set (optional).
@returns {unknown}
  The current processor when setting, the value at `key` when getting, or
  the entire dataset when getting without key.