code: function getLines(filePath) {
    // if (path.isAbsolute(filePath)) throw new Error('Absolute file path is not allowed: ' + filePath);
  
    if (_.isArray(filePath)) {
      // If it's already lines, return the arg.
      return filePath;
    }
  
    if (!fileLines[filePath]) {
      // if the file is moved, find the real file path
      let realFilePath = _.findKey(mvs, s => s === filePath) || filePath;
      // if dir is moved, find the original file path
      Object.keys(mvDirs).forEach(oldDir => {
        if (_.startsWith(realFilePath, mvDirs[oldDir])) {
          realFilePath = realFilePath.replace(mvDirs[oldDir], oldDir);
        }
      });
      // console.log('real file path: ', Object.keys(fileLines), realFilePath);
      const absPath = path.isAbsolute(realFilePath) ? realFilePath : paths.map(realFilePath);
      if (!fs.existsSync(absPath)) {
        throw new Error("Can't find such file: " + realFilePath + '(' + absPath + ')');
      }
      fileLines[filePath] = fs
        .readFileSync(absPath)
        .toString()
        .split(/\r?\n/);
    }
    return fileLines[filePath];
  }
docs: function mapPathAfterMvDir() {}