Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

bug(web): Intermediate directory nodes in buildFileTree receive child leaf paths instead of directory paths

オープン 初心者向け
#1,707 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@riteshvish02 がすでに取り組んでいます。

2026年10月3日 から。

  • #1708 @riteshvish02 による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
88/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
typescript
領域
api, frontend

調査の方向性

packages/web/src/features/git/utils.ts の buildFileTree から始め、次に packages/web/src/app/(app)/browse/components/fileTreePanel.tsx と getTree エンドポイントを調べます。ネストされたパスの例を再現し、中間ディレクトリノードがそれぞれ自身のディレクトリパスを公開していることを、フォルダーの正しい展開と API 出力を含めて確認します。

索引モデルが issue の本文から書いたものです。

説明

Describe the Bug

In packages/web/src/features/git/utils.ts, buildFileTree constructs a nested FileTreeNode hierarchy from a flat list of { type, path } objects.

When creating intermediate directory nodes (lines 68-74), the new node's path property is assigned item.path (the full path of the current leaf file being processed), instead of the path of that directory:

// packages/web/src/features/git/utils.ts:67-75
if (!next) {
    next = {
        name: part,
        path: item.path, // <--- Bug: assigns leaf file's path to intermediate directory node
        type: nodeType,
        children: [],
    };
    current.children.push(next);
}
Impact
  1. Broken Folder State & Expansion in UI: In packages/web/src/app/(app)/browse/components/fileTreePanel.tsx, folder expand/collapse state is tracked via openPaths.has(node.path) and route sync via pathParts.slice(0, i + 1).join('/'). Because directory nodes receive the child file's path instead of their own directory path, clicking folders or deep-linking to nested paths causes folder state tracking and auto-expansion to fail.
  2. Public API Corruption: The getTree endpoint (/api/git/tree) returns FileTreeNode with corrupted directory paths to API consumers.
Reproduction
const flatList = [
    { type: 'blob', path: 'src/components/buttons/PrimaryButton.tsx' }
];

const tree = buildFileTree(flatList);
const srcDir = tree.children[0];
console.log(srcDir.name); // "src"
console.log(srcDir.path); // Expected "src", but Got "src/components/buttons/PrimaryButton.tsx"
Proposed Fix

Reconstruct the directory node's path using parts.slice(0, i + 1).join('/'):

if (!next) {
    next = {
        name: part,
        path: parts.slice(0, i + 1).join('/'),
        type: nodeType,
        children: [],
    };
    current.children.push(next);
}

For intermediate directory levels (i < parts.length - 1), this evaluates to the proper directory path (e.g. "src", "src/components"), and for leaf files (i === parts.length - 1), it matches item.path.

主要言語
TypeScript
スター
3.9k
フォーク
374
平均マージ
17時間 15分
マージ済み PR(30日)
38

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

sourcebot-dev/sourcebot のほかの issue

sourcebot-dev/sourcebot の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。