|  | #!/usr/bin/env node | 
|  |  | 
|  | 'use strict'; | 
|  |  | 
|  | var fs = require('fs'); | 
|  | var path = require('path'); | 
|  | var mimeScore = require('mime-score'); | 
|  |  | 
|  | var db = require('mime-db'); | 
|  | var chalk = require('chalk'); | 
|  |  | 
|  | var STANDARD_FACET_SCORE = 900; | 
|  |  | 
|  | var byExtension = {}; | 
|  |  | 
|  | // Clear out any conflict extensions in mime-db | 
|  | for (var type in db) { | 
|  | var entry = db[type]; | 
|  | entry.type = type; | 
|  | if (!entry.extensions) continue; | 
|  |  | 
|  | entry.extensions.forEach(function(ext) { | 
|  | var drop; | 
|  | var keep = entry; | 
|  | if (ext in byExtension) { | 
|  | var e0 = entry; | 
|  | var e1 = byExtension[ext]; | 
|  |  | 
|  | e0.pri = mimeScore(e0.type, e0.source); | 
|  | e1.pri = mimeScore(e1.type, e1.source); | 
|  |  | 
|  | drop = e0.pri < e1.pri ? e0 : e1; | 
|  | keep = e0.pri >= e1.pri ? e0 : e1; | 
|  |  | 
|  | // Prefix lower-priority extensions with '*' | 
|  | drop.extensions = drop.extensions.map(function(e) {return e == ext ? '*' + e : e}); | 
|  |  | 
|  | console.log( | 
|  | ext + ': Preferring ' + chalk.green(keep.type) + ' (' + keep.pri + | 
|  | ') over ' + chalk.red(drop.type) + ' (' + drop.pri + ')' + ' for ' + ext | 
|  | ); | 
|  | } | 
|  |  | 
|  | // Cache the hightest ranking type for this extension | 
|  | if (keep == entry) byExtension[ext] = entry; | 
|  | }); | 
|  | } | 
|  |  | 
|  | function writeTypesFile(types, path) { | 
|  | fs.writeFileSync(path, 'module.exports = ' + JSON.stringify(types) + ';'); | 
|  | } | 
|  |  | 
|  | // Segregate into standard and non-standard types based on facet per | 
|  | // https://tools.ietf.org/html/rfc6838#section-3.1 | 
|  | var standard = {}; | 
|  | var other = {}; | 
|  |  | 
|  | Object.keys(db).sort().forEach(function(k) { | 
|  | var entry = db[k]; | 
|  |  | 
|  | if (entry.extensions) { | 
|  | if (mimeScore(entry.type, entry.source) >= STANDARD_FACET_SCORE) { | 
|  | standard[entry.type] = entry.extensions; | 
|  | } else { | 
|  | other[entry.type] = entry.extensions; | 
|  | } | 
|  | } | 
|  | }); | 
|  |  | 
|  | writeTypesFile(standard, path.join(__dirname, '../types', 'standard.js')); | 
|  | writeTypesFile(other, path.join(__dirname, '../types', 'other.js')); |