Skip to content

refactor: search.ts の fileMap build で regex .replace を endsWith + slice に置換 #240

Description

@ymnao

概要

electron/main/ipc/search.ts:530-538 の fileMap build で basename(filePath).replace(/\.md$/i, "").normalize("NFC") を使っている。正規表現 .replace(/\.md$/i, "") は同 file の line 512 で既に採用済の endsWith('.md') + slice(0, -3) pattern と統一すれば、regex eval を回避できる。

1k file workspace では +N 回の regex eval / NFC normalization。allocation 効果は微小だが、scripta は walkMdFiles で小文字 .md のみ対象にしているため、case-insensitive な .replace(/\.md$/i, "") も不要 (endsWith('.md') で十分)。

背景

PR #235/code-review max Efficiency 軸で検出。同 file 内で 2 つの pattern が混在しているため、convention 統一が目的。

// search.ts:512 (既存 pattern、採用済)
if (!targetBase.endsWith(".md")) return [];
const targetPage = targetBase.slice(0, -3).normalize("NFC");

// search.ts:530-538 (該当箇所、未統一)
for (const filePath of inFiles) {
  const name = basename(filePath).replace(/\.md$/i, "").normalize("NFC");
  if (!name) continue;
  const existing = fileMap.get(name);
  ...
}

要件

search.ts:532.replace(/\.md$/i, "")slice(0, -3) に置換。walkMdFiles で小文字 .md のみが対象 (line 28) なので case-insensitive 不要。

// After
for (const filePath of inFiles) {
  const base = basename(filePath);
  if (!base.endsWith(".md")) continue;  // walkMdFiles で保証されるが defensive
  const name = base.slice(0, -3).normalize("NFC");
  if (!name) continue;
  ...
}

または、walkMdFiles の guarantee に頼って endsWith check は省略:

const name = basename(filePath).slice(0, -3).normalize("NFC");

動作確認ポイント

  • pnpm test で全 search 関連 test pass
  • pnpm typecheck clean
  • e2e mock 側 (e2e/helpers/electron-api-mock.ts:796) も同 pattern なので対称に統一を検討

関連ファイル

  • electron/main/ipc/search.ts:530-538
  • e2e/helpers/electron-api-mock.ts:796 (mock 側の対称箇所、対応可)

参考

  • PR #235 の skip 別 issue 候補 4
  • /code-review max Efficiency (Phase 1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions