/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict
* @format
*/
'use strict';
const path = require('path');
/**
* This is a way to find files quickly given a RegExp, in a specific directory.
* This is must faster than iterating over all the files and matching both
* directory and RegExp at the same time.
*
* This was first implemented to support finding assets fast, for which we know
* the directory, but we want to identify all variants (ex. @2x, @1x, for
* a picture's different definition levels).
*/
class FilesByDirNameIndex {
_filesByDirName: Map<string, Array<string>>;
constructor(allFilePaths: Iterable<string>) {
this._filesByDirName = new Map();
for (const filePath of allFilePaths) {
const dirName = path.dirname(filePath);
let dir = this._filesByDirName.get(dirName);
if (dir == null) {
dir = [];
this._filesByDirName.set(dirName, dir);
}
dir.push(path.basename(filePath));
}
}
getAllFiles(dirPath: string): $ReadOnlyArray<string> {
return this._filesByDirName.get(dirPath) || [];
}
}
module.exports = FilesByDirNameIndex;