text: import { plugins } from '@citation-js/core'
  import { format as mapBiblatex, formatBibtex as mapBibtex } from './entries.js'
  import { format } from './bibtex.js'
  import { format as formatBibtxt } from './bibtxt.js'
  
  const factory = function (mapper, formatter) {
    return function (data, opts = {}) {
      const { type, format = type || 'text' } = opts
      data = mapper(data)
  
      if (format === 'object') {
        return data
      } else if (plugins.dict.has(format)) {
        return formatter(data, plugins.dict.get(format), opts)
      } else {
        throw new RangeError(`Output dictionary "${format}" not available`)
      }
    }
  }
  
  /**
   * @namespace output
   * @type Object<module:@citation-js/core.plugins.output~formatterName,module:@citation-js/core.plugins.output~formatter>
   * @memberof module:@citation-js/plugin-bibtex
   */
  export default {
    /**
     * @function
     * @implements module:@citation-js/core.plugins.output~formatter
     * @memberof module:@citation-js/plugin-bibtex.output
     * @param {Array<module:@citation-js/core~CSL>} data
     * @param {Object} [opts]
     * @param {module:@citation-js/core.plugins.dict~dictName|String} [opts.format='text'] - Output dict name or `'object'` for a representation
     * @return {String|Array<Object>}
     */
    bibtex: factory(mapBibtex, format),
  
    /**
     * @function
     * @implements module:@citation-js/core.plugins.output~formatter
     * @memberof module:@citation-js/plugin-bibtex.output
     * @param {Array<module:@citation-js/core~CSL>} data
     * @param {Object} [opts]
     * @param {module:@citation-js/core.plugins.dict~dictName|String} [opts.format='text'] - Output dict name or `'object'` for a representation
     * @return {String|Array<Object>}
     */
    biblatex: factory(mapBiblatex, format),
  
    /**
     * @function
     * @implements module:@citation-js/core.plugins.output~formatter
     * @memberof module:@citation-js/plugin-bibtex.output
     * @param {Array<module:@citation-js/core~CSL>} data
     * @param {Object} [opts]
     * @param {module:@citation-js/core.plugins.dict~dictName|String} [opts.format='text'] - Output dict name or `'object'` for a representation
     * @return {String|Array<Object>}
     */
    bibtxt: factory(mapBibtex, formatBibtxt)
  }
  