code: function bundleClient (hoodieClientPath, bundleTargetPath, options, callback) {
    var pluginPaths = options.plugins.map(function (pluginName) {
      return pluginName + '/hoodie/client'
    })
  
    var plugins = [path.resolve('hoodie/client')]
      .concat(pluginPaths)
      .map(p => p.replace(/\\/g,"/") )  // fix backslashes in Windows paths
      .filter(checkModule)
  
    var getPluginsModifiedTimes = plugins.map(function (pluginPath) {
      return getModifiedTime.bind(null, requireResolve(pluginPath))
    })
  
    parallel(getPluginsModifiedTimes.concat([
      getModifiedTime.bind(null, hoodieClientPath),
      getModifiedTime.bind(null, bundleTargetPath)
    ]), function (error, results) {
      /* istanbul ignore if */
      if (error) {
        return callback(error)
      }
  
      var targetTime = results.pop()
      var sourceTime = Math.max.apply(null, results)
      var hasUpdate = sourceTime > targetTime
  
      var get = hasUpdate ? buildBundle.bind(null, options, plugins) : fs.readFile.bind(null, bundleTargetPath)
  
      get(function (error, buffer) {
        if (error) {
          return callback(error)
        }
  
        callback(null, buffer, hasUpdate)
      })
    })
  }
docs: we compare the mtime (modified time) for the last modified dependency of the
  Hoodie client and the target bundle file. If the latter does not exist or
  any dependency was modified more recently, we read out the client and add
  the `new Hoodie()` init code, otherwise we simply read out the bundle file.
  
  This optimisation is in preparation for plugins. Plugins can extend the
  client, so we need to browserify on-the-fly to avoid dependency duplication,
  and avoiding unneeded bundling with browserify saves a significant time.