1
|
#!/usr/bin/env node
|
2
|
|
3
|
'use strict';
|
4
|
|
5
|
var fs = require('fs');
|
6
|
var path = require('path');
|
7
|
var mimeScore = require('mime-score');
|
8
|
|
9
|
var db = require('mime-db');
|
10
|
var chalk = require('chalk');
|
11
|
|
12
|
var STANDARD_FACET_SCORE = 900;
|
13
|
|
14
|
var byExtension = {};
|
15
|
|
16
|
// Clear out any conflict extensions in mime-db
|
17
|
for (var type in db) {
|
18
|
var entry = db[type];
|
19
|
entry.type = type;
|
20
|
if (!entry.extensions) continue;
|
21
|
|
22
|
entry.extensions.forEach(function(ext) {
|
23
|
var drop;
|
24
|
var keep = entry;
|
25
|
if (ext in byExtension) {
|
26
|
var e0 = entry;
|
27
|
var e1 = byExtension[ext];
|
28
|
|
29
|
e0.pri = mimeScore(e0.type, e0.source);
|
30
|
e1.pri = mimeScore(e1.type, e1.source);
|
31
|
|
32
|
drop = e0.pri < e1.pri ? e0 : e1;
|
33
|
keep = e0.pri >= e1.pri ? e0 : e1;
|
34
|
|
35
|
// Prefix lower-priority extensions with '*'
|
36
|
drop.extensions = drop.extensions.map(function(e) {return e == ext ? '*' + e : e});
|
37
|
|
38
|
console.log(
|
39
|
ext + ': Preferring ' + chalk.green(keep.type) + ' (' + keep.pri +
|
40
|
') over ' + chalk.red(drop.type) + ' (' + drop.pri + ')' + ' for ' + ext
|
41
|
);
|
42
|
}
|
43
|
|
44
|
// Cache the hightest ranking type for this extension
|
45
|
if (keep == entry) byExtension[ext] = entry;
|
46
|
});
|
47
|
}
|
48
|
|
49
|
function writeTypesFile(types, path) {
|
50
|
fs.writeFileSync(path, 'module.exports = ' + JSON.stringify(types) + ';');
|
51
|
}
|
52
|
|
53
|
// Segregate into standard and non-standard types based on facet per
|
54
|
// https://tools.ietf.org/html/rfc6838#section-3.1
|
55
|
var standard = {};
|
56
|
var other = {};
|
57
|
|
58
|
Object.keys(db).sort().forEach(function(k) {
|
59
|
var entry = db[k];
|
60
|
|
61
|
if (entry.extensions) {
|
62
|
if (mimeScore(entry.type, entry.source) >= STANDARD_FACET_SCORE) {
|
63
|
standard[entry.type] = entry.extensions;
|
64
|
} else {
|
65
|
other[entry.type] = entry.extensions;
|
66
|
}
|
67
|
}
|
68
|
});
|
69
|
|
70
|
writeTypesFile(standard, path.join(__dirname, '../types', 'standard.js'));
|
71
|
writeTypesFile(other, path.join(__dirname, '../types', 'other.js'));
|