docs: function readFiles (directoryPath, options) {
    if (directoryPath == null) {
      return undefined
    }
    var _options = options || {}
    // Collect all files
    var result = util.asPromise((cb) => glob(_options.glob || '**', { cwd: directoryPath, mark: true }, cb))
      .then(function (relativePaths) {
        var set = relativePaths
          // Ignore directories
          .filter((relativePath) => !relativePath.match(/\/$/))
          // Convert to a set based on relative paths
          // (i.e. {'dir/file.txt': 'dir/file.txt'}
          .reduce((set, relativePath) => {
            set[relativePath] = relativePath
            return set
          }, {})
  
        // Create lazy promises (only resolve when .then() is called) acting
        // as leafs (do not dive inside when merging)
        return util.mapValues(set, (relativePath) => {
          var fullPath = path.resolve(directoryPath, relativePath)
          return leaf(lazy(() => {
            return {
              path: path.relative(process.cwd(), fullPath),
              contents: _options.stream
                ? fs.createReadStream(fullPath, { encoding: _options.encoding })
                : util.asPromise((cb) => fs.readFile(fullPath, { encoding: _options.encoding }, cb))
            }
          }))
        })
      })
    result.watch = directoryPath
    return result
  }