-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature/dx supabase #102
Feature/dx supabase #102
Conversation
d.ts.map 파일은 command + 좌클릭 시 d.ts가 아니라 .ts파일을 찾게 해준다.
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Walkthrough이번 변경 사항은 Changes
Possibly related PRs
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
@coderabbitai full review |
✅ Actions performedFull review triggered. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 12
🧹 Outside diff range and nitpick comments (59)
packages/shared/src/constants/Cookie.ts (1)
1-5
: 타입 안전성을 위해 타입 정의를 추가하는 것이 좋겠습니다.타입스크립트의 장점을 최대한 활용하기 위해 다음과 같은 개선을 제안합니다:
+type CookieKeyType = { + readonly accessToken: string; + readonly refreshToken: string; + readonly sideBarState: string; +}; + -export const COOKIE_KEY = { +export const COOKIE_KEY: CookieKeyType = { accessToken: 'access_token', refreshToken: 'refresh_token', sideBarState: 'sidebar_state', };이렇게 하면:
- 타입 안전성이 향상됩니다
- readonly를 통해 실수로 값이 변경되는 것을 방지할 수 있습니다
- IDE의 자동완성 기능이 더 정확해집니다
packages/shared/src/utils/String.ts (1)
1-4
: 더 간결한 구현을 제안드립니다.현재 구현은 명시적인
return false
를 사용하고 있는데, 다음과 같이 더 간결하게 작성할 수 있습니다:-export const checkStringArray = (value: unknown): value is string[] => { - if (Array.isArray(value) && value.every(item => typeof item === 'string')) return true; - return false; -}; +export const checkStringArray = (value: unknown): value is string[] => + Array.isArray(value) && value.every(item => typeof item === 'string');packages/shared/src/constants/Supabase.ts (2)
1-1
: 상수 네이밍 컨벤션 제안상수 객체의 이름이 일반적입니다. 더 구체적인 이름을 사용하는 것이 좋습니다.
-export const SUPABASE = { +export const SUPABASE_CONFIG = {
5-5
: 스키마 상수에 대한 문서화 필요
schemaMemo
상수의 용도와 의미를 설명하는 주석을 추가하면 좋을 것 같습니다.+ /** Supabase 데이터베이스의 메모 테이블 스키마 이름 */ schemaMemo: 'memo' as const,
packages/shared/src/constants/Url.ts (1)
1-6
: URL 상수들의 구조화된 관리 방식으로의 개선이 확인됩니다.개별 상수들을 하나의 객체로 통합한 것은 좋은 접근이지만, 타입 안전성을 위해 다음과 같은 개선을 제안드립니다.
+type URLType = { + guideKo: string; + guideEn: string; + googleForm: string; + chromeStore: string; +}; + -export const URL = { +export const URL: URLType = { guideKo: 'https://guesung.notion.site/8a740938aa6547b88d09dbab7cb2222b', guideEn: 'https://guesung.notion.site/10d89de02fde803c99c9e3027c2d10d5', googleForm: 'https://forms.gle/qHkL7PeknaCy5QfY6', chromeStore: 'https://chromewebstore.google.com/detail/web-memo/eaiojpmgklfngpjddhoalgcpkepgkclh', };pages/side-panel/src/utils/Url.ts (1)
3-10
: URL 생성 함수들의 구현이 깔끔합니다.두 함수 모두:
- 단일 책임 원칙을 잘 준수하고 있습니다
- 옵셔널 파라미터 처리가 적절합니다
- URL 구성이 일관성 있게 구현되어 있습니다
다만, 타입 안전성을 높이기 위해 다음과 같은 개선을 제안드립니다:
-export const getMemoUrl = (id?: number) => { +export const getMemoUrl = (id?: number): string => { if (id) return `${CONFIG.webUrl}/memos?id=${id}`; return `${CONFIG.webUrl}/memos`; }; -export const getMemoWishListUrl = (id?: number) => { +export const getMemoWishListUrl = (id?: number): string => { if (id) return `${CONFIG.webUrl}/memos?wish=true&id=${id}`; return `${CONFIG.webUrl}/memos?wish=true`; };packages/shared/src/hooks/extension/useSupabaseClientQuery.ts (1)
5-11
: 에러 바운더리 구현을 고려해보세요.Suspense를 사용하는 컴포넌트이므로, 상위에 에러 바운더리 구현을 추가하면 좋을 것 같습니다.
예시 구현:
// ErrorBoundary.tsx import { Component, ReactNode } from 'react'; interface Props { children: ReactNode; fallback: ReactNode; } interface State { hasError: boolean; } export class ErrorBoundary extends Component<Props, State> { constructor(props: Props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError() { return { hasError: true }; } render() { if (this.state.hasError) { return this.props.fallback; } return this.props.children; } }packages/web/src/constants/Config.ts (1)
3-7
: 타입 안전성 개선이 필요합니다설정 값들을 하나의 객체로 중앙화한 것은 좋은 패턴입니다. 하지만 타입 안전성을 높이기 위해 다음과 같은 개선을 제안합니다:
+interface Config { + webUrl: string; + supabaseUrl: string; + supabaseAnonKey: string; +} -export const CONFIG = { +export const CONFIG: Config = { webUrl: getSafeConfig('NEXT_PUBLIC_WEB_URL', process.env.NEXT_PUBLIC_WEB_URL), supabaseUrl: getSafeConfig('NEXT_PUBLIC_SUPABASE_URL', process.env.NEXT_PUBLIC_SUPABASE_URL), supabaseAnonKey: getSafeConfig('NEXT_PUBLIC_SUPABASE_ANON_KEY', process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY), };packages/web/src/hooks/useSupabaseClient.ts (1)
5-5
: 전역 변수 사용에 대한 주의 필요전역
client
변수를 사용하는 것은 다음과 같은 잠재적인 문제를 야기할 수 있습니다:
- 테스트 환경에서 상태 격리가 어려울 수 있습니다
- 여러 Supabase 프로젝트를 동시에 사용해야 하는 경우 제한이 될 수 있습니다
클래스 기반의 싱글톤 패턴이나 React Context를 사용하는 것을 고려해보세요.
packages/shared/src/utils/extension/Storage.ts (1)
13-18
: 에러 처리 개선을 고려해보세요.쿠키 제거 작업 시 발생할 수 있는 예외 상황에 대한 처리가 없습니다. Chrome API 호출 실패 시의 에러 처리를 추가하는 것이 좋을 것 같습니다.
다음과 같은 방식으로 개선할 수 있습니다:
export const removeSession = async () => { + try { await chrome.cookies.remove({ name: SUPABASE.authToken, url: CONFIG.webUrl, }); + } catch (error) { + console.error('세션 제거 중 오류 발생:', error); + throw error; + } };pages/content-ui/src/index.tsx (2)
Line range hint
6-14
: 개발 환경 전용 기능에 대한 문서화 제안
renderOpenSidePanelButton
함수가 개발 환경에서만 동작하는 이유와 목적에 대한 설명이 있으면 좋을 것 같습니다.다음과 같이 문서화를 추가하는 것을 제안드립니다:
+/** + * 개발 환경에서만 사이드 패널 버튼을 렌더링합니다. + * 프로덕션 환경에서는 이 기능이 비활성화됩니다. + */ const renderOpenSidePanelButton = async () => {
Line range hint
16-18
: 초기화 함수 에러 처리 개선 필요
responsePageContent()
와renderOpenSidePanelButton()
호출에 대한 에러 처리가 없습니다. 실패 시 사용자 경험에 영향을 줄 수 있습니다.다음과 같은 에러 처리 추가를 제안드립니다:
-responsePageContent(); -renderOpenSidePanelButton(); +try { + await responsePageContent(); + await renderOpenSidePanelButton(); +} catch (error) { + console.error('초기화 중 오류 발생:', error); +}packages/shared/src/hooks/supabase/useCategoryQuery.ts (1)
12-12
: 쿼리 함수 구현이 개선되었습니다화살표 함수를 사용한 간결한 구현으로 변경되었습니다. 기존의
bind
사용 대신 더 현대적이고 읽기 쉬운 방식으로 개선되었습니다.더 나아가 아래와 같이 에러 처리를 추가하는 것을 고려해보세요:
- queryFn: () => getCategories(supabaseClient), + queryFn: async () => { + try { + return await getCategories(supabaseClient); + } catch (error) { + console.error('카테고리 조회 중 오류 발생:', error); + throw error; + } + },packages/shared/src/hooks/supabase/useSupabaseUser.ts (1)
16-19
: 반환 값의 타입 안정성을 개선하면 좋을 것 같습니다.현재 구조는 명확하고 사용하기 편리하지만, 타입 안정성을 더욱 강화하기 위해 다음과 같은 개선을 제안드립니다.
+ type UseSupabaseUserReturn = { + user: UserResponse['data']; + } & ReturnType<typeof useSuspenseQuery<UserResponse, Error>>; export default function useSupabaseUser({ supabaseClient }: UseSupabaseUserProps) { const query = useSuspenseQuery<UserResponse, Error>({ queryFn: () => supabaseClient.auth.getUser(), queryKey: QUERY_KEY.user(), }); - return { + return { ...query, user: query.data, - }; + } satisfies UseSupabaseUserReturn; }packages/shared/tsconfig.json (1)
14-16
: 타입 선언 관련 설정 개선됨
declarationMap
과stripInternal
추가는 타입 선언 파일의 품질을 향상시킬 것으로 보입니다. 다만,module
을 'es2015'로 변경한 것은 다음 사항들을 고려해야 합니다:
- 이전 버전의 Node.js와의 호환성
- 외부 라이브러리와의 상호 운용성
packages/shared/src/hooks/supabase/useCategoryPostMutation.ts (2)
10-10
: 낙관적 업데이트 구현 제안낙관적 업데이트를 구현하면 사용자 경험을 크게 향상시킬 수 있습니다.
onMutate
핸들러를 추가하여 서버 응답 전에 클라이언트 상태를 즉시 업데이트하는 것을 권장드립니다.낙관적 업데이트 구현에 도움이 필요하시다면 예제 코드를 제공해드릴 수 있습니다. GitHub 이슈를 생성해드릴까요?
Line range hint
14-19
: 코드가 깔끔해졌네요!
async
키워드를 제거한 것은 좋은 변경입니다.insertCategory
가 이미 Promise를 반환하므로 불필요한 Promise 래핑을 피할 수 있습니다.에러 처리를 강화하기 위해 다음과 같은
onError
핸들러 추가를 고려해보세요:return useMutation<CategorySupabaseResponse, Error, CategoryTable['Insert']>({ mutationFn: postCategoryProps => insertCategory(supabaseClient, postCategoryProps), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY.category() }); }, + onError: (error) => { + console.error('카테고리 추가 중 오류 발생:', error); + // 사용자에게 에러 메시지 표시 로직 추가 + }, });packages/shared/src/hooks/supabase/useMemosQuery.ts (2)
9-11
: 인터페이스에 JSDoc 문서를 추가하면 좋을 것 같습니다.사용자가 이 인터페이스를 더 쉽게 이해할 수 있도록 각 프로퍼티의 목적과 사용법을 설명하는 문서를 추가하는 것이 좋겠습니다.
예시:
+/** + * useMemosQuery 훅의 프로퍼티 인터페이스 + * @property supabaseClient - Supabase 클라이언트 인스턴스 + * @extends {Omit<UseQueryOptions<QueryData, QueryError>, 'queryKey' | 'queryFn'>} + */ interface UseMemosQueryProps extends Omit<UseQueryOptions<QueryData, QueryError>, 'queryKey' | 'queryFn'> { supabaseClient: MemoSupabaseClient; }
Line range hint
13-23
: 에러 처리 개선을 고려해보세요.현재 구현은 잘 되어 있지만, 다음과 같은 에러 처리 개선을 제안드립니다:
- 네트워크 오류나 Supabase 관련 오류에 대한 구체적인 처리
- 사용자에게 친숙한 에러 메시지 제공
예시:
export default function useMemosQuery({ supabaseClient, ...useQueryProps }: UseMemosQueryProps) { const query = useQuery<QueryData, QueryError>({ ...useQueryProps, queryFn: () => getMemos(supabaseClient), queryKey: QUERY_KEY.memos(), enabled: !!supabaseClient, + retry: (failureCount, error) => { + // 특정 에러의 경우 재시도하지 않음 + if (error.message.includes('권한이 없습니다')) return false; + return failureCount < 3; + }, + onError: (error) => { + console.error('메모 조회 중 오류 발생:', error); + } }); return { ...query, memos: query.data?.data, }; }packages/shared/src/hooks/supabase/useMemoQuery.ts (1)
26-29
: 반환 타입에 대한 명시적 타입 정의가 필요합니다.반환 구조는 적절하나, 타입 안전성을 위해 명시적인 타입 정의를 추가하는 것이 좋습니다.
다음과 같은 개선을 제안드립니다:
+ type UseMemoQueryResult = { + memo: Memo | null; + } & UseQueryResult<Memo | null>; + - return { + return { ...query, memo: query.data, - }; + } as UseMemoQueryResult;packages/shared/src/constants/Config.ts (1)
6-17
: 타입 안전성 개선을 위한 제안현재 타입 단언(type assertion)을 사용하고 있는데, 이를 제네릭 함수와 상수로 개선하면 더 안전한 타입 체크가 가능합니다.
다음과 같은 개선을 제안드립니다:
type NodeEnv = 'development' | 'production'; const NODE_ENV_VALUES = ['development', 'production'] as const; function getSafeConfigWithType<T extends string>( name: string, value: string | undefined, allowedValues: readonly T[] ): T { const safeValue = getSafeConfig(name, value); if (!allowedValues.includes(safeValue as T)) { throw new Error(`${name}의 값이 유효하지 않습니다: ${safeValue}`); } return safeValue as T; } export const CONFIG = { // ... other configs ... nodeEnv: getSafeConfigWithType('NODE_ENV', process.env.NODE_ENV, NODE_ENV_VALUES), makeWebhookNotionApi: getSafeConfigWithType( 'MAKE_WEBHOOK_NOTION_API', process.env.MAKE_WEBHOOK_NOTION_API, NODE_ENV_VALUES ), // ... other configs ... };packages/web/src/app/auth/callback-email/route.ts (2)
Line range hint
23-29
: 심각한 오류: 리프레시 토큰이 잘못된 키로 저장되고 있습니다.
COOKIE_KEY.sideBarState
를 사용하여 리프레시 토큰을 저장하고 있습니다. 이는 명백한 오류입니다.다음과 같이 수정해주세요:
- cookieStore.set(COOKIE_KEY.sideBarState, sessionData.session.refresh_token, { + cookieStore.set(COOKIE_KEY.refreshToken, sessionData.session.refresh_token, { maxAge: 3600 * 24 * 365, // 1년 httpOnly: true, - secure: process.env.NODE_ENV === 'production', + secure: true, sameSite: 'lax', path: '/', });
Line range hint
11-13
: 에러 처리를 개선해주세요.현재 세션이 없을 때 단순히 'no session' 에러를 던지고 있습니다. 사용자 친화적인 에러 처리가 필요합니다.
다음과 같은 개선을 제안드립니다:
- if (!sessionData.session) throw new Error('no session'); + if (!sessionData.session) { + console.error('인증 세션을 찾을 수 없습니다.'); + return NextResponse.redirect(requestUrl.origin + PATHS.login + '?error=no_session'); + }packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx (1)
Line range hint
20-26
: 새로고침 중 로딩 상태 처리 추가를 제안드립니다.사용자 경험 향상을 위해 새로고침 작업 중에 로딩 상태를 표시하는 것이 좋을 것 같습니다.
다음과 같은 구현을 제안드립니다:
export default function RefreshButton({ lng }: RefreshButtonProps) { const { t } = useTranslation(lng); const { toast } = useToast(); const queryClient = useQueryClient(); + const [isRefreshing, setIsRefreshing] = useState(false); const handleRefreshClick = async () => { + setIsRefreshing(true); try { driverObj.moveNext(); LocalStorage.setTrue(LOCAL_STORAGE_KEY_MAP.guide); await queryClient.invalidateQueries({ queryKey: QUERY_KEY.memos() }); toast({ title: t('toastMessage.refresh') }); + } finally { + setIsRefreshing(false); + } }; return ( <Button size="icon" variant="outline" id="refresh" onClick={handleRefreshClick} + disabled={isRefreshing} > - <RefreshCwIcon size={16} /> + <RefreshCwIcon size={16} className={isRefreshing ? 'animate-spin' : ''} /> </Button> ); }packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarMenuItemAddCategory.tsx (3)
5-5
: Supabase 클라이언트 관리 방식이 개선되었습니다.
useSupabaseClient
훅을 사용하여 Supabase 클라이언트를 관리하는 방식으로 변경한 것이 좋은 개선사항입니다. 이는 다음과 같은 이점이 있습니다:
- React의 훅 기반 아키텍처와 더 잘 어울립니다
- 컴포넌트 테스트가 더 용이해집니다
- 클라이언트 인스턴스 관리가 중앙화됩니다
Also applies to: 12-12, 20-20
Line range hint
20-24
: 카테고리 생성 로직이 깔끔하게 구현되었습니다.
useCategoryPostMutation
에 supabaseClient를 주입하는 방식과 폼 제출 처리가 잘 구현되어 있습니다. 다만, 다음과 같은 개선사항을 고려해보시면 좋을 것 같습니다:
- 카테고리 생성 후 입력 필드를 초기화하고 편집 모드를 종료하는 로직 추가
- 카테고리 생성 중 로딩 상태 표시
const onSubmit = handleSubmit(({ category }) => { - mutateCategoryPost({ name: category }); + mutateCategoryPost({ name: category }, { + onSuccess: () => { + setIsEditMode(false); + reset(); + } + }); });
Line range hint
31-39
: 접근성 개선이 필요합니다.PlusIcon을 사용하는 부분에 접근성 속성을 추가하면 좋을 것 같습니다.
return ( <p className="flex cursor-pointer justify-center"> - <PlusIcon size={16} onClick={handlePlusIconClick} /> + <PlusIcon + size={16} + onClick={handlePlusIconClick} + role="button" + aria-label="카테고리 추가" + /> </p> );packages/web/src/app/components/Introduction.tsx (2)
7-8
: className 구성을 개선하면 좋을 것 같습니다.className의 일관성 있는 구성을 위해 다음과 같은 순서로 정렬하는 것을 제안드립니다:
- 레이아웃 관련 (flex, grid 등)
- 스페이싱 관련 (gap, padding 등)
- 스타일링 관련 (colors, gradients 등)
- <section className="flex flex-col gap-4 from-cyan-500 to-blue-500 px-12 pt-40 lg:flex-row"> + <section className="flex flex-col lg:flex-row gap-4 px-12 pt-40 from-cyan-500 to-blue-500">
15-19
: 목록의 접근성을 개선하면 좋을 것 같습니다.현재 구현은 기능적으로는 문제가 없으나, 스크린 리더 사용자를 위한 접근성 개선을 제안드립니다.
- <ul className="text-md list-decimal"> + <ul className="text-md list-decimal" role="list" aria-label="웹 메모의 주요 기능">packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts (1)
24-24
: URL 참조 방식이 일관성 있게 변경되었습니다.URL 객체를 통한 접근 방식으로 변경된 것이 좋습니다. 다만, URL 객체의 구조와 사용 가능한 속성들에 대한 문서화를 추가하면 더 좋을 것 같습니다.
Also applies to: 37-37
pages/side-panel/src/components/MemoHeader.tsx (1)
Line range hint
7-42
: 컴포넌트 아키텍처 개선 제안현재 구현은 잘 되어 있으나, 다음 사항들을 고려해보시면 좋겠습니다:
- 에러 바운더리 구현을 통한 오류 처리 강화
- 로딩 상태 표시 추가
useCallback
을 사용한handleMemoClick
최적화packages/web/src/middleware.ts (2)
1-7
: import 구문 정리가 필요합니다.import 구문들이 일관성 없이 정렬되어 있습니다. 다음과 같이 그룹화하여 정리하는 것을 제안드립니다:
import { NextRequest, NextResponse } from 'next/server'; -import { updateSession } from './utils'; import acceptLanguage from 'accept-language'; +import { checkStringArray } from '@extension/shared/utils'; + import { fallbackLng, languages, cookieName } from './app/i18n/settings'; -import { checkStringArray } from '@extension/shared/utils'; +import { updateSession } from './utils';
Line range hint
9-34
: 미들웨어 함수의 에러 처리가 미흡합니다.미들웨어 함수에서 다음과 같은 잠재적인 에러 상황에 대한 처리가 필요합니다:
- request.headers.get('referer')가 유효하지 않은 URL일 경우
- updateSession 함수 실행 중 발생할 수 있는 예외 상황
다음과 같은 방식으로 에러 처리를 추가하는 것을 제안드립니다:
if (request.headers.has('referer')) { - const refererUrl = new URL(request.headers.get('referer') ?? ''); + try { + const refererUrl = new URL(request.headers.get('referer') ?? ''); + const lngInReferer = languages.find(l => refererUrl.pathname.startsWith(`/${l}`)); + const response = NextResponse.next(); + if (lngInReferer) response.cookies.set(cookieName, lngInReferer); + return response; + } catch (error) { + console.error('Invalid referer URL:', error); + return NextResponse.next(); + } - const lngInReferer = languages.find(l => refererUrl.pathname.startsWith(`/${l}`)); - const response = NextResponse.next(); - if (lngInReferer) response.cookies.set(cookieName, lngInReferer); - return response; } - return await updateSession(request); + try { + return await updateSession(request); + } catch (error) { + console.error('Failed to update session:', error); + return NextResponse.next(); + }packages/web/src/app/[lng]/memos/layout.tsx (1)
Line range hint
18-23
: 인증 로직에 에러 처리 추가를 고려해주세요.현재 구현은 기본적인 인증 체크를 수행하고 있지만, supabaseClient 생성이나 checkUserLogin 과정에서 발생할 수 있는 예외 상황에 대한 처리가 없습니다.
다음과 같은 에러 처리 추가를 제안드립니다:
export default async function Layout({ children, params: { lng } }: LayoutProps) { - const supabaseClient = getSupabaseClient(); - const isUserLogin = await checkUserLogin(supabaseClient); - if (!isUserLogin) redirect(PATHS.login); + try { + const supabaseClient = getSupabaseClient(); + const isUserLogin = await checkUserLogin(supabaseClient); + if (!isUserLogin) redirect(PATHS.login); + } catch (error) { + console.error('인증 확인 중 오류 발생:', error); + redirect(PATHS.login); + }packages/shared/src/hooks/supabase/useMemoPostMutation.ts (1)
Line range hint
15-36
: 에러 처리 로직을 개선할 수 있습니다.현재 구현에서는
NoMemosError
를 던지기 전에 여러 단계의 널 체크를 수행하고 있습니다. 이를 더 간결하게 리팩토링할 수 있습니다.다음과 같은 리팩토링을 제안합니다:
onSuccess: async (result, variables, context) => { const { data: newData } = result; await queryClient.cancelQueries({ queryKey: QUERY_KEY.memos() }); const previousMemos = queryClient.getQueryData<MemoSupabaseResponse>(QUERY_KEY.memos()); - if (!previousMemos || !newData) throw new NoMemosError(); - const { data: previousMemosData } = previousMemos; - if (!previousMemosData) throw new NoMemosError(); + if (!previousMemos?.data || !newData) throw new NoMemosError(); - const newMemosData = newData.concat(previousMemosData); + const newMemosData = newData.concat(previousMemos.data); await queryClient.setQueryData(QUERY_KEY.memos(), { ...previousMemos, data: newMemosData });packages/web/src/app/[lng]/login/components/LoginSection/index.tsx (1)
29-31
: 테스트 계정 로그인 코드는 제거를 고려해주세요.프로덕션 코드에 테스트 계정 관련 코드가 주석 처리된 채로 남아있는 것은 바람직하지 않습니다. 테스트 목적이라면 테스트 파일로 분리하는 것이 좋습니다.
다음과 같이 주석 처리된 코드를 제거하는 것을 추천드립니다:
- {/* <button formAction={() => signInWithEmail(SUPABASE.testEmail, SUPABASE.testPassword)} className="btn"> - 테스트 계정으로 로그인 - </button> */}packages/shared/src/utils/extension/Supabase.ts (2)
30-35
: 인증 오류 메시지를 더 구체적으로 개선해야 합니다.현재 모든 오류가 동일한 "로그인을 먼저 해주세요" 메시지로 처리되고 있습니다. 사용자가 문제를 더 쉽게 파악할 수 있도록 구체적인 오류 메시지가 필요합니다.
다음과 같이 개선할 수 있습니다:
- if (!accessTokenFromWeb || !refreshTokenCookieFromWeb) throw new Error('로그인을 먼저 해주세요.'); + if (!accessTokenFromWeb) throw new Error('액세스 토큰이 없습니다. 다시 로그인해 주세요.'); + if (!refreshTokenCookieFromWeb) throw new Error('리프레시 토큰이 없습니다. 다시 로그인해 주세요.');
Line range hint
7-45
: Supabase 클라이언트 인스턴스 관리 전략 검토가 필요합니다.현재 구현은
getSupabaseClient
가 호출될 때마다 새로운 클라이언트 인스턴스를 생성합니다. 성능 최적화를 위해 싱글톤 패턴의 도입을 고려해 보시기 바랍니다.예시 구현:
let supabaseClientInstance: SupabaseClient<Database> | null = null; export const getSupabaseClient = async () => { if (supabaseClientInstance) { return supabaseClientInstance; } // 현재 구현된 로직 // ... supabaseClientInstance = newClient; return supabaseClientInstance; };packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx (1)
Line range hint
20-53
: 컴포넌트 구조가 잘 설계되었습니다만, 에러 처리를 개선하면 좋겠습니다.메모이제이션과 타입 안전성이 잘 구현되어 있습니다. 다만, categories가 undefined일 때의 처리를 추가하면 좋겠습니다.
다음과 같은 개선을 제안드립니다:
- {categories?.map(category => ( + {categories?.length ? ( + categories.map(category => ( <SidebarMenuItem key={category.name}> <SidebarMenuButton asChild> <button id={category.name} onClick={handleCategoryClick}> <span>{category.name}</span> </button> </SidebarMenuButton> </SidebarMenuItem> + )) + ) : ( + <SidebarMenuItem> + <span>{t('sideBar.noCategories')}</span> + </SidebarMenuItem> + )}packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx (1)
Line range hint
26-57
: 컴포넌트 로직 검토 완료무한 스크롤 구현과 메모 렌더링 로직이 적절히 구현되어 있습니다. 다만, 성능 최적화를 위한 제안사항이 있습니다:
items
상태 업데이트 시 불필요한 배열 복사를 피하기 위해useCallback
을 고려해보세요.- 메모 아이템의 애니메이션 설정을 컴포넌트 외부로 분리하면 가독성이 향상될 것 같습니다.
+const ANIMATION_VARIANTS = { + initial: { opacity: 0, y: 20, scale: 0.8 }, + animate: { opacity: 1, y: 0, scale: 1 }, +}; export default function MemoGrid({ lng, memos, gridKey }: MemoGridProps) { const [items, setItems] = useState(() => getMemoItems(0, MEMO_UNIT)); + + const handleAppend = useCallback((e: any) => { + if (items.length >= memos.length) return; + + const nextGroupKey = (+e.groupKey! || 0) + 1; + const maxAddItem = items.length + MEMO_UNIT > memos.length + ? memos.length - items.length + : MEMO_UNIT; + + if (maxAddItem === 0) return; + + setItems(prev => [...prev, ...getMemoItems(nextGroupKey, maxAddItem)]); + }, [items.length, memos.length]);packages/shared/src/utils/Supabase.ts (2)
5-24
: 메모 관련 함수들의 일관성이 향상되었습니다.SUPABASE.schemaMemo를 사용하여 스키마 참조를 일관되게 관리하고 있습니다. 타입 정의도 명확하게 되어있습니다.
스키마 참조 방식의 통일성 개선이 필요합니다.
메모 관련 함수들은
SUPABASE.schemaMemo
를 사용하는 반면, 카테고리 관련 함수들은 하드코딩된 문자열을 사용하고 있습니다.다음과 같이 카테고리 스키마도 상수로 관리하는 것을 추천드립니다:
- supabaseClient.from('category') + supabaseClient.from(SUPABASE.schemaCategory)
Line range hint
26-30
: 사용자 인증 함수의 반환 타입을 명시적으로 지정해주세요.현재 함수들이 잘 구현되어 있지만, 타입 안정성을 높이기 위해 반환 타입을 명시하면 좋을 것 같습니다.
다음과 같이 반환 타입을 추가하는 것을 추천드립니다:
- export const getUser = async (supabaseClient: MemoSupabaseClient) => + export const getUser = async (supabaseClient: MemoSupabaseClient): Promise<{ data: { user: User | null }, error: Error | null }> => - export const checkUserLogin = async (supabaseClient: MemoSupabaseClient) => { + export const checkUserLogin = async (supabaseClient: MemoSupabaseClient): Promise<boolean> => {packages/shared/src/hooks/supabase/useMemoPatchMutation.ts (2)
13-15
: 인터페이스에 JSDoc 문서를 추가하면 좋을 것 같습니다.인터페이스의 목적과 각 속성에 대한 설명을 추가하면 코드의 이해도를 높일 수 있습니다.
다음과 같이 문서를 추가해보세요:
+/** + * useMemoPatchMutation 훅의 속성을 정의하는 인터페이스 + * @extends UseMutationOptions<MutationData, MutationError, MutationVariables> + */ interface UseMemoPatchMutationProps extends UseMutationOptions<MutationData, MutationError, MutationVariables> { + /** Supabase 클라이언트 인스턴스 */ supabaseClient: MemoSupabaseClient; }
Line range hint
17-39
: 성능 최적화를 위한 제안사항이 있습니다.현재 구현은 견고하지만, 다음과 같은 최적화를 고려해보세요:
onMutate
함수에서previousMemosData.splice()
는 배열을 직접 수정합니다. 불변성을 유지하기 위해 새로운 배열을 생성하는 것이 좋습니다.- 메모 검색 시
find
와findIndex
를 각각 호출하는 대신, 한 번의 순회로 처리할 수 있습니다.다음과 같이 수정해보세요:
- const currentMemoIndex = previousMemosData.findIndex(memo => memo.id === id); - const currentMemoBase = previousMemosData.find(memo => memo.id === id); - - if (currentMemoIndex === -1 || !currentMemoBase) throw new NoMemoError(); - - previousMemosData.splice(currentMemoIndex, 1, { ...currentMemoBase, ...memoRequest }); + let currentMemoIndex = -1; + let currentMemoBase = null; + + for (let i = 0; i < previousMemosData.length; i++) { + if (previousMemosData[i].id === id) { + currentMemoIndex = i; + currentMemoBase = previousMemosData[i]; + break; + } + } + + if (currentMemoIndex === -1 || !currentMemoBase) throw new NoMemoError(); + + const updatedMemosData = [ + ...previousMemosData.slice(0, currentMemoIndex), + { ...currentMemoBase, ...memoRequest }, + ...previousMemosData.slice(currentMemoIndex + 1) + ];packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx (2)
Line range hint
38-42
: UI/UX 및 접근성 개선이 필요합니다.현재 구현에서 개선이 필요한 부분들이 있습니다:
- 삭제 버튼이 단순히 'x'로만 표시되어 있어 의미 전달이 불충분합니다
- 기본 confirm 대화상자는 사용자 경험 측면에서 개선의 여지가 있습니다
- 테이블의 접근성 속성이 부족합니다
다음과 같은 개선을 제안드립니다:
- <button type="button" onClick={() => handleDeleteClick(memo.id)} className="w-full text-center"> - x - </button> + <button + type="button" + onClick={() => handleDeleteClick(memo.id)} + className="btn btn-error btn-sm w-full" + aria-label={`메모 삭제: ${memo.title}`} + > + 삭제 + </button>추가로 모달 컴포넌트를 사용한 더 나은 삭제 확인 프로세스 구현을 제안드립니다. 필요하시다면 구체적인 구현 예시를 제공해드리겠습니다.
Line range hint
18-19
: 로딩 및 에러 상태 처리가 필요합니다.현재 빈 메모 상태만 처리되어 있습니다. 데이터 로딩 중이거나 에러가 발생했을 때의 사용자 경험을 개선할 수 있습니다.
다음과 같은 개선을 제안드립니다:
+ const { memos, isLoading, error } = useMemosQuery({ + supabaseClient, + }); + + if (isLoading) return <div className="mt-8 text-center">메모를 불러오는 중입니다...</div>; + if (error) return <div className="mt-8 text-center text-error">메모를 불러오는데 실패했습니다. 다시 시도해주세요.</div>; if (!memos || memos.length === 0) return <p className="mt-8 text-center">아직 저장된 메모가 없어요. 사이드 패널을 열어 메모를 저장해보세요 !</p>;packages/web/src/utils/supabase.server.ts (4)
1-10
: 공유 상수 사용 및 싱글톤 패턴 도입이 잘 되었습니다!상수 관리와 타입 안전성이 개선되었으며, 싱글톤 패턴을 통해 클라이언트 인스턴스 관리가 효율적으로 이루어질 것으로 보입니다.
supabaseClient
변수에 대한 간단한 JSDoc 주석을 추가하면 좋을 것 같습니다:+/** Supabase 클라이언트의 싱글톤 인스턴스 */ let supabaseClient: MemoSupabaseClient;
Line range hint
13-26
: 클라이언트 생성 시 에러 처리 추가 필요클라이언트 생성 과정에서 발생할 수 있는 에러에 대한 처리가 누락되어 있습니다.
다음과 같이 에러 처리를 추가하는 것을 제안드립니다:
export const getSupabaseClient = () => { if (supabaseClient) return supabaseClient; const cookieStore = cookies(); + + try { supabaseClient = createServerClient<Database>( CONFIG.supabaseUrl, CONFIG.supabaseAnonKey, { cookies: { getAll() { return cookieStore.getAll(); }, setAll(cookiesToSet) { cookiesToSet.forEach(({ name, value, options }) => cookieStore.set(name, value, options) ); }, }, db: { schema: SUPABASE.schemaMemo }, } ); return supabaseClient; + } catch (error) { + console.error('Supabase 클라이언트 생성 실패:', error); + throw new Error('Supabase 연결에 실패했습니다.'); + } };
Line range hint
31-43
: Provider 타입 안전성 개선 필요현재 Provider 타입이 너무 광범위하게 정의되어 있습니다. 지원하는 프로바이더만 명시적으로 제한하면 좋을 것 같습니다.
다음과 같이 타입을 제한하는 것을 제안드립니다:
+ type SupportedProvider = 'google' | 'github'; - export const signInWithOAuth = async (provider: Provider) => { + export const signInWithOAuth = async (provider: SupportedProvider) => {
Line range hint
45-56
: 이메일 유효성 검사 추가 필요이메일과 비밀번호에 대한 기본적인 유효성 검사가 누락되어 있습니다.
다음과 같이 유효성 검사를 추가하는 것을 제안드립니다:
export const signInWithEmail = async (email: string, password: string) => { 'use server'; + if (!email || !email.includes('@')) { + throw new Error('유효하지 않은 이메일 형식입니다.'); + } + + if (!password || password.length < 6) { + throw new Error('비밀번호는 최소 6자 이상이어야 합니다.'); + } + const supabaseClient = getSupabaseClient(); // ... 나머지 코드 };chrome-extension/lib/background/index.ts (2)
60-60
: 제거 URL 참조가 개선되었습니다.확장 프로그램 제거 시 사용되는 URL을
URL.googleForm
으로 참조하는 것은 적절합니다.하지만 한 가지 제안사항이 있습니다:
구글 폼 URL이 변경될 경우를 대비하여 다음과 같은 에러 처리를 추가하는 것이 좋을 것 같습니다:
-chrome.runtime.setUninstallURL(URL.googleForm); +chrome.runtime.setUninstallURL(URL.googleForm, () => { + if (chrome.runtime.lastError) { + console.error('제거 URL 설정 실패:', chrome.runtime.lastError); + } +});
Line range hint
71-77
: OpenAI 모델명에 오타가 있습니다.
gpt-4o-mini
는 존재하지 않는 모델명으로 보입니다.다음과 같이 수정이 필요합니다:
- model: 'gpt-4o-mini', + model: 'gpt-4', // 또는 사용하고자 하는 실제 모델명pages/options/src/components/OptionForm.tsx (1)
Line range hint
1-100
: 아키텍처 개선 제안현재
OptionForm
컴포넌트가 UI 렌더링과 데이터 fetching을 모두 처리하고 있습니다. 관심사 분리를 위해 다음과 같은 리팩토링을 고려해보시는 것은 어떨까요?
- 데이터 fetching 로직을 별도의 커스텀 훅으로 분리
- 다운로드 관련 로직을 별도의 유틸리티로 분리
- form 관련 상태 관리를 위해 React Hook Form 같은 라이브러리 도입 고려
package.json (2)
49-49
: lucide-react 패키지 관리 개선 필요동일한 버전의
lucide-react
패키지가 제거되고 다시 추가된 것으로 보입니다. 패키지 중복 관리를 방지하기 위해 의존성 관리를 검토해주시기 바랍니다.
의존성 관리 전략 개선이 필요합니다
현재 상황에 대한 분석 결과:
- pnpm-lock.yaml 파일은 존재하지만 자동화된 의존성 업데이트 도구(Renovate/Dependabot)가 구성되어 있지 않습니다
- 대부분의 의존성이 유동적 버전(^)으로 지정되어 있어 예기치 않은 업데이트로 인한 위험이 있습니다
개선 권장사항:
- 핵심 의존성(@supabase/, @tanstack/, next, react)의 버전을 고정하여 안정성 확보
- GitHub Actions에서 Dependabot 설정 추가 (.github/dependabot.yml)
- 보안 업데이트는 자동으로, 기능 업데이트는 수동으로 관리하는 투트랙 전략 도입 권장
🔗 Analysis chain
Line range hint
42-58
: 의존성 버전 관리 전략 검토 필요프로젝트의 안정성을 위해 다음 사항들을 고려해주시기 바랍니다:
- 의존성 버전 고정 전략 수립
- 보안 업데이트를 위한 자동화된 의존성 업데이트 프로세스 구축
- package.json과 pnpm-lock.yaml 파일의 동기화 상태 확인
Let me gather more information about the dependency management strategy by checking the lock file content and any automated update configurations.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify dependency management and security # Check for known vulnerabilities echo "Checking for known vulnerabilities in dependencies:" npm audit --json || true # Check if lock file exists and is in sync echo -e "\nChecking lock file status:" if [ -f "pnpm-lock.yaml" ]; then echo "Lock file exists" else echo "Warning: No pnpm-lock.yaml found" fiLength of output: 867
Script:
#!/bin/bash # Check lock file content and renovate/dependabot configuration echo "Lock file content (first few lines):" head -n 20 pnpm-lock.yaml echo -e "\nChecking for dependency update automation:" echo "Renovate config:" find . -maxdepth 2 -name "renovate.json" -o -name ".renovaterc" echo -e "\nDependabot config:" find . -maxdepth 3 -name "dependabot.yml" -o -name "dependabot.yaml" echo -e "\nChecking current dependency resolution:" pnpm why @supabase/supabase-js || trueLength of output: 996
packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx (1)
26-31
: Supabase 클라이언트 에러 처리를 추가하면 좋을 것 같습니다.
useSupabaseClient
훅의 사용이 잘 되어있지만, 클라이언트 초기화 실패나 네트워크 오류 등의 예외 상황에 대한 처리가 필요해 보입니다.다음과 같은 에러 처리 로직을 추가하는 것을 고려해보세요:
const supabaseClient = useSupabaseClient(); + const { toast } = useToast(); + + if (!supabaseClient) { + toast({ + title: t('error.supabaseClient'), + variant: 'destructive', + }); + return null; + } const { mutate: mutateMemoPatch } = useMemoPatchMutation({ supabaseClient, });pages/side-panel/src/components/MemoForm.tsx (1)
73-75
: 폼 값 설정 로직에 대한 개선 제안폼 값 설정 로직이 개선되었지만, 다음 사항들을 고려해보시기 바랍니다:
useEffect
의존성 배열에memoData
전체 객체를 포함하는 것이 더 안전할 수 있습니다.- 메모 데이터 로딩 상태 처리가 필요할 수 있습니다.
다음과 같이 수정하는 것을 고려해보세요:
useEffect(() => { if (!tab?.url) return; setValue('memo', memoData?.memo ?? ''); setValue('isWish', memoData?.isWish ?? false); - }, [memoData?.isWish, memoData?.memo, setValue, tab?.url]); + }, [memoData, setValue, tab?.url]);packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx (1)
Line range hint
41-67
: 컴포넌트 구조 개선 제안현재 컴포넌트가 메모 삭제와 카테고리 업데이트라는 두 가지 주요 책임을 가지고 있습니다. 다음과 같은 개선을 고려해보세요:
- 메모 삭제와 카테고리 업데이트 로직을 별도의 커스텀 훅으로 분리
- 에러 처리 로직 강화
+// useMemoDelete.ts +export function useMemoDelete(memoId: number) { + const { t } = useTranslation(); + const { toast } = useToast(); + + return useMemoDeleteMutation({ + onSuccess: (data) => { + if (!data) { + toast({ title: t('error.deleteFailed') }); + return; + } + // ... 현재 성공 처리 로직 + }, + onError: (error) => { + toast({ title: t('error.deleteFailed'), description: error.message }); + } + }); +}packages/web/src/components/ui/sidebar.tsx (1)
16-16
: 쿠키 키 관리 방식이 개선되었습니다.상수 관리가 COOKIE_KEY 객체로 통합되어 일관성이 향상되었습니다.
다음과 같이 상수 이름을 더 명확하게 변경하는 것을 고려해보세요:
-const SIDEBAR_COOKIE_NAME = COOKIE_KEY.sideBarState; +const SIDEBAR_STATE_COOKIE_KEY = COOKIE_KEY.sideBarState;Also applies to: 18-18
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (65)
chrome-extension/lib/background/index.ts
(3 hunks)chrome-extension/utils/openai.ts
(1 hunks)package.json
(2 hunks)packages/shared/package.json
(1 hunks)packages/shared/src/constants/Config.ts
(1 hunks)packages/shared/src/constants/Cookie.ts
(1 hunks)packages/shared/src/constants/Supabase.ts
(1 hunks)packages/shared/src/constants/Url.ts
(1 hunks)packages/shared/src/hooks/extension/index.ts
(1 hunks)packages/shared/src/hooks/extension/useSupabaseClientQuery.ts
(1 hunks)packages/shared/src/hooks/index.ts
(0 hunks)packages/shared/src/hooks/supabase/index.ts
(0 hunks)packages/shared/src/hooks/supabase/useCategoryPostMutation.ts
(1 hunks)packages/shared/src/hooks/supabase/useCategoryQuery.ts
(2 hunks)packages/shared/src/hooks/supabase/useMemoPatchMutation.ts
(1 hunks)packages/shared/src/hooks/supabase/useMemoPostMutation.ts
(1 hunks)packages/shared/src/hooks/supabase/useMemoQuery.ts
(2 hunks)packages/shared/src/hooks/supabase/useMemosQuery.ts
(1 hunks)packages/shared/src/hooks/supabase/useSupabaseClient.ts
(0 hunks)packages/shared/src/hooks/supabase/useSupabaseUser.ts
(1 hunks)packages/shared/src/utils/Environment.ts
(1 hunks)packages/shared/src/utils/Notion.ts
(2 hunks)packages/shared/src/utils/Sentry.ts
(2 hunks)packages/shared/src/utils/String.ts
(1 hunks)packages/shared/src/utils/Supabase.ts
(2 hunks)packages/shared/src/utils/extension/Storage.ts
(2 hunks)packages/shared/src/utils/extension/Supabase.ts
(2 hunks)packages/shared/src/utils/index.ts
(1 hunks)packages/shared/tsconfig.json
(1 hunks)packages/web/package.json
(0 hunks)packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx
(1 hunks)packages/web/src/app/[lng]/login/components/LoginSection/index.tsx
(1 hunks)packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx
(1 hunks)packages/web/src/app/[lng]/memos/components/MemoDialog/index.tsx
(2 hunks)packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx
(2 hunks)packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarMenuItemAddCategory.tsx
(1 hunks)packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx
(2 hunks)packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx
(1 hunks)packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx
(2 hunks)packages/web/src/app/[lng]/memos/components/MemoView/index.tsx
(1 hunks)packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx
(1 hunks)packages/web/src/app/[lng]/memos/layout.tsx
(2 hunks)packages/web/src/app/[lng]/memos/page.tsx
(2 hunks)packages/web/src/app/auth/callback-email/route.ts
(2 hunks)packages/web/src/app/auth/callback/route.ts
(2 hunks)packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts
(3 hunks)packages/web/src/app/components/Introduction.tsx
(1 hunks)packages/web/src/components/Footer.tsx
(2 hunks)packages/web/src/components/ui/sidebar.tsx
(1 hunks)packages/web/src/constants/Config.ts
(1 hunks)packages/web/src/hooks/index.ts
(1 hunks)packages/web/src/hooks/useMemoDeleteMutation.ts
(1 hunks)packages/web/src/hooks/useSupabaseClient.ts
(1 hunks)packages/web/src/middleware.ts
(1 hunks)packages/web/src/utils/index.ts
(0 hunks)packages/web/src/utils/middleware.ts
(2 hunks)packages/web/src/utils/supabase.client.ts
(2 hunks)packages/web/src/utils/supabase.server.ts
(5 hunks)pages/content-ui/src/index.tsx
(1 hunks)pages/options/src/components/OptionForm.tsx
(2 hunks)pages/side-panel/src/components/LoginSection.tsx
(2 hunks)pages/side-panel/src/components/MemoForm.tsx
(5 hunks)pages/side-panel/src/components/MemoHeader.tsx
(1 hunks)pages/side-panel/src/hoc/withAuthentication.tsx
(1 hunks)pages/side-panel/src/utils/Url.ts
(1 hunks)
💤 Files with no reviewable changes (5)
- packages/shared/src/hooks/index.ts
- packages/shared/src/hooks/supabase/index.ts
- packages/shared/src/hooks/supabase/useSupabaseClient.ts
- packages/web/package.json
- packages/web/src/utils/index.ts
🔇 Additional comments (93)
packages/shared/src/utils/Environment.ts (1)
1-1
: @src 경로 별칭 설정 확인 필요
@src
경로 별칭이 올바르게 설정되어 있는지 확인이 필요합니다. 프로젝트의 빌드 설정에서 이 경로가 제대로 해석되는지 검증해야 합니다.
✅ Verification successful
Let me verify the CONFIG import by checking its actual implementation.
@src 경로 별칭과 CONFIG 구조 검증 완료
tsconfig.json 설정과 실제 구현을 확인한 결과:
- @src 경로 별칭이 packages/shared/tsconfig.json에 올바르게 설정되어 있습니다.
- CONFIG 객체가 packages/shared/src/constants/Config.ts에 정의되어 있으며, nodeEnv 속성을 포함하고 있습니다.
- index.ts에서 Config.ts를 올바르게 재내보내기하고 있습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# tsconfig.json에서 경로 별칭 설정 확인
cat $(fd tsconfig.json) | jq '.compilerOptions.paths'
# 실제 constants 파일 위치 확인
fd -t f "Config.ts|index.ts" packages/shared/src/constants
Length of output: 899
Script:
#!/bin/bash
# Check the content of Config.ts and index.ts
cat packages/shared/src/constants/Config.ts packages/shared/src/constants/index.ts
# Verify if CONFIG is exported and contains nodeEnv
ast-grep --pattern 'export const CONFIG = $_'
Length of output: 2938
packages/shared/src/constants/Cookie.ts (1)
1-5
: 상수 값들을 하나의 객체로 통합한 것이 좋습니다!
상수들을 하나의 객체로 통합함으로써 코드의 구조가 개선되었고, 관련 값들을 더 효과적으로 관리할 수 있게 되었습니다.
chrome-extension/utils/openai.ts (3)
1-1
: 설정 관리 방식의 개선이 확인되었습니다.
중앙 집중식 설정 관리를 위해 CONFIG
객체를 사용하는 것은 좋은 접근 방식입니다. 이는 설정값의 일관성과 유지보수성을 향상시킵니다.
Line range hint 1-7
: 전반적인 구현이 깔끔합니다.
OpenAI 클라이언트 초기화 로직이 간단하고 명확하게 구현되어 있습니다. 중앙화된 설정 관리를 통해 코드의 일관성이 향상되었습니다.
5-5
: API 키 보안 관련 검증이 필요합니다.
OpenAI API 키와 같은 민감한 정보의 처리 방식을 확인해주세요.
다음 스크립트를 실행하여 API 키가 안전하게 관리되고 있는지 확인하겠습니다:
packages/shared/src/utils/String.ts (1)
1-4
: 함수 구현이 적절합니다.
타입 안전성이 잘 보장되어 있으며, 배열과 문자열 검증 로직이 명확합니다.
packages/shared/src/constants/Supabase.ts (1)
1-6
: 상수 사용 현황 확인이 필요합니다
이 상수들이 코드베이스 전체에서 올바르게 사용되고 있는지 확인이 필요합니다.
✅ Verification successful
SUPABASE 상수들이 적절하게 사용되고 있음을 확인했습니다
코드베이스 분석 결과:
SUPABASE.schemaMemo
는 데이터베이스 스키마 정의에 일관되게 사용되고 있습니다SUPABASE.authToken
은 확장 프로그램의 스토리지 관련 기능에서 적절히 사용되고 있습니다testEmail
과testPassword
는 로그인 컴포넌트에서 주석 처리되어 있어 테스트 용도로만 제한되어 있습니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: 상수 사용 패턴 확인
# SUPABASE 객체 사용 확인
echo "SUPABASE 객체 사용 확인:"
rg "SUPABASE\." -t ts -t tsx
# 이전 개별 상수 사용 여부 확인
echo "\n레거시 상수 사용 확인:"
rg "SUPABASE_(AUTH_TOKEN|TEST_EMAIL|TEST_PASSWORD|SCHEMA_MEMO)" -t ts -t tsx
Length of output: 253
Script:
#!/bin/bash
# SUPABASE 객체 사용 확인 (파일 확장자 수정)
echo "SUPABASE 객체 사용 현황:"
rg "SUPABASE\." --type-add 'ts:*.{ts,tsx}' -t ts
# 개별 상수 사용 확인 (파일 확장자 수정)
echo -e "\n레거시 상수 사용 현황:"
rg "SUPABASE_(AUTH_TOKEN|TEST_EMAIL|TEST_PASSWORD|SCHEMA_MEMO)" --type-add 'ts:*.{ts,tsx}' -t ts
# SUPABASE 객체가 포함된 파일 목록
echo -e "\nSUPABASE 관련 파일 목록:"
fd -e ts -e tsx | xargs grep -l "SUPABASE"
Length of output: 1944
packages/shared/src/hooks/extension/index.ts (1)
3-3
: 새로운 Supabase 클라이언트 쿼리 훅 내보내기가 올바르게 구현되었습니다!
기존 내보내기 패턴을 일관되게 따르고 있으며, Supabase 클라이언트 관리를 개선하기 위한 리팩토링의 일부로 적절하게 구현되었습니다.
packages/web/src/hooks/index.ts (1)
4-4
: 내보내기 패턴이 일관성 있게 적용되었습니다.
기존 훅들과 동일한 패턴으로 useSupabaseClient
훅을 내보내고 있어 일관성이 잘 유지되었습니다.
코드베이스에서 새로운 훅의 사용을 확인하기 위해 다음 스크립트를 실행합니다:
✅ Verification successful
Let me analyze the usage patterns more deeply to verify the refactoring completeness.
useSupabaseClient
훅의 도입이 적절하게 이루어졌습니다
코드베이스 분석 결과, 다음과 같은 사항들이 확인되었습니다:
useSupabaseClient
훅이 여러 컴포넌트에서 일관되게 사용되고 있습니다- 직접적인 Supabase 클라이언트 생성은 extension 유틸리티에만 제한되어 있습니다
getSupabaseClient
는 서버 사이드 컴포넌트와 인증 관련 로직에서만 사용되고 있어 적절한 분리가 이루어졌습니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: useSupabaseClient 훅의 사용 현황을 확인합니다.
# useSupabaseClient 훅의 사용 패턴 검색
rg "useSupabaseClient" -l
# 이전 getSupabaseClient 사용이 남아있는지 확인
rg "getSupabaseClient" -l
Length of output: 1482
Script:
#!/bin/bash
# Check the implementation and usage patterns
ast-grep --pattern 'useSupabaseClient($$$)'
# Check for any direct supabase client instantiation patterns
rg "createClient|new Supabase" -l
Length of output: 1040
packages/shared/src/utils/index.ts (1)
11-11
: 새로운 String 모듈 내보내기가 추가되었습니다.
변경사항이 기존 패턴을 잘 따르고 있습니다. 알파벳 순서도 적절하게 유지되었습니다.
String 모듈의 구현을 확인하기 위해 다음 스크립트를 실행합니다:
✅ Verification successful
String 모듈이 확인되었으며 적절하게 구현되어 있습니다.
String.ts 모듈이 packages/shared/src/utils 디렉토리에 존재하며, checkStringArray 유틸리티 함수를 올바르게 구현하고 있습니다. 타입 체크와 배열 검증이 정확하게 구현되어 있어 안전한 타입 가드로 사용될 수 있습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: String 모듈의 존재 여부와 구현 확인
# String.ts 파일 찾기
fd -t f "String.ts" packages/shared/src/utils
# String 모듈의 구현 내용 확인
if [ -f "packages/shared/src/utils/String.ts" ]; then
cat packages/shared/src/utils/String.ts
fi
Length of output: 354
packages/shared/src/constants/Url.ts (1)
1-6
: URL 접근성 검증이 필요합니다.
정의된 URL들이 실제로 접근 가능한지 확인이 필요합니다.
✅ Verification successful
모든 URL이 정상적으로 접근 가능합니다.
모든 URL에 대한 HTTP 응답이 성공적으로 확인되었습니다:
- Notion 가이드 페이지들 (한국어/영어): 200 OK
- Google 폼: 302 Found (정상적인 리다이렉션)
- Chrome 웹 스토어: 301 Moved Permanently (정상적인 리다이렉션)
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: URL 접근성 검증
echo "URL 접근성 확인 중..."
for url in \
"https://guesung.notion.site/8a740938aa6547b88d09dbab7cb2222b" \
"https://guesung.notion.site/10d89de02fde803c99c9e3027c2d10d5" \
"https://forms.gle/qHkL7PeknaCy5QfY6" \
"https://chromewebstore.google.com/detail/web-memo/eaiojpmgklfngpjddhoalgcpkepgkclh"
do
response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
echo "$url - HTTP 상태 코드: $response"
done
Length of output: 2219
pages/side-panel/src/utils/Url.ts (1)
1-1
: 설정 관리 개선을 위한 좋은 변경사항입니다.
개별 상수를 사용하는 대신 중앙 집중식 CONFIG
객체를 사용하도록 변경한 것은 다음과 같은 이점이 있습니다:
- 설정 값의 일관성 유지
- 설정 관리의 용이성
- 코드 유지보수성 향상
packages/shared/src/hooks/extension/useSupabaseClientQuery.ts (2)
5-11
: 훅 구현이 깔끔하고 명확합니다!
React Query의 useSuspenseQuery
를 사용한 구현이 잘 되어있습니다.
9-9
: retry 설정값 검증이 필요합니다.
retry가 1로 설정되어 있는데, Supabase 클라이언트 연결 실패 시 한 번의 재시도만으로 충분한지 검토가 필요합니다.
✅ Verification successful
Let me gather more information about the Supabase client configuration and error handling patterns.
Let me gather more information about error handling and retry patterns in the codebase.
retry 설정값 1은 적절합니다.
Supabase 클라이언트 연결은 다음과 같은 이유로 현재 retry 설정이 적절합니다:
- 클라이언트 초기화는 단순한 설정 작업이며, 네트워크 연결이 필요하지 않습니다.
- 실제 API 요청은 개별 쿼리에서 처리되며, 이 hook은 단지 클라이언트 인스턴스를 생성하는 역할만 합니다.
- 에러가 발생하는 경우는 대부분 설정 오류(잘못된 credentials 등)로, 재시도로 해결되지 않는 문제입니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Supabase 클라이언트 관련 설정 및 에러 처리 패턴 확인
# 다른 Supabase 관련 쿼리의 retry 설정 확인
rg "retry.*[0-9]+" --type ts
# Supabase 클라이언트 사용 패턴 확인
ast-grep --pattern 'useSuspenseQuery({
$$$
retry: $_,
$$$
})'
Length of output: 619
Script:
#!/bin/bash
# Supabase 클라이언트 초기화 및 에러 처리 로직 확인
rg "getSupabaseClient" -A 10 --type ts
# 다른 Supabase 관련 쿼리 설정 확인
ast-grep --pattern 'createClient({
$$$
})'
# 에러 핸들링 패턴 확인
rg "supabase.*error" --type ts
Length of output: 18183
Script:
#!/bin/bash
# 에러 핸들링 패턴 확인
rg "error.*supabase" -A 5 --type ts
rg "catch.*supabase" -A 5 --type ts
# React Query 관련 retry 설정 확인
rg "retry:.*[0-9]+" -B 5 -A 5 --type ts
# Supabase 연결 실패 관련 로그나 에러 처리 확인
rg "supabase.*connect" --type ts
Length of output: 1638
packages/web/src/constants/Config.ts (1)
5-6
: Supabase 자격 증명 노출에 대한 보안 고려사항
클라이언트 측 코드에서 Supabase URL과 익명 키를 노출하는 것은 일반적인 패턴이지만, 다음 사항들을 확인해주세요:
- 익명 키가 적절한 권한으로 제한되어 있는지
- 프로덕션 환경에서 적절한 CORS 설정이 되어있는지
packages/web/src/components/Footer.tsx (2)
1-1
: URL 상수 관리 개선이 잘 이루어졌습니다.
URL 상수들을 하나의 객체로 통합하여 관리하는 방식으로 변경한 것이 좋습니다. 이는 상수 관리를 더욱 체계적으로 만들어줍니다.
10-10
: URL 상수 변경이 전체 코드베이스에 일관되게 적용되었는지 확인이 필요합니다.
URL.chromeStore로의 변경이 올바르게 이루어졌지만, 다른 파일들에서도 동일한 방식으로 변경되었는지 확인이 필요합니다.
다음 스크립트를 실행하여 URL 상수 사용의 일관성을 확인하세요:
✅ Verification successful
URL 상수가 일관되게 적용되어 있음을 확인했습니다
코드베이스 검사 결과, URL 상수들이 모두 올바르게 마이그레이션되어 있습니다:
packages/shared/src/constants/Url.ts
에 모든 URL 상수가 정의되어 있으며- 전체 코드베이스에서
URL.chromeStore
,URL.guideKo
등의 형태로 일관되게 사용되고 있습니다 - 이전 형식인
URL_
접두사를 사용하는 코드가 없습니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# URL_CHROME_STORE 상수의 기존 사용처 확인
rg "URL_CHROME_STORE"
# 새로운 URL.chromeStore 사용처 확인
rg "URL\.chromeStore"
# 다른 URL 상수들의 마이그레이션 확인
rg "URL_" --type ts --type tsx
Length of output: 415
Script:
#!/bin/bash
# Check for any remaining URL_ constants in all TypeScript and JavaScript files
rg "URL_" -t ts -t js
# Check all URL constant usages from URL object
rg "URL\." -t ts -t js
# Find the URL constant definitions
ast-grep --pattern 'const URL = {$$$}'
Length of output: 1433
packages/shared/src/utils/Notion.ts (2)
1-1
: 설정 관리 개선을 위한 import 변경이 적절합니다.
중앙 집중식 설정 관리를 위해 CONFIG 객체를 사용하는 방식으로 변경한 것이 좋습니다. 이는 설정값 관리를 더욱 체계적으로 만들어줄 것입니다.
12-14
: API URL을 CONFIG 객체를 통해 참조하도록 변경이 잘 되었습니다.
직접적인 상수 사용 대신 CONFIG 객체를 통해 API URL을 참조하도록 변경한 것이 일관성 있고 적절합니다. 다만, 이 변경으로 인해 다른 파일에서도 동일한 방식으로 업데이트가 필요한지 확인이 필요합니다.
다른 파일에서의 사용 여부를 확인하기 위한 스크립트:
✅ Verification successful
Let me verify if there are any other direct usages of the Notion API URL in the codebase.
CONFIG 객체를 통한 API URL 참조 변경이 완전히 적용되었습니다.
코드베이스 검사 결과, makeWebhookNotionApi
는 CONFIG
객체를 통해서만 사용되고 있으며, 다른 파일에서 직접적인 API URL 참조는 발견되지 않았습니다. turbo.json
의 환경 변수 선언은 의도된 설정이므로 문제가 되지 않습니다.
다만, Config.ts
에서 makeWebhookNotionApi
설정 시 잘못된 설정 키 'SENTRY_DSN'을 사용하고 있는 것이 발견되었으니 이는 별도로 수정이 필요합니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for any remaining direct usage of MAKE_WEBHOOK_NOTION_API
# Search for any remaining direct references to the old constant
rg "MAKE_WEBHOOK_NOTION_API"
# Search for current usage pattern to ensure consistency
rg "CONFIG\.makeWebhookNotionApi"
Length of output: 386
Script:
#!/bin/bash
# Search for any files containing 'notion' or 'webhook' to ensure we haven't missed any API URL references
rg -i "notion|webhook" --type ts
# Check the content of Config.ts to understand the configuration setup
cat packages/shared/src/constants/Config.ts
Length of output: 1633
packages/web/src/hooks/useSupabaseClient.ts (3)
12-14
: 커스텀 훅 구현이 잘 되었습니다
useMemo
를 사용하여 클라이언트 인스턴스를 캐싱하는 방식이 적절합니다. 빈 의존성 배열을 사용하여 단일 인스턴스를 보장하는 것도 좋은 구현입니다.
1-3
: 타입 안전성이 잘 구현되었습니다
필요한 타입과 유틸리티를 적절히 임포트하고 있습니다. 모듈 별칭(@extension, @src)을 사용한 것도 좋은 방식입니다.
16-16
: 훅 사용 패턴 검증 필요
이 훅이 애플리케이션 전반에서 일관되게 사용되고 있는지 확인이 필요합니다.
✅ Verification successful
클라이언트와 서버 컴포넌트에서 적절한 Supabase 클라이언트 사용 패턴 확인됨
검증 결과:
- 서버 컴포넌트(
page.tsx
,layout.tsx
,route.ts
)와 서버 유틸리티에서는getSupabaseClient()
직접 호출 - 클라이언트 컴포넌트(hooks, components 디렉토리)에서는
useSupabaseClient()
훅 사용 - 일관된 패턴으로 구현되어 있어 문제없음
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: 기존 getSupabaseClient 직접 호출과 새로운 useSupabaseClient 훅 사용 현황 확인
echo "getSupabaseClient 직접 호출 검색:"
rg "getSupabaseClient\(\)" --type ts
echo "\nuseSupabaseClient 훅 사용 검색:"
rg "useSupabaseClient\(\)" --type ts
Length of output: 2157
packages/shared/src/utils/extension/Storage.ts (3)
1-1
: 상수 관리 개선이 잘 이루어졌습니다.
설정 값들을 SUPABASE
와 CONFIG
객체로 중앙 집중화하여 관리하는 방식으로 개선된 것이 좋습니다. 이는 상수 관리를 더욱 체계적으로 만들어줍니다.
16-17
: 일관된 설정 참조 패턴이 유지되었습니다.
removeSession
함수에서도 동일한 패턴으로 SUPABASE.authToken
과 CONFIG.webUrl
을 사용하여 일관성을 유지하고 있습니다.
6-7
: 설정 값 참조 방식이 일관되게 변경되었습니다.
SUPABASE.authToken
과 CONFIG.webUrl
을 사용하는 방식으로 통일되어 일관성이 향상되었습니다. 다만, 이러한 변경이 다른 부분에도 올바르게 적용되었는지 확인이 필요합니다.
다른 파일에서도 동일한 방식으로 사용되는지 확인하기 위한 스크립트입니다:
✅ Verification successful
Let me generate additional scripts to verify the complete usage pattern and check for any inconsistencies:
설정 값 참조가 일관되게 적용되어 있음을 확인했습니다.
코드베이스 전체를 검토한 결과:
CONFIG.webUrl
은 모든 위치에서 일관되게 사용되고 있습니다SUPABASE.authToken
도 일관된 방식으로 사용되고 있으며, 다른 형태의 토큰 참조는 발견되지 않았습니다- 기존
WEB_URL
상수는 Config 파일 내부에서만 환경 변수로 참조되고 있어 적절합니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent usage of SUPABASE.authToken and CONFIG.webUrl
# Check for any remaining direct usage of old constants
rg "SUPABASE_AUTH_TOKEN|WEB_URL" --type ts
# Check for new constant usage pattern
rg "SUPABASE\.authToken|CONFIG\.webUrl" --type ts
Length of output: 1587
Script:
#!/bin/bash
# Check for any SUPABASE constant usage patterns
rg "SUPABASE\." --type ts -A 2
# Check Config.ts files to understand the constant definitions
cat packages/web/src/constants/Config.ts packages/shared/src/constants/Config.ts
# Check if there are any other auth token related patterns
rg "authToken|auth_token" --type ts -i
Length of output: 4479
pages/content-ui/src/index.tsx (1)
1-2
: import 구문 단순화 검증 필요
이전에 사용되던 formatUrl
, getMemo
, insertMemo
, getSupabaseClient
등의 함수들이 제거되었습니다. 이러한 변경이 다른 부분에 영향을 미치지 않는지 확인이 필요합니다.
pages/side-panel/src/hoc/withAuthentication.tsx (2)
1-2
: 의존성 주입 방식의 개선이 확인됨
Supabase 클라이언트 관리 방식이 React Query를 활용한 방식으로 개선되었습니다. 이는 상태 관리의 일관성과 성능 향상에 도움이 될 것으로 보입니다.
7-8
: 에러 처리 검증이 필요합니다
useSupabaseClientQuery와 useSupabaseUser 훅의 에러 상태 처리가 명시적으로 되어있지 않습니다.
다음 사항들을 확인해주세요:
에러 처리를 위한 개선된 구현을 제안드립니다:
- const { data: supabaseClient } = useSupabaseClientQuery();
- const { user } = useSupabaseUser({ supabaseClient });
+ const { data: supabaseClient, error: clientError } = useSupabaseClientQuery();
+ const { user, error: userError } = useSupabaseUser({ supabaseClient });
+
+ if (clientError || userError) {
+ console.error('Authentication error:', clientError || userError);
+ return <LoginSection />;
+ }
✅ Verification successful
에러 처리가 적절히 구현되어 있습니다
useSuspenseQuery
를 사용하는 컴포넌트들이 모두 ErrorBoundary
로 감싸져 있어 에러 처리가 적절히 이루어지고 있습니다. 특히:
withAuthentication
HOC가 사용되는 컴포넌트들은ErrorBoundary
로 래핑되어 있습니다.LoginSection
이FallbackComponent
로 지정되어 있어, 인증 관련 에러 발생 시 로그인 화면으로 자연스럽게 전환됩니다.- Suspense와 함께 사용되어 로딩 상태도 적절히 처리되고 있습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: 에러 처리 구현 확인
# useSupabaseClientQuery의 에러 처리 구현 확인
ast-grep --pattern 'useSupabaseClientQuery = () => {
$$$
error $$$
$$$
}'
# useSupabaseUser의 에러 처리 구현 확인
ast-grep --pattern 'useSupabaseUser = ($$$) => {
$$$
error $$$
$$$
}'
Length of output: 159
Script:
#!/bin/bash
# Let's try to find the hook implementations with more flexible patterns
echo "Searching for useSupabaseClientQuery implementation:"
rg "useSupabaseClientQuery" -A 10
echo -e "\nSearching for useSupabaseUser implementation:"
rg "useSupabaseUser" -A 10
echo -e "\nSearching for error handling patterns in the component:"
rg "withAuthentication" -A 20
Length of output: 11076
Script:
#!/bin/bash
# Let's check if these hooks are using React Query's useSuspenseQuery
echo "Checking useSuspenseQuery implementation and error boundaries:"
rg "useSuspenseQuery" -A 5
echo -e "\nChecking for error boundary components:"
rg "ErrorBoundary" -A 10
Length of output: 11253
packages/shared/src/hooks/supabase/useCategoryQuery.ts (1)
3-3
: 함수명 변경이 일관성 있게 적용되었는지 확인 필요
getCategory
에서 getCategories
로의 변경이 적절해 보입니다. 다만, 이러한 복수형으로의 변경이 다른 관련 컴포넌트나 훅에서도 일관되게 적용되었는지 확인이 필요합니다.
✅ Verification successful
Based on the search results, I can now generate the final response since I have sufficient information. The search shows that:
- There are no remaining instances of
getCategory
in the codebase - All relevant files consistently use
getCategories
- The function is properly defined in
Supabase.ts
and used consistently in other files
Final response:
함수명 변경이 일관되게 적용되었음을 확인했습니다
코드베이스 전체를 검토한 결과, getCategory
에서 getCategories
로의 변경이 모든 관련 파일에서 일관되게 적용되었습니다. 특히:
packages/shared/src/utils/Supabase.ts
에서 함수가 올바르게 정의됨packages/web/src/app/[lng]/memos/layout.tsx
와packages/shared/src/hooks/supabase/useCategoryQuery.ts
에서 일관되게 사용됨
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: 다른 파일들에서 getCategory 사용 여부 확인
# getCategory 함수의 사용 여부 확인
rg "getCategory" -l
# getCategories 함수의 정의와 사용 확인
rg "getCategories" -A 3
Length of output: 2026
packages/shared/src/hooks/supabase/useSupabaseUser.ts (1)
11-12
: 코드가 더 간결해졌네요!
queryFn
을 인라인 화살표 함수로 변경하여 코드가 더 간단하고 이해하기 쉬워졌습니다. TypeScript 제네릭을 사용하여 타입 안정성도 잘 유지되어 있습니다.
pages/side-panel/src/components/LoginSection.tsx (2)
1-1
: 설정 중앙화 리팩토링이 잘 적용되었습니다.
개별 상수 대신 CONFIG 객체를 사용하도록 변경한 것이 좋은 접근 방식입니다. 이는 설정 관리를 더욱 체계적으로 만들어줍니다.
13-13
: CONFIG 객체의 구조와 사용법을 확인해주세요.
CONFIG.webUrl이 올바르게 설정되어 있는지 확인이 필요합니다.
다음 스크립트를 실행하여 CONFIG 객체의 구조와 사용을 검증하겠습니다:
✅ Verification successful
Let's verify the getSafeConfig
function to ensure it properly handles the configuration values.
CONFIG 객체가 올바르게 구현되어 있음을 확인했습니다
CONFIG 객체와 관련하여 다음 사항들이 확인되었습니다:
getSafeConfig
함수가 적절한 에러 처리와 함께 구현되어 있습니다- CONFIG 객체는 환경 변수를 통해
webUrl
을 안전하게 설정합니다 LoginSection.tsx
에서의 CONFIG.webUrl 사용은 다른 파일들의 사용 패턴과 일치합니다
따라서 현재 구현에 문제가 없으며, 추가적인 검증이 필요하지 않습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# CONFIG 객체의 정의와 사용법 확인
# CONFIG 객체의 정의 검색
echo "CONFIG 객체 정의 확인:"
rg -p "export const CONFIG" -A 10
# webUrl 속성의 사용 검색
echo "\nwebUrl 사용 패턴 확인:"
rg "CONFIG\.webUrl"
Length of output: 2381
Script:
#!/bin/bash
# getSafeConfig 함수의 구현 확인
echo "getSafeConfig 함수 구현 확인:"
rg -p "function getSafeConfig" -A 5
# 환경 변수 설정 파일 확인
echo "\n환경 변수 설정 파일 검색:"
fd -e env
Length of output: 151
Script:
#!/bin/bash
# getSafeConfig 함수 검색 (다른 패턴으로 시도)
echo "getSafeConfig 정의 검색:"
rg -p "getSafeConfig.*=" -A 5
# CONFIG 가져오기 패턴 확인
echo "\nCONFIG import 패턴 확인:"
rg "import.*CONFIG.*from"
Length of output: 1555
packages/web/src/app/[lng]/memos/page.tsx (3)
Line range hint 1-8
: 서버 컴포넌트 설정과 임포트 구성이 적절합니다.
서버 컴포넌트 지시자가 올바르게 배치되어 있으며, 임포트 구문이 잘 정리되어 있습니다. getMemo
에서 getMemos
로의 변경이 전체적인 리팩토링 방향과 일치합니다.
Line range hint 10-19
: 컴포넌트 구현이 Next.js 서버 컴포넌트 패턴을 잘 따르고 있습니다.
서버 사이드 데이터 페칭과 하이드레이션 처리가 적절하게 구현되어 있습니다.
14-14
: getMemos 함수의 구현 확인이 필요합니다.
getMemo
에서 getMemos
로의 변경이 데이터 구조나 반환 타입에 영향을 미칠 수 있습니다. 관련 타입 정의와 구현을 확인해주세요.
✅ Verification successful
getMemos 함수 구현이 확인되었습니다
getMemos
함수는 packages/shared/src/utils/Supabase.ts
에 올바르게 구현되어 있으며, 관련 타입들도 적절히 정의되어 있습니다. 데이터 구조와 반환 타입이 일관성 있게 유지되고 있어 문제가 없습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# getMemos 함수의 구현과 타입 정의 확인
ast-grep --pattern 'export const getMemos = async (supabase: SupabaseClient) => {
$$$
}'
# 관련된 타입 정의 확인
rg -t typescript "type.*Memo.*=" -A 3
Length of output: 167
Script:
#!/bin/bash
# getMemos 함수의 구현 검색
rg "export const getMemos" -A 5
# Memo 관련 타입 정의 검색
rg "type.*Memo" -A 3
# getMemo 함수의 이전 구현 검색 (변경 전 코드)
rg "export const getMemo[^s]" -A 5
# 파일 내의 전체 컨텍스트 확인
cat "packages/web/src/app/[lng]/memos/page.tsx"
Length of output: 5896
packages/shared/tsconfig.json (4)
22-24
: 빌드 출력 설정이 적절히 구성됨
declarationDir
와 outDir
를 'dist'로 설정한 것은 적절해 보입니다. forceConsistentCasingInFileNames
추가는 크로스 플랫폼 호환성을 향상시킬 것입니다.
26-26
: 소스 파일 포함 패턴이 단순화됨
include
패턴을 "src"로 단순화한 것은 명확해 보입니다. 다만, 다음 사항을 확인해주세요:
- src 디렉토리 외부의 TypeScript 파일들이 있는지
- 테스트 파일들의 위치가 적절한지
✅ Verification successful
Let me verify the test files location and the structure of TypeScript files outside the src directory.
src
디렉토리 패턴으로의 단순화가 적절합니다
검증 결과, packages/shared의 모든 TypeScript 파일들이 src 디렉토리 내에 올바르게 위치해 있으며, 테스트 파일들은 별도의 tests 디렉토리에서 관리되고 있어 현재 설정에 영향을 받지 않습니다. 따라서 tsconfig.json의 "include": ["src"] 설정은 적절합니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: src 디렉토리 외부의 TypeScript 파일 검색
# src 디렉토리 외부의 .ts/.tsx 파일 검색
fd -e ts -e tsx -E src -E node_modules -E dist
Length of output: 1338
Script:
#!/bin/bash
# Check if there are any TypeScript files in the packages/shared directory
fd -e ts -e tsx . packages/shared
# Check the structure of test files
fd -e test.ts -e spec.ts -e test.tsx -e spec.tsx
Length of output: 3384
20-21
: 모듈 해결 전략 변경 확인 필요
moduleResolution
을 'bundler'로 변경한 것은 빌드 도구와의 호환성을 확인해야 합니다. 특히 다음 사항들을 검토해주세요:
- 현재 사용 중인 번들러가 이 설정을 지원하는지
- 외부 의존성들이 이 해결 방식과 호환되는지
✅ Verification successful
moduleResolution: "bundler"
설정은 안전합니다
이 프로젝트는 Vite를 주요 번들러로 사용하고 있으며, 일부 패키지에서는 Rollup도 사용하고 있습니다. 두 도구 모두 TypeScript의 "bundler" moduleResolution을 완벽하게 지원합니다:
- 대부분의 패키지가 Vite를 사용하여 빌드 (
vite build
) - Vite는 내부적으로 Rollup을 사용하며, 둘 다 Node.js의 모듈 해결 방식을 따름
- 프로젝트의 빌드 스크립트들이 이미 이러한 번들러들과 통합되어 있음
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: package.json에서 사용 중인 번들러 확인
# package.json 파일들에서 번들러 관련 의존성 검색
fd package.json --exec jq '.dependencies + .devDependencies | with_entries(select(.key | test("webpack|rollup|vite|esbuild|parcel")))'
Length of output: 810
Script:
#!/bin/bash
# Check the content of @extension/vite-config since it's commonly used
fd "vite-config" -t f --exec cat {}
# Also check if there are any build scripts in package.json files
fd package.json --exec jq '.scripts | with_entries(select(.value | test("build")))'
Length of output: 2091
9-9
: 경로 매핑 변경사항 검토 필요
@*
와일드카드 매핑은 너무 광범위할 수 있으며, 모듈 해결 시 모호성을 초래할 수 있습니다. 더 구체적인 매핑 패턴을 고려해보시기 바랍니다.
다음 스크립트로 현재 사용 중인 import 경로들을 확인해보세요:
✅ Verification successful
경로 매핑 설정이 적절합니다
@*
경로 매핑은 현재 프로젝트 구조에 적합합니다. 다른 tsconfig 파일들의 경로 매핑 패턴을 검토한 결과, 이는 shared 패키지의 특성을 고려한 의도적인 설정으로 판단됩니다. 각 패키지가 자체적인 경로 매핑(@src/*
, @root/*
등)을 가지고 있어 충돌 가능성이 없습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: 프로젝트에서 사용 중인 import 경로 패턴 확인
# @ 심볼을 사용하는 모든 import 문 검색
rg "from ['\"]\@" --type ts --type tsx
Length of output: 129
Script:
#!/bin/bash
# Search for imports starting with @ in TypeScript files
rg "from ['\"]@" --type ts --type tsx
# Also search for direct imports with @ prefix
rg "import .* from ['\"]@" --type ts --type tsx
# Search for require statements with @ prefix
rg "require\(['\"]@" --type ts --type tsx
# Find all TypeScript files that might use path aliases
fd "\.(ts|tsx)$" -x grep -l "@"
Length of output: 8333
Script:
#!/bin/bash
# Search for import statements in TypeScript files with proper file type specification
rg "from ['\"]@" -t typescript
# Look for path mappings in all tsconfig files
fd "tsconfig.*\.json$" -x cat {} \; | grep -A 5 "paths"
# Find all package.json files to understand project structure
fd "package\.json$" -x cat {} \; | grep -E "\"name\"|\"main\"|\"types\""
Length of output: 2433
packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx (2)
Line range hint 8-22
: 구현이 깔끔하고 안전합니다!
- TypeScript 타입 안전성이 잘 구현되어 있습니다
- 국제화(i18n) 처리가 적절히 되어 있습니다
- 조건부 렌더링이 명확합니다
- 에러 처리가 깔끔합니다
3-3
: URL_CHROME_STORE 상수 제거 검증 필요
URL_CHROME_STORE 상수가 제거되었습니다. 이 상수가 다른 방식으로 접근되고 있는지 확인이 필요합니다.
✅ Verification successful
URL_CHROME_STORE 상수 제거는 적절한 리팩토링입니다
URL_CHROME_STORE 상수는 현재 URL.chromeStore
로 리팩토링되어 있으며, ExtensionVersion 컴포넌트에서는 이 URL이 사용되지 않습니다. 따라서 해당 import 제거는 적절한 변경입니다.
packages/shared/src/constants/Url.ts
에 Chrome 웹스토어 URL이 정의되어 있음- Footer, Introduction, ExtensionDialog 등의 컴포넌트에서
URL.chromeStore
로 접근하여 사용 중 - ExtensionVersion 컴포넌트는 버전 정보만 표시하는 용도로, 스토어 URL을 사용하지 않음
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify if URL_CHROME_STORE is used elsewhere or replaced with a different constant
# Check for any remaining direct usage of URL_CHROME_STORE
rg "URL_CHROME_STORE"
# Check for potential replacement patterns in constants
rg -A 5 "chrome.*store" "packages/*/src/**/constants.{ts,tsx}"
Length of output: 163
Script:
#!/bin/bash
# Let's try a broader search for constants files and chrome store URLs
# First, find all potential constant files
fd "constants\.(ts|tsx)$"
# Then search for chrome store related patterns in all files
rg -i "chrome.*store|web\s*store"
# Also check the specific component for any chrome store URL usage
cat "packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx"
Length of output: 1834
packages/shared/src/utils/Sentry.ts (1)
4-4
: 설정 관리 개선을 위한 import 변경이 적절해 보입니다.
기존의 개별 상수 대신 중앙화된 CONFIG 객체를 사용하는 것은 설정 관리 측면에서 좋은 접근 방식입니다.
packages/web/src/utils/supabase.client.ts (3)
1-1
: 설정 관리 개선을 위한 import 구조 변경이 잘 되었습니다.
개별 상수들을 CONFIG
객체로 통합한 것은 좋은 접근 방식입니다. 이는 설정 관리를 더욱 용이하게 만들고 유지보수성을 향상시킵니다.
Also applies to: 3-3
21-21
: 스키마 구조 변경에 대한 검증이 필요합니다.
SUPABASE.schemaMemo
로의 변경이 다른 부분에 영향을 미치지 않는지 확인이 필요합니다.
✅ Verification successful
스키마 구조 변경이 일관되게 적용되어 있습니다
SUPABASE.schemaMemo
는 packages/shared/src/constants/Supabase.ts
에 'memo'로 정의되어 있으며, 이 값이 다음 위치들에서 일관되게 사용되고 있습니다:
packages/web/src/utils/supabase.client.ts
packages/web/src/utils/supabase.server.ts
packages/shared/src/utils/Supabase.ts
packages/shared/src/utils/extension/Supabase.ts
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# SUPABASE 객체의 스키마 구조 확인
ast-grep --pattern 'export const SUPABASE = {
$$$
schemaMemo: $_
$$$
}'
Length of output: 79
Script:
#!/bin/bash
# Search for SUPABASE constant definitions
rg "export const SUPABASE" -A 10
# Search for schemaMemo usage
rg "schemaMemo" -A 2
Length of output: 2545
7-7
: CONFIG 객체의 타입 검증이 필요합니다.
CONFIG.supabaseUrl
와 CONFIG.supabaseAnonKey
가 올바른 타입으로 정의되어 있는지 확인이 필요합니다.
✅ Verification successful
CONFIG 객체의 타입이 적절하게 정의되어 있습니다.
CONFIG
객체는 getSafeConfig
함수를 통해 환경 변수의 존재 여부를 검증하고 있으며, supabaseUrl
과 supabaseAnonKey
는 문자열 타입으로 안전하게 처리되고 있습니다. 또한 Database 타입도 올바르게 정의되어 있어 타입 안전성이 보장됩니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# CONFIG 객체의 타입 정의 확인
ast-grep --pattern 'interface Config {
$$$
supabaseUrl: string
supabaseAnonKey: string
$$$
}'
Length of output: 103
Script:
#!/bin/bash
# CONFIG 타입 정의 검색 - 다른 패턴으로 시도
rg -A 5 "type Config|interface Config|const CONFIG:"
# CONFIG 객체 사용 위치 확인
rg "CONFIG\." -A 2
Length of output: 4031
Script:
#!/bin/bash
# CONFIG 타입/상수 정의 검색 - 환경 설정 파일 확인
fd -e ts "config|env" --exec cat {}
# Database 타입 정의 확인
rg "type Database|interface Database" -A 5
Length of output: 3059
packages/shared/src/hooks/supabase/useMemosQuery.ts (1)
1-7
: 타입 정의가 명확하고 깔끔합니다! 👍
QueryData
와 QueryError
타입을 명시적으로 정의함으로써 타입 안정성이 향상되었습니다.
packages/shared/src/hooks/supabase/useMemoQuery.ts (1)
3-3
: 변경된 import 구문이 적절합니다.
getMemo
에서 getMemos
로의 변경이 전체적인 리팩토링 방향과 일치합니다.
packages/web/src/hooks/useMemoDeleteMutation.ts (2)
Line range hint 20-28
: 구현이 올바르게 되었습니다
React Query의 mutation 구현이 다음과 같은 모범 사례를 잘 따르고 있습니다:
- 적절한 타입 정의
- 캐시 무효화 처리
- 성공 콜백 처리
16-18
: deleteMemo 유틸리티 함수 사용 확인이 필요합니다
deleteMemo
유틸리티 함수의 구현이 올바른지 확인이 필요합니다.
✅ Verification successful
deleteMemo
유틸리티 함수가 올바르게 구현되어 있습니다
packages/shared/src/utils/Supabase.ts
에서 deleteMemo
함수의 구현을 확인했습니다. 이 함수는:
- 올바른 타입(
MemoSupabaseClient
)과 매개변수를 사용합니다 - Supabase의 표준 DELETE 쿼리를 사용하여 메모를 삭제합니다
- 삭제된 레코드를 반환하도록
select()
를 포함하고 있습니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of deleteMemo utility function
ast-grep --pattern 'export function deleteMemo($client, $id) {
$$$
}'
Length of output: 73
Script:
#!/bin/bash
# Search for deleteMemo function definition with rg
rg "deleteMemo" -A 5
# Also try to find any exports of deleteMemo
rg "export.*deleteMemo"
# Search for files containing deleteMemo in their name
fd "deleteMemo"
Length of output: 5062
packages/web/src/app/auth/callback/route.ts (2)
4-4
: 상수 관리 개선이 잘 이루어졌습니다!
쿠키 관련 상수들을 COOKIE_KEY
객체로 통합한 것은 코드의 일관성과 유지보수성을 향상시키는 좋은 변경입니다.
18-23
: 토큰 만료 시간을 재검토해 주세요.
현재 구현상 몇 가지 보안 관련 고려사항이 있습니다:
- 액세스 토큰과 리프레시 토큰의 만료 기간이 동일하게 1년으로 설정되어 있습니다.
- 일반적으로 액세스 토큰은 리프레시 토큰보다 짧은 만료 기간을 가져야 합니다.
다음과 같이 개선하는 것을 고려해보세요:
- cookieStore.set(COOKIE_KEY.accessToken, sessionData.session.access_token, {
- maxAge: 3600 * 24 * 365, // 1년
- });
+ cookieStore.set(COOKIE_KEY.accessToken, sessionData.session.access_token, {
+ maxAge: 3600 * 24, // 1일
+ });
cookieStore.set(COOKIE_KEY.refreshToken, sessionData.session.refresh_token, {
maxAge: 3600 * 24 * 365, // 1년
});
packages/web/src/app/[lng]/memos/components/MemoView/index.tsx (2)
5-6
: 훅 사용으로의 마이그레이션이 잘 이루어졌습니다!
getSupabaseClient
유틸리티 함수에서 useSupabaseClient
훅으로의 전환이 깔끔하게 이루어졌습니다.
13-13
: 훅 사용의 일관성 검증이 필요합니다.
useSupabaseClient
훅으로의 전환이 잘 이루어졌습니다. 다만, 컴포넌트 전반에 걸쳐 일관된 사용이 이루어지고 있는지 확인이 필요합니다.
다음 스크립트를 실행하여 useSupabaseClient
훅의 일관된 사용을 확인하겠습니다:
✅ Verification successful
Let me analyze the results and provide the final response in Korean.
useSupabaseClient
훅 사용이 적절하게 구현되었습니다.
검증 결과, getSupabaseClient
와 useSupabaseClient
의 사용이 명확하게 구분되어 있습니다:
- 서버 컴포넌트와 유틸리티에서는
getSupabaseClient
를 사용 - 클라이언트 컴포넌트에서는
useSupabaseClient
훅을 일관되게 사용
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent usage of useSupabaseClient hook across components
# and ensure no instances of getSupabaseClient remain
echo "Checking for any remaining instances of getSupabaseClient..."
rg "getSupabaseClient"
echo "Verifying useSupabaseClient hook usage in components..."
ast-grep --pattern 'const $_ = useSupabaseClient()'
Length of output: 3711
packages/web/src/app/auth/callback-email/route.ts (1)
4-4
: 상수 관리 개선이 잘 이루어졌습니다.
공유 상수를 통합된 COOKIE_KEY
객체로 관리하도록 변경한 것이 좋은 개선사항입니다.
packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx (1)
18-18
: queryClient 선언 위치 변경이 적절합니다.
코드의 가독성과 관련 훅들의 그룹화 측면에서 좋은 변경입니다.
packages/web/src/app/components/Introduction.tsx (1)
1-1
: URL 상수 관리 개선이 잘 적용되었습니다!
URL 관리를 중앙화하여 상수를 관리하는 방식으로 변경한 것이 좋은 개선사항입니다. 이는 향후 URL 변경 시 유지보수성을 높여줄 것입니다.
Also applies to: 21-21
packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts (1)
1-1
: 상수 관리 개선이 잘 이루어졌습니다!
개별 URL 상수들을 하나의 URL 객체로 통합한 것이 코드 구조를 개선하는데 도움이 될 것 같습니다.
pages/side-panel/src/components/MemoHeader.tsx (3)
1-2
: 훅 임포트 구조가 개선되었습니다!
확장 프로그램 관련 훅들을 별도의 경로로 분리한 것은 좋은 구조 개선입니다. 코드의 관심사 분리가 잘 이루어졌습니다.
17-18
: 메모 URL 생성 로직 검증이 필요합니다.
memoData
가 undefined일 경우의 처리가 필요할 수 있습니다. getMemoUrl
함수가 undefined 입력값을 적절히 처리하는지 확인해주세요.
URL 생성 로직을 확인하겠습니다:
✅ Verification successful
getMemoUrl
함수는 undefined 입력값을 안전하게 처리합니다.
getMemoUrl
함수의 구현을 확인한 결과, 다음과 같은 이유로 안전합니다:
id
파라미터가 옵셔널(id?: number
)로 정의되어 있습니다- undefined 입력값이 들어올 경우 기본 메모 목록 URL(
${CONFIG.webUrl}/memos
)을 반환합니다 memoData?.id
의 옵셔널 체이닝은 적절히 사용되었습니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: getMemoUrl 함수 구현 확인
ast-grep --pattern 'export function getMemoUrl($_) {
$$$
}'
Length of output: 63
Script:
#!/bin/bash
# Let's try searching for getMemoUrl function with different patterns
rg "getMemoUrl" -A 5
# Also search for any file that might contain this function
fd "getMemoUrl"
Length of output: 1357
9-13
: 훅 사용 패턴 검증이 필요합니다.
새로운 useSupabaseClientQuery
와 useMemoQuery
훅의 에러 처리가 구현되어 있는지 확인이 필요합니다.
다음 스크립트로 훅의 구현을 확인해보겠습니다:
✅ Verification successful
훅 구현이 적절하게 되어 있습니다.
검증 결과:
useSupabaseClientQuery
는useSuspenseQuery
를 사용하여 에러 처리와 재시도 로직이 내장되어 있습니다.useMemoQuery
는useQuery
를 사용하며, 적절한 enabled 조건과 데이터 선택 로직이 구현되어 있습니다.
두 훅 모두 React Query를 기반으로 하여 에러 처리, 로딩 상태, 캐싱 등이 자동으로 관리되고 있습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: 훅 구현 확인
# useSupabaseClientQuery 구현 확인
ast-grep --pattern 'export function useSupabaseClientQuery() {
$$$
}'
# useMemoQuery 에러 처리 확인
ast-grep --pattern 'export function useMemoQuery($_) {
$$$
catch($_) {
$$$
}
$$$
}'
Length of output: 171
Script:
#!/bin/bash
# Let's try a different approach to find the hook implementations
# Search for files containing the hook names
echo "=== Files containing useSupabaseClientQuery ==="
rg "useSupabaseClientQuery" -l
echo -e "\n=== Files containing useMemoQuery ==="
rg "useMemoQuery" -l
echo -e "\n=== Implementation of useSupabaseClientQuery ==="
rg "useSupabaseClientQuery" -A 10
echo -e "\n=== Implementation of useMemoQuery ==="
rg "useMemoQuery" -A 10
Length of output: 13496
packages/web/src/utils/middleware.ts (2)
2-2
: 설정 관리 개선을 위한 import 수정이 적절합니다.
상수값들을 CONFIG 객체로 통합하여 관리하는 방식으로 변경한 것이 좋습니다. 이는 설정 값의 중앙 집중화를 통해 유지보수성을 향상시킵니다.
12-12
: CONFIG 객체의 Supabase 설정값 검증이 필요합니다.
supabaseClient 초기화에 CONFIG 객체를 사용하는 방식으로 변경된 것은 적절하나, 이 값들이 올바르게 설정되어 있는지 확인이 필요합니다.
✅ Verification successful
CONFIG 객체의 Supabase 설정이 적절히 구현되어 있습니다
getSafeConfig 함수를 통해 환경 변수가 없을 경우 오류를 발생시키도록 안전하게 구현되어 있으며, web과 shared 패키지 모두에서 Supabase 관련 설정이 올바르게 정의되어 있습니다. 특히:
- web 패키지는 NEXT_PUBLIC_ 접두사가 붙은 환경 변수를 사용
- shared 패키지는 기본 환경 변수를 사용
- 모든 설정값이 누락된 경우 명확한 오류 메시지 제공
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# CONFIG 객체 내 Supabase 관련 설정값들이 올바르게 정의되어 있는지 확인
# constants 파일에서 CONFIG 정의 확인
rg -A 5 "export const CONFIG = {"
# Supabase URL과 ANON_KEY 설정 확인
rg "supabaseUrl|supabaseAnonKey"
Length of output: 1223
Script:
#!/bin/bash
# Check getSafeConfig implementation and usage
ast-grep --pattern 'function getSafeConfig($_,$_) { $$$ }'
# Check CONFIG object definition in both constants files
rg -A 10 "export const CONFIG = \{" --escape
# Check environment variable setup in relevant config files
fd ".env" --exec cat {} \; || true
Length of output: 949
Script:
#!/bin/bash
# Check getSafeConfig implementation
rg -A 5 "getSafeConfig.*="
# Check CONFIG object definition with proper escaping
rg -A 10 "export const CONFIG = \{" -e
# Check for environment variable validation
rg "NEXT_PUBLIC_SUPABASE|SUPABASE.*process\.env" -A 2
Length of output: 1759
packages/web/src/middleware.ts (2)
Line range hint 36-38
: 설정이 적절해 보입니다.
matcher 설정이 정적 파일과 이미지를 적절히 제외하고 있습니다.
5-5
: 함수 변경이 올바르게 이루어졌는지 확인이 필요합니다.
isStringArray
에서 checkStringArray
로의 변경이 이루어졌습니다. 두 함수의 동작이 완전히 동일한지 확인이 필요합니다.
Also applies to: 7-7
✅ Verification successful
Let me gather more information about these functions, particularly focusing on the shared utils where the function is defined.
Let me try a different approach to locate the function definition.
Let me search for the previous implementation to compare.
checkStringArray
함수의 구현이 확인되었습니다
checkStringArray
함수는 packages/shared/src/utils/String.ts
에 올바르게 구현되어 있으며, 타입 가드로서 입력값이 문자열 배열인지 확인하는 적절한 로직을 포함하고 있습니다. 이전 isStringArray
함수가 더 이상 코드베이스에서 발견되지 않는 것으로 보아 이는 단순한 함수 이름 변경으로 판단됩니다.
현재 구현:
- 배열 여부 확인
- 모든 요소가 문자열인지 검증
- 타입 가드 기능 (
value is string[]
)
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of both string array check functions
# Check the implementation of both functions
rg -A 5 "function (isStringArray|checkStringArray)"
# Check all usages to ensure consistent behavior
rg "(isStringArray|checkStringArray)\("
Length of output: 196
Script:
#!/bin/bash
# Search for the function definition in shared utils
ast-grep --pattern 'function checkStringArray($_) {
$$$
}'
# Find the file containing the function
fd checkStringArray
# Check git history for any recent changes related to these functions
git log -p --grep="isStringArray\|checkStringArray" --max-count=1
Length of output: 84
Script:
#!/bin/bash
# Search for the file and function in shared utils directory
fd -t f . packages/shared
rg -l "checkStringArray"
# Look for exports containing this function
ast-grep --pattern 'export { $$ checkStringArray $$ }'
ast-grep --pattern 'export function checkStringArray'
# Check the implementation in TypeScript files
rg -t ts "checkStringArray" -B 2 -A 5
Length of output: 4737
Script:
#!/bin/bash
# Search for any previous implementation or references to isStringArray
rg "isStringArray" -B 2 -A 5
# Check git history for the specific file
git log -p packages/shared/src/utils/String.ts
Length of output: 28
packages/web/src/app/[lng]/memos/layout.tsx (2)
1-14
: 서버 컴포넌트 설정이 적절히 구현되었습니다.
'use server' 지시문 추가와 상수 관리 개선이 잘 이루어졌습니다. COOKIE_KEY와 QUERY_KEY를 통한 상수 중앙화는 유지보수성을 향상시킬 것으로 보입니다.
Line range hint 24-35
: 사이드바 상태 관리와 하이드레이션 전략이 개선되었습니다.
쿠키 키 상수화와 카테고리 조회 함수 이름 변경이 일관성 있게 적용되었습니다. 다만, 하이드레이션 경계에서의 쿼리 동작을 검증해볼 필요가 있습니다.
다음 스크립트로 카테고리 관련 쿼리 사용을 확인해보겠습니다:
✅ Verification successful
Let me check the hydration boundary implementation and query key usage pattern to verify the hydration strategy.
하이드레이션 전략이 적절하게 구현되어 있음을 확인했습니다.
- HydrationBoundaryWrapper가 QueryClient를 생성하고 prefetch를 수행한 후 적절히 상태를 dehydrate하고 있습니다.
- QUERY_KEY.category()가 일관되게 사용되고 있으며, useCategoryQuery와 mutation에서도 동일한 키를 참조하고 있습니다.
- 카테고리 데이터의 prefetch와 하이드레이션이 레이아웃 레벨에서 적절하게 처리되고 있습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# getCategories 함수의 다른 사용 사례 확인
rg "getCategories\(" --type ts
# QUERY_KEY.category 사용 패턴 확인
rg "QUERY_KEY\.category" --type ts
Length of output: 718
Script:
#!/bin/bash
# Check HydrationBoundaryWrapper implementation
ast-grep --pattern 'export function HydrationBoundaryWrapper' -l ts,tsx
# Check the implementation of QUERY_KEY.category
ast-grep --pattern 'export const QUERY_KEY = {
$$$
category$_: $_,
$$$
}'
# Check useCategoryQuery implementation
ast-grep --pattern 'export function useCategoryQuery' -l ts,tsx
Length of output: 447
Script:
#!/bin/bash
# Check HydrationBoundaryWrapper implementation
rg "export.*HydrationBoundaryWrapper" -A 5
# Check QUERY_KEY implementation
rg "export const QUERY_KEY" -A 10
# Check useCategoryQuery implementation
rg "export.*useCategoryQuery" -A 5
# Check hydration related imports
rg "import.*HydrationBoundary" --type tsx
Length of output: 2478
packages/shared/src/hooks/supabase/useMemoPostMutation.ts (1)
6-7
: 타입 정의가 명확하고 재사용 가능하게 구현되었습니다.
타입 별칭을 사용하여 코드의 가독성과 유지보수성이 향상되었습니다.
packages/web/src/app/[lng]/login/components/LoginSection/index.tsx (1)
20-28
: 화살표 함수를 사용한 콜백 처리가 개선되었습니다.
콜백 함수를 화살표 함수로 변경한 것은 좋은 개선입니다. 이는 코드의 가독성을 높이고 현대적인 React 패턴을 따르고 있습니다.
packages/shared/src/utils/extension/Supabase.ts (2)
1-1
: 상수 관리 개선이 잘 이루어졌습니다!
상수들을 CONFIG
객체로 통합하여 관리하는 방식으로 변경한 것이 좋은 개선입니다. 이는 설정 값의 중앙 집중화된 관리를 가능하게 합니다.
9-10
: 🛠️ Refactor suggestion
Supabase 클라이언트 설정에 대한 유효성 검사가 필요합니다.
CONFIG.supabaseUrl
와 CONFIG.supabaseAnonKey
값이 유효하지 않을 경우에 대한 처리가 필요합니다.
다음과 같은 방식으로 개선할 수 있습니다:
export const getSupabaseClient = async () => {
try {
+ if (!CONFIG.supabaseUrl || !CONFIG.supabaseAnonKey) {
+ throw new Error('Supabase 설정이 올바르지 않습니다.');
+ }
const supabaseClientInstance = createClient<Database>(CONFIG.supabaseUrl, CONFIG.supabaseAnonKey, {
packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx (2)
Line range hint 3-18
: 임포트 구성이 깔끔하게 정리되었습니다!
기능별로 임포트가 잘 구성되어 있으며, Supabase 클라이언트 관리 방식의 개선이 잘 반영되었습니다.
22-25
: Supabase 클라이언트 훅 사용에 대한 검증이 필요합니다.
useSupabaseClient 훅으로의 마이그레이션이 적절해 보이나, 컴포넌트 전반에 걸쳐 일관된 사용을 확인해야 합니다.
다음 스크립트로 훅 사용의 일관성을 검증하겠습니다:
✅ Verification successful
Let me analyze the results. I can see that:
getSupabaseClient
is used in server-side components (routes, layouts) and extension-related codeuseSupabaseClient
hook is consistently used across client-side components in the web package- The implementation in question (
SidebarGroupCategory.tsx
) follows the correct pattern for client components
I can now generate the final response:
Supabase 클라이언트 구현이 적절하게 되어 있습니다
클라이언트 컴포넌트에서는 useSupabaseClient
훅을, 서버 컴포넌트에서는 getSupabaseClient
함수를 일관되게 사용하고 있습니다. 이는 Next.js의 서버/클라이언트 컴포넌트 아키텍처와 잘 부합합니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent usage of useSupabaseClient hook across components
# Check for any remaining getSupabaseClient usage
echo "Checking for remaining getSupabaseClient usage:"
rg "getSupabaseClient"
# Check for useSupabaseClient hook usage pattern
echo "Verifying useSupabaseClient hook usage pattern:"
ast-grep --pattern 'const $_ = useSupabaseClient()'
Length of output: 3669
packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx (1)
4-4
: 타입 시스템 변경사항 검토 완료
GetMemoType
에서 GetMemoResponse
로의 타입 변경이 올바르게 적용되었습니다. 컴포넌트의 기능에는 영향이 없으며, 코드베이스 전반의 일관성 향상에 기여합니다.
타입 변경의 일관성을 확인하기 위해 다음 스크립트를 실행합니다:
Also applies to: 23-23
✅ Verification successful
타입 시스템 변경이 일관되게 적용되었음을 확인했습니다
GetMemoResponse
타입이 다음 위치에서 올바르게 사용되고 있습니다:
packages/shared/src/utils/Supabase.ts
에서 타입이 정의됨packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx
와MemoItem.tsx
에서 일관되게 사용됨
이전 타입인 GetMemoType
은 코드베이스에서 완전히 제거되었음을 확인했습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# GetMemoResponse 타입의 사용 패턴 확인
rg "GetMemoResponse" --type typescript
# 이전 GetMemoType이 남아있는지 확인
rg "GetMemoType" --type typescript
Length of output: 143
Script:
#!/bin/bash
# GetMemoResponse 타입의 사용 패턴 확인
rg "GetMemoResponse"
# 이전 GetMemoType이 남아있는지 확인
rg "GetMemoType"
# 관련 파일 찾기
fd -e ts -e tsx
Length of output: 12897
packages/shared/package.json (2)
38-41
: 새로운 웹 훅 내보내기가 올바르게 추가되었습니다.
새로운 웹 훅 내보내기가 기존 패턴을 잘 따르고 있으며, 타입 정의와 기본 구현을 모두 제공합니다.
38-41
: 웹 훅 관련 파일들의 존재 여부를 확인하세요.
dist 폴더에 해당 파일들이 실제로 생성되는지 확인이 필요합니다.
packages/shared/src/utils/Supabase.ts (2)
1-3
: 깔끔한 import 구조입니다!
필요한 타입과 상수들이 잘 정의되어 있으며, 불필요한 import가 제거되어 코드가 더욱 깔끔해졌습니다.
Line range hint 32-37
: 카테고리 테이블 존재 여부 확인이 필요합니다.
'category' 테이블명이 하드코딩되어 있는데, 이 테이블이 실제로 존재하는지 확인이 필요합니다.
다음 스크립트로 테이블 존재 여부를 확인할 수 있습니다:
✅ Verification successful
카테고리 테이블이 타입 시스템에서 올바르게 정의되어 있습니다.
코드베이스 분석 결과, 'category' 테이블이 다음과 같이 적절하게 정의되어 있음을 확인했습니다:
packages/shared/src/types/supabaseCustom.ts
에서CategoryTable
타입이Database['memo']['Tables']['category']
로 정의되어 있습니다.- 이 테이블 타입은 여러 컴포넌트와 훅에서 일관되게 사용되고 있습니다.
- Supabase 클라이언트 호출에서 사용되는 'category' 테이블명이 타입 시스템의 정의와 일치합니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify if 'category' table is referenced consistently across the codebase
# Search for table name references
rg -g '*.{ts,tsx}' "from\(['\"]category['\"]\)"
# Search for potential schema constants
rg -g '*.{ts,tsx}' "schemaCategory|SCHEMA_CATEGORY|CategorySchema"
Length of output: 355
Script:
#!/bin/bash
# Search for category table schema definitions and types
rg -g '*.{ts,tsx}' -A 5 "type.*Category.*Table"
# Search for database schema files
fd "schema|types" --extension sql --extension ts --extension tsx
# Search for any category-related type definitions
rg -g '*.{ts,tsx}' "interface.*Category|type.*Category"
Length of output: 1988
Script:
#!/bin/bash
# Search for Database type definition to verify schema structure
rg -g '*.{ts,tsx}' -A 10 "type.*Database.*=.*{"
# Search for generated types file
fd "generated" --extension ts
Length of output: 183
packages/shared/src/hooks/supabase/useMemoPatchMutation.ts (1)
6-11
: 타입 정의가 명확하고 잘 구조화되어 있습니다!
타입 별칭을 사용하여 코드의 가독성과 유지보수성이 향상되었습니다:
MutationVariables
는 입력 매개변수를 명확하게 정의MutationData
는Awaited
타입을 활용하여 비동기 응답을 적절하게 처리MutationError
는 기본Error
타입을 활용하여 간단하게 정의
packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx (1)
4-4
: Supabase 클라이언트 초기화 방식이 개선되었습니다.
getSupabaseClient
함수에서 useSupabaseClient
훅으로의 전환은 React의 관행에 더 잘 부합하며, 클라이언트 상태 관리를 더 효과적으로 만듭니다.
다른 컴포넌트들에서도 동일한 패턴이 적용되었는지 확인하겠습니다:
Also applies to: 8-8
✅ Verification successful
useSupabaseClient
훅으로의 마이그레이션이 일관되게 적용되었습니다.
클라이언트 컴포넌트에서는 useSupabaseClient
훅을 사용하고, 서버 컴포넌트에서는 getSupabaseClient
를 적절히 사용하고 있습니다:
- 클라이언트 컴포넌트들(
MemoTable
,MemoView
,MemoDialog
등)에서useSupabaseClient
훅 사용 - 서버 컴포넌트들(
layout.tsx
,page.tsx
,route.ts
등)에서getSupabaseClient
함수 사용
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent usage of useSupabaseClient hook across components
# Check for any remaining usage of getSupabaseClient
rg "getSupabaseClient" --type ts --type tsx
# Check for adoption of useSupabaseClient
rg "useSupabaseClient" --type ts --type tsx
Length of output: 143
Script:
#!/bin/bash
# Search for getSupabaseClient usage
rg "getSupabaseClient"
# Search for useSupabaseClient adoption
rg "useSupabaseClient"
# Find all TypeScript/React files that might use Supabase
fd "\.(tsx?|jsx?)$" | xargs rg "supabase"
Length of output: 20125
packages/web/src/utils/supabase.server.ts (1)
Line range hint 59-67
: 로그아웃 시 추가 정리 작업 필요
토큰 삭제는 잘 구현되어 있으나, 사용자 관련 추가 데이터 정리가 필요할 수 있습니다.
로컬 스토리지나 다른 저장소에 사용자 관련 데이터가 있는지 확인이 필요합니다:
✅ Verification successful
로그아웃 구현이 적절합니다
LocalStorage 구현을 검토한 결과, 저장되는 데이터가 사용자 인증과 관련이 없는 가이드, 업데이트 버전, 설치 상태 등의 앱 설정 데이터만 포함하고 있습니다. 따라서 현재 구현된 토큰 삭제만으로도 충분합니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# 사용자 관련 데이터를 저장하는 다른 위치 확인
rg -l "localStorage" --type ts
rg -l "sessionStorage" --type ts
Length of output: 304
Script:
#!/bin/bash
# Check LocalStorage.ts implementation and usage
cat packages/web/src/utils/LocalStorage.ts
# Check if there are any user-related data in localStorage
rg "localStorage\." -A 3 --type ts
Length of output: 1736
chrome-extension/lib/background/index.ts (4)
1-1
: 상수 관리 방식이 개선되었습니다.
URL 관련 상수들이 CONFIG
와 URL
객체로 통합되어 관리되는 것은 좋은 변경사항입니다. 이는 상수 관리를 더욱 체계적으로 만들어줍니다.
27-27
: 로그인 URL이 CONFIG 객체를 통해 참조되도록 변경되었습니다.
CONFIG.webUrl
을 사용하여 로그인 URL을 구성하는 것은 일관된 접근 방식입니다.
51-51
: 메모 페이지 URL도 CONFIG 객체를 통해 참조되도록 변경되었습니다.
CONFIG.webUrl
을 사용하여 메모 페이지 URL을 구성하는 것은 일관성 있는 변경입니다.
54-55
: 가이드 URL 참조 방식이 개선되었습니다.
언어별 가이드 URL을 URL
객체의 속성으로 접근하는 것은 코드의 가독성과 유지보수성을 향상시킵니다.
packages/web/src/app/[lng]/memos/components/MemoDialog/index.tsx (1)
8-8
: 훅 임포트 추가가 적절해 보입니다.
useSupabaseClient
훅을 사용하는 것은 React의 관례를 잘 따르고 있습니다.
pages/options/src/components/OptionForm.tsx (1)
3-8
: 임포트 구문이 잘 정리되었습니다.
유틸리티 함수들이 명확하게 구조분해되어 임포트되었으며, getMemo
를 getMemosSupabase
로 이름을 변경한 것이 전체적인 리팩토링 방향과 일치합니다.
package.json (1)
42-42
: Supabase SSR 패키지 추가 검토
@supabase/ssr
패키지가 추가된 것은 서버 사이드 렌더링 지원을 위한 적절한 변경으로 보입니다. 다만, 현재 최신 버전과의 호환성을 확인해보시기를 권장드립니다.
packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx (2)
4-10
: import 구문이 잘 정리되어 있습니다!
새로운 의존성들이 논리적으로 잘 구성되어 있으며, 각각의 import가 명확한 목적을 가지고 있습니다.
18-20
: 타입 변경에 따른 영향도를 확인해주세요.
GetMemoType
에서 GetMemoResponse
로의 타입 변경이 다른 컴포넌트들에도 영향을 미칠 수 있습니다.
다음 스크립트를 실행하여 GetMemoType
의 사용처를 확인해주세요:
✅ Verification successful
타입 변경이 올바르게 적용되었습니다
검색 결과에 따르면 GetMemoType
은 더 이상 코드베이스에서 사용되지 않으며, GetMemoResponse
로의 마이그레이션이 완전히 이루어졌습니다. 이 타입은 다음 위치에서만 사용되고 있습니다:
packages/shared/src/utils/Supabase.ts
: 타입 정의packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx
: 단일 메모 타입packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx
: 메모 배열 타입
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# GetMemoType이 여전히 사용되고 있는 곳이 있는지 확인
rg "GetMemoType" --type typescript
# GetMemoResponse로 마이그레이션이 필요한 파일 확인
rg "memo\?: GetMemoType" --type typescript
Length of output: 149
Script:
#!/bin/bash
# Search for GetMemoType usage
rg "GetMemoType"
# Search for files containing memo with GetMemoType type annotation
rg "memo.*GetMemoType"
# Search for GetMemoResponse usage to verify migration
rg "GetMemoResponse"
Length of output: 614
pages/side-panel/src/components/MemoForm.tsx (2)
10-11
: 훅 임포트 구조가 개선되었습니다.
확장 프로그램 관련 훅들을 extension
폴더로 이동하여 코드 구조가 더 명확해졌습니다.
24-27
: Supabase 클라이언트 접근 방식이 개선되었습니다.
useSupabaseClientQuery
를 사용하여 클라이언트 접근 방식이 일관되게 변경되었고, 타입 안정성이 향상되었습니다.
✅ Verification successful
웹 확장과 웹 애플리케이션에서 Supabase 클라이언트 훅 사용이 분리되어 있습니다
검색 결과를 통해 확인된 바로는:
- 웹 확장(pages/side-panel)에서는
useSupabaseClientQuery
를 일관되게 사용 - 웹 애플리케이션(packages/web)에서는
useSupabaseClient
를 사용
이는 의도된 설계로 보이며, 각 환경에 맞는 적절한 구현을 사용하고 있습니다. 웹 확장의 코드 변경은 해당 컨텍스트 내에서 일관성 있게 이루어졌습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent usage of useSupabaseClientQuery across the codebase
# Check for any remaining useSupabaseClient usage
rg "useSupabaseClient[^Q]" --type ts --type tsx
Length of output: 77
Script:
#!/bin/bash
# Description: Verify consistent usage of useSupabaseClientQuery across the codebase
# Using ripgrep with proper file extensions and checking both patterns
# Check for any remaining useSupabaseClient usage
rg "useSupabaseClient[^Q]" -t typescript -t tsx
# Check for new useSupabaseClientQuery usage
rg "useSupabaseClientQuery" -t typescript -t tsx
# Find all hook imports to verify the pattern
rg "import.*useSupabase" -t typescript -t tsx
Length of output: 251
Script:
#!/bin/bash
# Description: Verify consistent usage of useSupabaseClientQuery across the codebase
# Using ripgrep without file type filters since they're not supported in the environment
# Check for any remaining useSupabaseClient usage
rg "useSupabaseClient[^Q]"
# Check for new useSupabaseClientQuery usage
rg "useSupabaseClientQuery"
# Find all hook imports to verify the pattern
rg "import.*useSupabase"
Length of output: 4728
packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx (2)
18-18
: Supabase 클라이언트 초기화 방식 개선 👍
훅 기반의 접근 방식으로 전환하여 컴포넌트 전반에 걸쳐 일관성이 향상되었습니다.
32-32
: useSupabaseClient 훅 사용 검증 필요
컴포넌트 라이프사이클 내에서 Supabase 클라이언트가 적절하게 초기화되고 정리되는지 확인이 필요합니다.
✅ Verification successful
useSupabaseClient 훅 구현이 적절함
useSupabaseClient 훅은 useMemo를 통해 클라이언트 인스턴스를 메모이제이션하고 있으며, 싱글톤 패턴으로 구현되어 있어 안전합니다. 별도의 정리(cleanup) 로직이 필요하지 않습니다.
- 클라이언트는 전역 변수로 캐시되어 재사용됨
- useMemo를 통해 컴포넌트 렌더링 시 안정적으로 동일한 인스턴스 유지
- Supabase 클라이언트는 자체적으로 연결 관리를 하므로 추가 정리가 불필요
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify proper cleanup of Supabase client
# Check for cleanup handling in useSupabaseClient hook
ast-grep --pattern 'export function useSupabaseClient() {
$$$
useEffect(() => {
$$$
return () => {
$$$
}
}, [])
$$$
}'
Length of output: 146
Script:
#!/bin/bash
# Let's first check where useSupabaseClient is defined and its implementation
rg "useSupabaseClient" -A 5
# Also check for any Supabase client cleanup patterns in the codebase
rg "cleanup.*supabase|supabase.*cleanup" -i
# Check for any useEffect hooks related to Supabase client
ast-grep --pattern 'useEffect(() => {
$$$
supabase
$$$
})'
Length of output: 14383
Script:
#!/bin/bash
# Let's check the implementation of useSupabaseClient hook
cat packages/web/src/hooks/useSupabaseClient.ts
# Also check getSupabaseClientBrowser implementation
rg "getSupabaseClientBrowser" -A 10
Length of output: 1162
Summary by CodeRabbit
릴리스 노트
새로운 기능
useSupabaseClient
훅으로 변경하여 클라이언트 인스턴스의 재사용성을 향상시켰습니다.CONFIG
객체로 통합하여 URL 관리 방식을 개선했습니다.useSupabaseClientQuery
를 도입하여 데이터 쿼리 및 클라이언트 접근을 간소화했습니다.버그 수정
문서화