arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
socketioMEANseed/www/node_modules/mime/mime.js
www/node_modules/mime/mime.jsRaw
  1var path = require('path');
  2var fs = require('fs');
  3
  4function Mime() {
  5  // Map of extension -> mime type
  6  this.types = Object.create(null);
  7
  8  // Map of mime type -> extension
  9  this.extensions = Object.create(null);
 10}
 11
 12/**
 13 * Define mimetype -> extension mappings.  Each key is a mime-type that maps
 14 * to an array of extensions associated with the type.  The first extension is
 15 * used as the default extension for the type.
 16 *
 17 * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
 18 *
 19 * @param map (Object) type definitions
 20 */
 21Mime.prototype.define = function (map) {
 22  for (var type in map) {
 23    var exts = map[type];
 24    for (var i = 0; i < exts.length; i++) {
 25      if (process.env.DEBUG_MIME && this.types[exts]) {
 26        console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
 27          this.types[exts] + ' to ' + type);
 28      }
 29
 30      this.types[exts[i]] = type;
 31    }
 32
 33    // Default extension is the first one we encounter
 34    if (!this.extensions[type]) {
 35      this.extensions[type] = exts[0];
 36    }
 37  }
 38};
 39
 40/**
 41 * Load an Apache2-style ".types" file
 42 *
 43 * This may be called multiple times (it's expected).  Where files declare
 44 * overlapping types/extensions, the last file wins.
 45 *
 46 * @param file (String) path of file to load.
 47 */
 48Mime.prototype.load = function(file) {
 49  this._loading = file;
 50  // Read file and split into lines
 51  var map = {},
 52      content = fs.readFileSync(file, 'ascii'),
 53      lines = content.split(/[\r\n]+/);
 54
 55  lines.forEach(function(line) {
 56    // Clean up whitespace/comments, and split into fields
 57    var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
 58    map[fields.shift()] = fields;
 59  });
 60
 61  this.define(map);
 62
 63  this._loading = null;
 64};
 65
 66/**
 67 * Lookup a mime type based on extension
 68 */
 69Mime.prototype.lookup = function(path, fallback) {
 70  var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase();
 71
 72  return this.types[ext] || fallback || this.default_type;
 73};
 74
 75/**
 76 * Return file extension associated with a mime type
 77 */
 78Mime.prototype.extension = function(mimeType) {
 79  var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
 80  return this.extensions[type];
 81};
 82
 83// Default instance
 84var mime = new Mime();
 85
 86// Define built-in types
 87mime.define(require('./types.json'));
 88
 89// Default type
 90mime.default_type = mime.lookup('bin');
 91
 92//
 93// Additional API specific to the default instance
 94//
 95
 96mime.Mime = Mime;
 97
 98/**
 99 * Lookup a charset based on mime type.
100 */
101mime.charsets = {
102  lookup: function(mimeType, fallback) {
103    // Assume text types are utf8
104    return (/^text\//).test(mimeType) ? 'UTF-8' : fallback;
105  }
106};
107
108module.exports = mime;