build.js 1.8 KB

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