docs: function request (url, options) {
    options = Object.assign({}, defaultOptions, options)
    let savedContent
    let savedResponse
  
    return new Promise((resolve, reject) => {
      fetch(url, options)
        .then(handleResponse)
        .then(handleBody)
        .catch(handleError)
  
      function handleResponse (response) {
        // Save the response for checking the status later
        savedResponse = response
  
        // Decode the response body
        switch (options.type) {
          case 'response':
            return response
          case 'json':
            return response.json()
          default:
            return response.text()
        }
      }
  
      function handleBody (content) {
        // Bubble an error if the response status is not okay
        if (savedResponse && savedResponse.status >= 400) {
          savedContent = content
          throw new Error(`Response status indicates error`)
        }
  
        // All is well!
        resolve(content)
      }
  
      function handleError (err) {
        // Overwrite potential decoding errors when the actual problem was the response
        if (savedResponse && savedResponse.status >= 400) {
          err = new Error(`Status ${savedResponse.status}`)
        }
  
        // Enrich the error message with the response and the content
        let error = new Error(err.message)
        error.response = savedResponse
        error.content = savedContent
        reject(error)
      }
    })
  }