github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libmime/builder/index.js (about)

     1  // Copyright 2018 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  /*
     6   *
     7   * This file is adapted from github.com/jshttp/mime-db, with following LICENSE:
     8   * 
     9   * The MIT License (MIT)
    10   * 
    11   * Copyright (c) 2014 Jonathan Ong me@jongleberry.com
    12   * 
    13   * Permission is hereby granted, free of charge, to any person obtaining a copy
    14   * of this software and associated documentation files (the "Software"), to deal
    15   * in the Software without restriction, including without limitation the rights
    16   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17   * copies of the Software, and to permit persons to whom the Software is
    18   * furnished to do so, subject to the following conditions:
    19   * 
    20   * The above copyright notice and this permission notice shall be included in
    21   * all copies or substantial portions of the Software.
    22   * 
    23   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    26   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29   * THE SOFTWARE.
    30  */
    31  
    32  /**
    33   * Convert these text files to JSON for browser usage.
    34   */
    35  
    36  global.Promise = global.Promise || loadBluebird()
    37  
    38  var co = require('co')
    39  var cogent = require('cogent')
    40  
    41  /**
    42   * Mime types and associated extensions are stored in the form:
    43   *
    44   *   <type> <ext> <ext> <ext>;
    45   */
    46  var typeLineRegExp = /^\s*([\w-]+\/[\w+.-]+)((?:\s+[\w-]+)*);\s*$/gm
    47  
    48  co(function * () {
    49    var url = 'http://hg.nginx.org/nginx/raw-file/default/conf/mime.types'
    50    var res = yield * cogent(url, {
    51      string: true
    52    })
    53  
    54    if (res.statusCode !== 200) {
    55      throw new Error('got status code ' + res.statusCode + ' from ' + url)
    56    }
    57  
    58    var json = {}
    59    var match = null
    60  
    61    typeLineRegExp.index = 0
    62  
    63    while ((match = typeLineRegExp.exec(res.text))) {
    64      var mime = match[1]
    65  
    66      // parse the extensions
    67      var extensions = (match[2] || '')
    68        .split(/\s+/)
    69        .filter(Boolean)
    70      var data = json[mime] || (json[mime] = {})
    71  
    72      // append the extensions
    73      appendExtensions(data, extensions)
    74    }
    75  
    76    printGo(json)
    77  }).then()
    78  
    79  /**
    80   * Append an extension to an object.
    81   */
    82  function appendExtension (obj, extension) {
    83    if (!obj.extensions) {
    84      obj.extensions = []
    85    }
    86  
    87    if (obj.extensions.indexOf(extension) === -1) {
    88      obj.extensions.push(extension)
    89    }
    90  }
    91  
    92  /**
    93   * Append extensions to an object.
    94   */
    95  function appendExtensions (obj, extensions) {
    96    if (extensions.length === 0) {
    97      return
    98    }
    99  
   100    for (var i = 0; i < extensions.length; i++) {
   101      var extension = extensions[i]
   102  
   103      // add extension to the type entry
   104      appendExtension(obj, extension)
   105    }
   106  }
   107  
   108  /**
   109   * Load the Bluebird promise.
   110   */
   111  function loadBluebird () {
   112    var Promise = require('bluebird')
   113  
   114    // Silence all warnings
   115    Promise.config({
   116      warnings: false
   117    })
   118  
   119    return Promise
   120  }
   121  
   122  function getExtensionTypePairs(types) {
   123    return Object.keys(types).reduce( (accu, type) => {
   124      types[type].extensions.forEach( (ext) => accu.push({ext, type}) )
   125      return accu
   126    }, []).sort( (a, b) => a.ext < b.ext ? -1 : a.ext === b.ext ? 0 : 1)
   127  }
   128  
   129  function printGo(types) {
   130    process.stdout.write(`// Copyright 2018 Keybase Inc. All rights reserved.\n`)
   131    process.stdout.write(`// Use of this source code is governed by a BSD\n`)
   132    process.stdout.write(`// license that can be found in the LICENSE file.\n\n`)
   133    process.stdout.write(`// This file is auto-generated and should not be edited by hand.\n\n`)
   134    process.stdout.write(`package libmime\n\n`)
   135    process.stdout.write(`var mimeTypes = map[string]string{\n`)
   136    getExtensionTypePairs(types).forEach( ({ext, type}) => {
   137      process.stdout.write(`\t".${ext}": "${type}",\n`)
   138    })
   139    process.stdout.write(`}\n`)
   140  }