text: // taskr babel plugin with Babel 7 support
  // https://github.com/lukeed/taskr/pull/305
  'use strict'
  
  const transform = require('@babel/core').transform
  const flatten = require('flatten')
  
  const BABEL_REGEX = /(^@babel\/)(preset|plugin)-(.*)/i
  
  function getBabels () {
    const pkg = require('./package.json')
    return flatten(
      ['devDependencies', 'dependencies'].map(s => Object.keys(pkg[s] || {}))
    ).filter(s => BABEL_REGEX.test(s))
  }
  
  module.exports = function (task) {
    let cache
  
    task.plugin('babel', {}, function * (file, opts) {
      if (opts.preload) {
        delete opts.preload
        // get dependencies
        cache = cache || getBabels()
  
        // attach any deps to babel's `opts`
        cache.forEach(dep => {
          const segs = BABEL_REGEX.exec(dep)
          const type = `${segs[2]}s`
          const name = `@babel/${segs[2]}-${segs[3]}`
  
          opts[type] = opts[type] || []
  
          // flatten all (advanced entries are arrays)
          if (flatten(opts[type]).indexOf(name) === -1) {
            opts[type] = opts[type].concat(name)
          }
        })
      }
  
      // attach file's name
      opts.filename = file.base
  
      const output = transform(file.data, opts)
  
      if (output.map) {
        const map = `${file.base}.map`
  
        // append `sourceMappingURL` to original file
        if (opts.sourceMaps !== 'both') {
          output.code += Buffer.from(`\n//# sourceMappingURL=${map}`)
        }
  
        // add sourcemap to `files` array
        this._.files.push({
          base: map,
          dir: file.dir,
          data: Buffer.from(JSON.stringify(output.map))
        })
      }
  
      // update file's data
      file.data = Buffer.from(output.code)
    })
  }
  