From ceee66ed46eedc0064fd378e25d27413486817af Mon Sep 17 00:00:00 2001 From: bkellam Date: Thu, 20 Nov 2025 16:03:38 -0800 Subject: [PATCH] refactor --- .../components/lightweightCodeHighlighter.tsx | 2 +- .../components/searchBar/useSuggestionsData.ts | 2 +- .../components/codePreviewPanel/codePreview.tsx | 2 +- .../search/components/codePreviewPanel/index.tsx | 2 +- .../search/components/filterPanel/index.tsx | 2 +- .../components/filterPanel/useFilterMatches.ts | 2 +- .../search/components/searchResultsPage.tsx | 2 +- .../components/searchResultsPanel/fileMatch.tsx | 2 +- .../searchResultsPanel/fileMatchContainer.tsx | 2 +- .../components/searchResultsPanel/index.tsx | 2 +- .../src/app/[domain]/search/useStreamedSearch.ts | 2 +- packages/web/src/app/api/(client)/client.ts | 6 ++++-- packages/web/src/app/api/(server)/search/route.ts | 3 +-- .../src/app/api/(server)/stream_search/route.ts | 3 +-- .../components/exploreMenu/referenceList.tsx | 2 +- .../symbolHoverPopup/symbolDefinitionPreview.tsx | 2 +- .../symbolHoverPopup/useHoveredOverSymbolInfo.ts | 2 +- packages/web/src/features/chat/tools.ts | 2 +- packages/web/src/features/codeNav/api.ts | 2 +- packages/web/src/features/search/fileSourceApi.ts | 2 +- packages/web/src/features/search/index.ts | 15 +++++++++++++++ .../extensions/searchResultHighlightExtension.ts | 2 +- 22 files changed, 39 insertions(+), 24 deletions(-) create mode 100644 packages/web/src/features/search/index.ts diff --git a/packages/web/src/app/[domain]/components/lightweightCodeHighlighter.tsx b/packages/web/src/app/[domain]/components/lightweightCodeHighlighter.tsx index bb5912ea..f72e6485 100644 --- a/packages/web/src/app/[domain]/components/lightweightCodeHighlighter.tsx +++ b/packages/web/src/app/[domain]/components/lightweightCodeHighlighter.tsx @@ -6,7 +6,7 @@ import { memo, useEffect, useMemo, useState } from 'react' import { useCodeMirrorHighlighter } from '@/hooks/useCodeMirrorHighlighter' import tailwind from '@/tailwind' import { measure } from '@/lib/utils' -import { SourceRange } from '@/features/search/types' +import { SourceRange } from '@/features/search' // Define a plain text language const plainTextLanguage = StreamLanguage.define({ diff --git a/packages/web/src/app/[domain]/components/searchBar/useSuggestionsData.ts b/packages/web/src/app/[domain]/components/searchBar/useSuggestionsData.ts index 69e1040c..e2279758 100644 --- a/packages/web/src/app/[domain]/components/searchBar/useSuggestionsData.ts +++ b/packages/web/src/app/[domain]/components/searchBar/useSuggestionsData.ts @@ -5,7 +5,7 @@ import { Suggestion, SuggestionMode } from "./searchSuggestionsBox"; import { getRepos, search } from "@/app/api/(client)/client"; import { getSearchContexts } from "@/actions"; import { useMemo } from "react"; -import { SearchSymbol } from "@/features/search/types"; +import { SearchSymbol } from "@/features/search"; import { languageMetadataMap } from "@/lib/languageMetadata"; import { VscSymbolClass, diff --git a/packages/web/src/app/[domain]/search/components/codePreviewPanel/codePreview.tsx b/packages/web/src/app/[domain]/search/components/codePreviewPanel/codePreview.tsx index 2d2eadbc..e62917ce 100644 --- a/packages/web/src/app/[domain]/search/components/codePreviewPanel/codePreview.tsx +++ b/packages/web/src/app/[domain]/search/components/codePreviewPanel/codePreview.tsx @@ -3,7 +3,7 @@ import { EditorContextMenu } from "@/app/[domain]/components/editorContextMenu"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; -import { SearchResultChunk } from "@/features/search/types"; +import { SearchResultChunk } from "@/features/search"; import { useCodeMirrorTheme } from "@/hooks/useCodeMirrorTheme"; import { useKeymapExtension } from "@/hooks/useKeymapExtension"; import { useCodeMirrorLanguageExtension } from "@/hooks/useCodeMirrorLanguageExtension"; diff --git a/packages/web/src/app/[domain]/search/components/codePreviewPanel/index.tsx b/packages/web/src/app/[domain]/search/components/codePreviewPanel/index.tsx index d1a7e66f..d19b15b9 100644 --- a/packages/web/src/app/[domain]/search/components/codePreviewPanel/index.tsx +++ b/packages/web/src/app/[domain]/search/components/codePreviewPanel/index.tsx @@ -2,7 +2,7 @@ import { useQuery } from "@tanstack/react-query"; import { CodePreview } from "./codePreview"; -import { SearchResultFile } from "@/features/search/types"; +import { SearchResultFile } from "@/features/search"; import { SymbolIcon } from "@radix-ui/react-icons"; import { SetStateAction, Dispatch, useMemo } from "react"; import { unwrapServiceError } from "@/lib/utils"; diff --git a/packages/web/src/app/[domain]/search/components/filterPanel/index.tsx b/packages/web/src/app/[domain]/search/components/filterPanel/index.tsx index c27c5d16..f3155f79 100644 --- a/packages/web/src/app/[domain]/search/components/filterPanel/index.tsx +++ b/packages/web/src/app/[domain]/search/components/filterPanel/index.tsx @@ -1,7 +1,7 @@ 'use client'; import { FileIcon } from "@/components/ui/fileIcon"; -import { RepositoryInfo, SearchResultFile } from "@/features/search/types"; +import { RepositoryInfo, SearchResultFile } from "@/features/search"; import { cn, getCodeHostInfoForRepo } from "@/lib/utils"; import { LaptopIcon } from "@radix-ui/react-icons"; import Image from "next/image"; diff --git a/packages/web/src/app/[domain]/search/components/filterPanel/useFilterMatches.ts b/packages/web/src/app/[domain]/search/components/filterPanel/useFilterMatches.ts index 5951d8ea..6a66f97a 100644 --- a/packages/web/src/app/[domain]/search/components/filterPanel/useFilterMatches.ts +++ b/packages/web/src/app/[domain]/search/components/filterPanel/useFilterMatches.ts @@ -1,6 +1,6 @@ 'use client'; -import { SearchResultFile } from "@/features/search/types"; +import { SearchResultFile } from "@/features/search"; import { useMemo } from "react"; import { useGetSelectedFromQuery } from "./useGetSelectedFromQuery"; diff --git a/packages/web/src/app/[domain]/search/components/searchResultsPage.tsx b/packages/web/src/app/[domain]/search/components/searchResultsPage.tsx index 285def39..b3156169 100644 --- a/packages/web/src/app/[domain]/search/components/searchResultsPage.tsx +++ b/packages/web/src/app/[domain]/search/components/searchResultsPage.tsx @@ -11,7 +11,7 @@ import { } from "@/components/ui/resizable"; import { Separator } from "@/components/ui/separator"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; -import { RepositoryInfo, SearchResultFile, SearchStats } from "@/features/search/types"; +import { RepositoryInfo, SearchResultFile, SearchStats } from "@/features/search"; import useCaptureEvent from "@/hooks/useCaptureEvent"; import { useDomain } from "@/hooks/useDomain"; import { useNonEmptyQueryParam } from "@/hooks/useNonEmptyQueryParam"; diff --git a/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatch.tsx b/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatch.tsx index d6e6b8ab..33433392 100644 --- a/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatch.tsx +++ b/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatch.tsx @@ -1,6 +1,6 @@ 'use client'; -import { SearchResultFile, SearchResultChunk } from "@/features/search/types"; +import { SearchResultFile, SearchResultChunk } from "@/features/search"; import { LightweightCodeHighlighter } from "@/app/[domain]/components/lightweightCodeHighlighter"; import Link from "next/link"; import { getBrowsePath } from "@/app/[domain]/browse/hooks/utils"; diff --git a/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatchContainer.tsx b/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatchContainer.tsx index e7740ca9..2779b301 100644 --- a/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatchContainer.tsx +++ b/packages/web/src/app/[domain]/search/components/searchResultsPanel/fileMatchContainer.tsx @@ -5,7 +5,7 @@ import { Separator } from "@/components/ui/separator"; import { DoubleArrowDownIcon, DoubleArrowUpIcon } from "@radix-ui/react-icons"; import { useMemo } from "react"; import { FileMatch } from "./fileMatch"; -import { RepositoryInfo, SearchResultFile } from "@/features/search/types"; +import { RepositoryInfo, SearchResultFile } from "@/features/search"; import { Button } from "@/components/ui/button"; export const MAX_MATCHES_TO_PREVIEW = 3; diff --git a/packages/web/src/app/[domain]/search/components/searchResultsPanel/index.tsx b/packages/web/src/app/[domain]/search/components/searchResultsPanel/index.tsx index 5d199cc0..de7604a7 100644 --- a/packages/web/src/app/[domain]/search/components/searchResultsPanel/index.tsx +++ b/packages/web/src/app/[domain]/search/components/searchResultsPanel/index.tsx @@ -1,6 +1,6 @@ 'use client'; -import { RepositoryInfo, SearchResultFile } from "@/features/search/types"; +import { RepositoryInfo, SearchResultFile } from "@/features/search"; import { useVirtualizer, VirtualItem } from "@tanstack/react-virtual"; import { useDebounce } from "@uidotdev/usehooks"; import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from "react"; diff --git a/packages/web/src/app/[domain]/search/useStreamedSearch.ts b/packages/web/src/app/[domain]/search/useStreamedSearch.ts index 92a3475a..a67d6972 100644 --- a/packages/web/src/app/[domain]/search/useStreamedSearch.ts +++ b/packages/web/src/app/[domain]/search/useStreamedSearch.ts @@ -1,6 +1,6 @@ 'use client'; -import { RepositoryInfo, SearchRequest, SearchResultFile, SearchStats, StreamedSearchResponse } from '@/features/search/types'; +import { RepositoryInfo, SearchRequest, SearchResultFile, SearchStats, StreamedSearchResponse } from '@/features/search'; import { useState, useCallback, useRef, useEffect } from 'react'; import * as Sentry from '@sentry/nextjs'; diff --git a/packages/web/src/app/api/(client)/client.ts b/packages/web/src/app/api/(client)/client.ts index 6b4b2977..08a01b5b 100644 --- a/packages/web/src/app/api/(client)/client.ts +++ b/packages/web/src/app/api/(client)/client.ts @@ -4,10 +4,12 @@ import { ServiceError } from "@/lib/serviceError"; import { GetVersionResponse, GetReposResponse } from "@/lib/types"; import { isServiceError } from "@/lib/utils"; import { - FileSourceResponse, - FileSourceRequest, SearchRequest, SearchResponse, +} from "@/features/search"; +import { + FileSourceRequest, + FileSourceResponse, } from "@/features/search/types"; import { FindRelatedSymbolsRequest, diff --git a/packages/web/src/app/api/(server)/search/route.ts b/packages/web/src/app/api/(server)/search/route.ts index b78a2991..92ba4f2a 100644 --- a/packages/web/src/app/api/(server)/search/route.ts +++ b/packages/web/src/app/api/(server)/search/route.ts @@ -1,10 +1,9 @@ 'use server'; -import { search } from "@/features/search/searchApi"; +import { search, searchRequestSchema } from "@/features/search"; import { isServiceError } from "@/lib/utils"; import { NextRequest } from "next/server"; import { schemaValidationError, serviceErrorResponse } from "@/lib/serviceError"; -import { searchRequestSchema } from "@/features/search/types"; export const POST = async (request: NextRequest) => { const body = await request.json(); diff --git a/packages/web/src/app/api/(server)/stream_search/route.ts b/packages/web/src/app/api/(server)/stream_search/route.ts index 409079a7..03057978 100644 --- a/packages/web/src/app/api/(server)/stream_search/route.ts +++ b/packages/web/src/app/api/(server)/stream_search/route.ts @@ -1,7 +1,6 @@ 'use server'; -import { streamSearch } from '@/features/search/searchApi'; -import { searchRequestSchema } from '@/features/search/types'; +import { streamSearch, searchRequestSchema } from '@/features/search'; import { schemaValidationError, serviceErrorResponse } from '@/lib/serviceError'; import { isServiceError } from '@/lib/utils'; import { NextRequest } from 'next/server'; diff --git a/packages/web/src/ee/features/codeNav/components/exploreMenu/referenceList.tsx b/packages/web/src/ee/features/codeNav/components/exploreMenu/referenceList.tsx index e2febdd2..700ff691 100644 --- a/packages/web/src/ee/features/codeNav/components/exploreMenu/referenceList.tsx +++ b/packages/web/src/ee/features/codeNav/components/exploreMenu/referenceList.tsx @@ -4,7 +4,7 @@ import { getBrowsePath } from "@/app/[domain]/browse/hooks/utils"; import { PathHeader } from "@/app/[domain]/components/pathHeader"; import { LightweightCodeHighlighter } from "@/app/[domain]/components/lightweightCodeHighlighter"; import { FindRelatedSymbolsResponse } from "@/features/codeNav/types"; -import { RepositoryInfo, SourceRange } from "@/features/search/types"; +import { RepositoryInfo, SourceRange } from "@/features/search"; import { useMemo, useRef } from "react"; import useCaptureEvent from "@/hooks/useCaptureEvent"; import { useVirtualizer } from "@tanstack/react-virtual"; diff --git a/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/symbolDefinitionPreview.tsx b/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/symbolDefinitionPreview.tsx index 39e90c66..a087273c 100644 --- a/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/symbolDefinitionPreview.tsx +++ b/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/symbolDefinitionPreview.tsx @@ -2,7 +2,7 @@ import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { LightweightCodeHighlighter } from "@/app/[domain]/components/lightweightCodeHighlighter"; import { useMemo } from "react"; -import { SourceRange } from "@/features/search/types"; +import { SourceRange } from "@/features/search"; interface SymbolDefinitionPreviewProps { symbolDefinition: { diff --git a/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/useHoveredOverSymbolInfo.ts b/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/useHoveredOverSymbolInfo.ts index 03752820..b8336a93 100644 --- a/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/useHoveredOverSymbolInfo.ts +++ b/packages/web/src/ee/features/codeNav/components/symbolHoverPopup/useHoveredOverSymbolInfo.ts @@ -1,5 +1,5 @@ import { findSearchBasedSymbolDefinitions } from "@/app/api/(client)/client"; -import { SourceRange } from "@/features/search/types"; +import { SourceRange } from "@/features/search"; import { useDomain } from "@/hooks/useDomain"; import { unwrapServiceError } from "@/lib/utils"; import { useQuery } from "@tanstack/react-query"; diff --git a/packages/web/src/features/chat/tools.ts b/packages/web/src/features/chat/tools.ts index 60ed8714..2d15a8c9 100644 --- a/packages/web/src/features/chat/tools.ts +++ b/packages/web/src/features/chat/tools.ts @@ -1,5 +1,5 @@ import { z } from "zod" -import { search } from "@/features/search/searchApi" +import { search } from "@/features/search" import { InferToolInput, InferToolOutput, InferUITool, tool, ToolUIPart } from "ai"; import { isServiceError } from "@/lib/utils"; import { getFileSource } from "../search/fileSourceApi"; diff --git a/packages/web/src/features/codeNav/api.ts b/packages/web/src/features/codeNav/api.ts index ab2cd7a9..d721dbe9 100644 --- a/packages/web/src/features/codeNav/api.ts +++ b/packages/web/src/features/codeNav/api.ts @@ -1,7 +1,7 @@ import 'server-only'; import { sew } from "@/actions"; -import { search } from "@/features/search/searchApi"; +import { search } from "@/features/search"; import { ServiceError } from "@/lib/serviceError"; import { isServiceError } from "@/lib/utils"; import { withOptionalAuthV2 } from "@/withAuthV2"; diff --git a/packages/web/src/features/search/fileSourceApi.ts b/packages/web/src/features/search/fileSourceApi.ts index 2c9b153f..15cb93c3 100644 --- a/packages/web/src/features/search/fileSourceApi.ts +++ b/packages/web/src/features/search/fileSourceApi.ts @@ -8,7 +8,7 @@ import { withOptionalAuthV2 } from "@/withAuthV2"; import { QueryIR } from './ir'; // @todo (bkellam) #574 : We should really be using `git show :` to fetch file contents here. // This will allow us to support permalinks to files at a specific revision that may not be indexed -// by zoekt. +// by zoekt. We should also refactor this out of the /search folder. export const getFileSource = async ({ fileName, repository, branch }: FileSourceRequest): Promise => sew(() => withOptionalAuthV2(async () => { diff --git a/packages/web/src/features/search/index.ts b/packages/web/src/features/search/index.ts new file mode 100644 index 00000000..665e070e --- /dev/null +++ b/packages/web/src/features/search/index.ts @@ -0,0 +1,15 @@ +export { search, streamSearch } from './searchApi'; +export { + searchRequestSchema, +} from './types'; +export type { + SourceRange, + SearchSymbol, + RepositoryInfo, + SearchRequest, + SearchResultFile, + SearchStats, + StreamedSearchResponse, + SearchResultChunk, + SearchResponse, +} from './types'; \ No newline at end of file diff --git a/packages/web/src/lib/extensions/searchResultHighlightExtension.ts b/packages/web/src/lib/extensions/searchResultHighlightExtension.ts index 58364f56..d3f74646 100644 --- a/packages/web/src/lib/extensions/searchResultHighlightExtension.ts +++ b/packages/web/src/lib/extensions/searchResultHighlightExtension.ts @@ -1,6 +1,6 @@ import { EditorSelection, Extension, StateEffect, StateField, Text, Transaction } from "@codemirror/state"; import { Decoration, DecorationSet, EditorView } from "@codemirror/view"; -import { SourceRange } from "@/features/search/types"; +import { SourceRange } from "@/features/search"; const setMatchState = StateEffect.define<{ selectedMatchIndex: number,