protected static function findSources()

in src/build/BuildStep.php [61:114]


  protected static function findSources(
    string $root,
    \ConstSet<string> $extensions,
  ): vec<string> {
    $root = \realpath($root);
    Log::i("\nFinding sources in %s", $root);

    $index = self::getIndexFile($root);
    if ($index !== null && \file_exists($index)) {
      $files = JSON\decode_as_shape(
        DirectoryIndex::class,
        \file_get_contents($index),
      )['files'];
      Log::v(' (cached)');
      return Vec\filter(
        $files,
        $f ==> C\any($extensions, $ext ==> Str\ends_with($f, '.'.$ext)),
      );
    }

    $rdi = new \RecursiveDirectoryIterator(
      $root,
      \FilesystemIterator::CURRENT_AS_FILEINFO |
        \FilesystemIterator::FOLLOW_SYMLINKS,
    );
    $rii = new \RecursiveIteratorIterator(
      $rdi,
      \RecursiveIteratorIterator::CHILD_FIRST,
    );
    $all_files = vec[];
    $files = vec[];
    foreach ($rii as $info) {
      if (!$info->isFile()) {
        continue;
      }
      $all_files[] = $info->getPathname();
      if ($extensions->contains($info->getExtension())) {
        $files[] = $info->getPathname();
        Log::v('.');
      }
    }

    if ($index !== null) {
      if (!\file_exists(BuildPaths::DIR_INDEX_ROOT)) {
        \mkdir(BuildPaths::DIR_INDEX_ROOT, 0755);
      }
      \file_put_contents(
        $index,
        JSON\encode_shape(DirectoryIndex::class, shape('files' => $all_files)),
      );
    }

    return $files;
  }