Source: core/src/plugins/output.js

/**
 * @namespace output
 * @memberof module:@citation-js/core.plugins
 */

import Register from '../util/register.js'

/**
 * @callback module:@citation-js/core.plugins.output~formatter
 * @param {Array<module:@citation-js/core~InputData>} data
 * @return {String} output
 */

/**
 * @typedef module:@citation-js/core.plugins.output~formatterName
 * @type String
 */

/**
 * Validate input arguments
 *
 * @access private
 * @memberof module:@citation-js/core.plugins.output
 *
 * @param {String} name - output format name
 * @param {module:@citation-js/core.plugins.output~formatter} formatter - outputting function
 * @throws {TypeError} Invalid output format name
 * @throws {TypeError} Invalid formatter
 */
function validate (name, formatter) {
  if (typeof name !== 'string') {
    throw new TypeError(`Invalid output format name, expected string, got ${typeof name}`)
  } else if (typeof formatter !== 'function') {
    throw new TypeError(`Invalid formatter, expected function, got ${typeof formatter}`)
  }
}

/**
 * @access public
 * @memberof module:@citation-js/core.plugins.output
 * @constant register
 *
 * @type module:@citation-js/core.util.Register
 */
export const register = new Register()

/**
 * Add output plugin.
 *
 * @access public
 * @memberof module:@citation-js/core.plugins.output
 * @method add
 *
 * @param {module:@citation-js/core.plugins.output~formatterName} name - output format name
 * @param {module:@citation-js/core.plugins.output~formatter} formatter - outputting function
 * @throws {TypeError} validation errors
 */
export function add (name, formatter) {
  validate(name, formatter)

  register.set(name, formatter)
}

/**
 * Remove output plugin.
 *
 * @access public
 * @memberof module:@citation-js/core.plugins.output
 * @method remove
 *
 * @param {module:@citation-js/core.plugins.output~formatterName} name - output format name
 */
export function remove (name) {
  register.remove(name)
}

/**
 * Check if output plugin exists.
 *
 * @access public
 * @memberof module:@citation-js/core.plugins.output
 * @method has
 *
 * @param {module:@citation-js/core.plugins.output~formatterName} name - output format name
 * @return {Boolean} register has plugin
 */
export function has (name) {
  return register.has(name)
}

/**
 * List output plugins.
 *
 * @access public
 * @memberof module:@citation-js/core.plugins.output
 * @method list
 *
 * @return {Array<String>} list of plugins
 */
export function list () {
  return register.list()
}

/**
 * Call output plugin
 *
 * @access public
 * @memberof module:@citation-js/core.plugins.output
 * @method format
 *
 * @param {module:@citation-js/core.plugins.output~formatterName} name - output format name
 * @param {Array<module:@citation-js/core~CSL>} data - all entries
 * @param {...*} options - output options
 */
export function format (name, data, ...options) {
  if (!register.has(name)) {
    throw new Error(`Output format "${name}" unavailable`)
  }
  return register.get(name)(data, ...options)
}