text: 'use strict'
  
  const path = require('path')
  
  const dotProp = require('dot-prop')
  const md5Hex = require('md5-hex')
  
  const errors = require('./errors')
  const readSafe = require('./readSafe')
  
  function hashSource (source, cache) {
    if (cache && cache.sourceHashes && cache.sourceHashes.has(source)) {
      return cache.sourceHashes.get(source)
    }
  
    const basename = path.basename(source)
    const parts = basename.split('#')
    const filename = parts[0]
    const filepath = path.join(path.dirname(source), filename)
  
    const pkgAccessor = filename === 'package.json'
      ? parts[1] || 'babel'
      : null
  
    const promise = readSafe(filepath, cache)
      .then(contents => {
        if (!contents) throw new errors.NoSourceFileError(source)
  
        if (!pkgAccessor) {
          return md5Hex(contents)
        }
  
        const json = JSON.parse(contents.toString('utf8'))
        const value = dotProp.get(json, pkgAccessor) || {}
        return md5Hex(JSON.stringify(value))
      })
  
    if (cache && cache.sourceHashes) {
      cache.sourceHashes.set(source, promise)
    }
    return promise
  }
  
  function hashSources (sources, fixedHashes, cache) {
    const promises = sources.map(item => {
      if (fixedHashes && fixedHashes.has(item.source)) return fixedHashes.get(item.source)
      return hashSource(item.source, cache)
    })
    return Promise.all(promises)
  }
  module.exports = hashSources
  