Skip to content

Commit

Permalink
Add build step to fetch mime.types from Apache and build types.json
Browse files Browse the repository at this point in the history
  • Loading branch information
broofa committed Nov 27, 2014
1 parent dacee09 commit f4b03d8
Show file tree
Hide file tree
Showing 9 changed files with 130 additions and 1,683 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
npm-debug.log
54 changes: 54 additions & 0 deletions build/build.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
var path = require('path');
var fs = require('fs');
var request = require('request');

// The canonical URL at which Apache's mime type mappings are located
var APACHE_TYPES = 'http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types';

// Local file for node.js community-specific mappings
var NODE_TYPES = 'node.types';

/**
* Parse a types string (formatted like Apache's mime.types) for type
* information
*
* @param typesMap {?Object}
* @param typesString {String}
*/
function parseTypes(typesMap, typesString) {
return typesString.split(/[\r\n]+/)
.map(function(line) {
return line.toLowerCase()
.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
})
.filter(function(fields) {
return fields.length > 1;
})
.reduce(function(types, fields) {
var type = fields.shift();
types[type] = types.hasOwnProperty(type) ?
types[type].concat(fields) : fields;
return types;
}, typesMap || {});
}


function handleApacheResponse(err, res, apacheTypes) {
if (err) {
throw err;
}

if (res.statusCode != 200) {
throw new Error('Unexpected HTTP statusCode = ' + res.statusCode);
}

// Combine mime.types and node.types
var mapByType = [
apacheTypes,
fs.readFileSync(path.join(__dirname, NODE_TYPES), 'ascii')
].reduce(parseTypes, {});

console.log(JSON.stringify(mapByType, null, 2));
}

request.get(APACHE_TYPES, handleApacheResponse);
File renamed without changes.
57 changes: 57 additions & 0 deletions build/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/**
* Usage: node test.js
*/

var mime = require('../mime');
var assert = require('assert');
var path = require('path');

//
// Test mime lookups
//

assert.equal('text/plain', mime.lookup('text.txt')); // normal file
assert.equal('text/plain', mime.lookup('TEXT.TXT')); // uppercase
assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file
assert.equal('text/plain', mime.lookup('.text.txt')); // hidden file
assert.equal('text/plain', mime.lookup('.txt')); // nameless
assert.equal('text/plain', mime.lookup('txt')); // extension-only
assert.equal('text/plain', mime.lookup('/txt')); // extension-less ()
assert.equal('text/plain', mime.lookup('\\txt')); // Windows, extension-less
assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized
assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default

//
// Test extensions
//

assert.equal('txt', mime.extension(mime.types.text));
assert.equal('html', mime.extension(mime.types.htm));
assert.equal('bin', mime.extension('application/octet-stream'));
assert.equal('bin', mime.extension('application/octet-stream '));
assert.equal('html', mime.extension(' text/html; charset=UTF-8'));
assert.equal('html', mime.extension('text/html; charset=UTF-8 '));
assert.equal('html', mime.extension('text/html; charset=UTF-8'));
assert.equal('html', mime.extension('text/html ; charset=UTF-8'));
assert.equal('html', mime.extension('text/html;charset=UTF-8'));
assert.equal('html', mime.extension('text/Html;charset=UTF-8'));
assert.equal(undefined, mime.extension('unrecognized'));

//
// Test node.types lookups
//

assert.equal('application/font-woff', mime.lookup('file.woff'));
assert.equal('application/octet-stream', mime.lookup('file.buffer'));
assert.equal('audio/mp4', mime.lookup('file.m4a'));
assert.equal('font/opentype', mime.lookup('file.otf'));

//
// Test charsets
//

assert.equal('UTF-8', mime.charsets.lookup('text/plain'));
assert.equal(undefined, mime.charsets.lookup(mime.types.js));
assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));

console.log('\nAll tests passed');
10 changes: 2 additions & 8 deletions mime.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ function Mime() {
Mime.prototype.define = function (map) {
for (var type in map) {
var exts = map[type];

for (var i = 0; i < exts.length; i++) {
if (process.env.DEBUG_MIME && this.types[exts]) {
console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
Expand All @@ -47,7 +46,6 @@ Mime.prototype.define = function (map) {
* @param file (String) path of file to load.
*/
Mime.prototype.load = function(file) {

this._loading = file;
// Read file and split into lines
var map = {},
Expand Down Expand Up @@ -85,12 +83,8 @@ Mime.prototype.extension = function(mimeType) {
// Default instance
var mime = new Mime();

// Load local copy of
// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
mime.load(path.join(__dirname, 'types/mime.types'));

// Load additional types from node.js community
mime.load(path.join(__dirname, 'types/node.types'));
// Define built-in types
mime.define(require('./types.json'));

// Default type
mime.default_type = mime.lookup('bin');
Expand Down
18 changes: 15 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,22 @@
"url": "https://raw.github.com/broofa/node-mime/master/LICENSE"
}
],
"devDependencies": {},
"keywords": ["util", "mime"],
"scripts": {
"build": "node build/build.js > types.json",
"test": "node build/test.js"
},
"devDependencies": {
"request": "^2.48.0"
},
"keywords": [
"util",
"mime"
],
"main": "mime.js",
"name": "mime",
"repository": {"url": "https://github.com/broofa/node-mime", "type": "git"},
"repository": {
"url": "https://github.com/broofa/node-mime",
"type": "git"
},
"version": "1.2.11"
}
84 changes: 0 additions & 84 deletions test.js

This file was deleted.

Empty file added types.json
Empty file.

0 comments on commit f4b03d8

Please sign in to comment.