docs: async function extractZip(descriptor) {
  
    // Not supported in browser
    if (config.IS_BROWSER) {
      throw new DataPackageError('Zip is not supported in browser')
    }
  
    // Load zip
    const zip = JSZip()
    const tempdir = await promisify(require('tmp').dir)()
    await zip.loadAsync(promisify(fs.readFile)(descriptor))
  
    // Validate zip
    if (!zip.files['datapackage.json']) {
      throw new DataPackageError('Invalid zip with data package')
    }
  
    // Save zip to tempdir
    for (const [name, item] of Object.entries(zip.files)) {
  
      // Get path/descriptor
      const path = `${tempdir}/${name}`
      if (path.endsWith('datapackage.json')) {
        descriptor = path
      }
  
      // Directory
      if (item.dir) {
        await promisify(fs.mkdir)(path)
  
      // File
      } else {
        const contents = await item.async('nodebuffer')
        await promisify(fs.writeFile)(path, contents)
      }
  
    }
  
    return descriptor
  
  }