72 lines
1.8 KiB
JavaScript
72 lines
1.8 KiB
JavaScript
|
#!/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'));
|