| #!/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')); |