Source: lib/mime.js

/*jshint laxcomma: true, smarttabs: true, node: true*/
'use strict';
/**
 * Small lib for dealing with negotiation of mime types.
 * @module tastypie/lib/mime
 * @author Eric Satterwhite
 * @since 0.1.0
 * @requires accepts
 * @requires mime
 * @requires mime/types
 * @requires mout/array/intersection
 */

const accepts      = require( 'accepts' )
  , mime         = require( 'mime' )
  , intersection = require( 'mout/array/intersection' )
  , types        = require( 'mime/types' )
  ;

const EMPTY_STRING = '';

class Mime extends mime.Mime {

    constructor(){
        super();
        this.default_type = null;
        this.define( types );
    }

    lookup( format, fallback ){
        return super.lookup( format || EMPTY_STRING, fallback );
    }

    extension( ext ){
        return super.extension( ext || EMPTY_STRING );
    }
    /**
     * best guess determination of request mime type from Accept header
     * @param {Request} request
     * @param {String[]} types
     * @return {String}
     **/
    static determine( req, types ){

        types = Array.isArray( types ) && types.length ? types : null;

        var accept = accepts( req )
          , allowed = types || accept.types()
          ;

        return intersection( accept.types(), allowed )[0];
    }

    /**
     * Returns a full mime type given a short hand version
     * @param {String} type a content type to look up
     * @return String
     * @example mime.from( 'json' ) // application/json
     **/
    static from( type ){
        return  type ? mime.lookup( type ) : null;
    }

    /**
     * Shortcut to mime.define. Provides a way to define custom mime types
     **/
    static define( map ){
        return mime.define.call( mime, map );
    }
}

module.exports = Mime;