{"id":25813269,"url":"https://github.com/genideas-labs/supalite","last_synced_at":"2026-05-08T03:11:52.933Z","repository":{"id":279360128,"uuid":"937961385","full_name":"genideas-labs/supalite","owner":"genideas-labs","description":"typescript supabase client replacement in the small","archived":false,"fork":false,"pushed_at":"2026-02-03T07:16:16.000Z","size":1166,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-03T20:21:37.995Z","etag":null,"topics":["postgresql","supabase"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/genideas-labs.png","metadata":{"files":{"readme":"README.ko.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-02-24T07:43:00.000Z","updated_at":"2026-02-03T07:16:16.000Z","dependencies_parsed_at":"2026-01-16T15:13:20.432Z","dependency_job_id":null,"html_url":"https://github.com/genideas-labs/supalite","commit_stats":null,"previous_names":["genideas-labs/supalite"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/genideas-labs/supalite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/genideas-labs%2Fsupalite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/genideas-labs%2Fsupalite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/genideas-labs%2Fsupalite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/genideas-labs%2Fsupalite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/genideas-labs","download_url":"https://codeload.github.com/genideas-labs/supalite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/genideas-labs%2Fsupalite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32764806,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T02:36:36.067Z","status":"ssl_error","status_checked_at":"2026-05-08T02:36:07.210Z","response_time":54,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["postgresql","supabase"],"created_at":"2025-02-28T02:27:40.979Z","updated_at":"2026-05-08T03:11:52.902Z","avatar_url":"https://github.com/genideas-labs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SupaLite\n\n[![npm version](https://img.shields.io/badge/version-0.1.1-blue.svg)](https://www.npmjs.com/package/supalite)\n\n가볍고 효율적인 PostgreSQL 클라이언트 라이브러리입니다. Supabase와 동일한 API를 제공하면서도 더 가볍고 빠른 구현을 제공합니다.\n\n## 주요 기능\n\n- 🔒 타입 안전성: TypeScript로 작성되어 완벽한 타입 지원\n- 🚀 강력한 쿼리 빌더: Supabase 스타일의 직관적이고 체이닝 가능한 API\n- 🌍 멀티 스키마: 여러 데이터베이스 스키마 지원\n- 🛠 CRUD 작업: 간단하고 명확한 데이터베이스 작업\n- 📦 RPC 지원: 저장 프로시저 호출 기능\n- ⚡ 성능 최적화: 커넥션 풀링 및 효율적인 쿼리 실행\n- 💪 트랜잭션 지원: Supabase에서 지원하지 않는 안전한 데이터베이스 트랜잭션 처리\n- 🎯 UPSERT 지원: 삽입/업데이트 동작 제어\n- 🔍 고급 필터링: OR 조건, ILIKE 검색 등 지원\n- 📚 배열 작업: 다중 레코드 삽입 및 배열 데이터 처리\n- 🔄 Views, Functions, Enums 지원: Supabase 스타일의 완벽한 타입 지원\n\n## 설치 방법\n\n```bash\nnpm install supalite\n```\n\n## 타입 시스템\n\n### 데이터베이스 스키마 정의\n\n```typescript\n// Supabase CLI의 타입 생성기로 생성된 데이터베이스 타입 정의\n// 예: supabase gen types typescript --local \u003e database.types.ts\nimport { Database } from './types/database';\n\n// 타입이 적용된 클라이언트 생성\nconst client = new SupaLitePG\u003cDatabase\u003e({\n  user: 'testuser',\n  password: 'testpassword',\n  host: 'localhost',\n  database: 'testdb',\n  port: 5432,\n  ssl: false\n});\n\n// 또는 환경 변수 사용\nconst client = new SupaLitePG\u003cDatabase\u003e();\n\n// Database 인터페이스 예시 (Supabase CLI로 생성된 타입과 동일한 구조)\ninterface Database {\n  public: {\n    Tables: {\n      users: {\n        Row: {\n          id: number;\n          name: string;\n          email: string;\n          status: string;\n          last_login: string | null;\n          created_at: string;\n        };\n        Insert: {\n          name: string;\n          email: string;\n          status?: string;\n          last_login?: string | null;\n        };\n        Update: {\n          name?: string;\n          email?: string;\n          status?: string;\n          last_login?: string | null;\n        };\n        Relationships: unknown[];\n      };\n      // 다른 테이블들...\n    };\n    Views: {\n      // 뷰 정의...\n    };\n    Functions: {\n      // 함수 정의...\n    };\n    Enums: {\n      // 열거형 정의...\n    };\n  };\n  // 다른 스키마들...\n}\n```\n\n## 사용 예시\n\n### 데이터베이스 연결\n\n```typescript\nimport { SupaLitePG } from 'supalite';\nimport { Database } from './types/database';\n\n// 타입이 적용된 클라이언트 생성\nconst client = new SupaLitePG\u003cDatabase\u003e({\n  user: 'testuser',\n  password: 'testpassword',\n  host: 'localhost',\n  database: 'testdb',\n  port: 5432,\n  ssl: false\n});\n```\n\n### 기본 CRUD 작업\n\n```typescript\n// 데이터 조회\nconst { data, error } = await client\n  .from('users')\n  .select('*')\n  .eq('id', 1)\n  .single();\n\n// 단일 레코드 삽입\nconst { data, error } = await client\n  .from('users')\n  .insert({ \n    name: '홍길동', \n    email: 'hong@example.com' \n  });\n\n// 다중 레코드 삽입\nconst { data, error } = await client\n  .from('users')\n  .insert([\n    { name: '홍길동', email: 'hong@example.com' },\n    { name: '김철수', email: 'kim@example.com' }\n  ]);\n\n// 특정 컬럼 선택\nconst { data } = await client\n  .from('profiles')\n  .select('user_id, bio, interests')\n  .limit(2);\n\n// 다중 정렬\nconst { data } = await client\n  .from('users')\n  .select('name, status, last_login')\n  .order('status', { ascending: true })\n  .order('last_login', { ascending: false });\n\n// 페이지네이션\nconst page1 = await client\n  .from('posts')\n  .select('*')\n  .limit(2)\n  .offset(0);\n\n// Range 쿼리\nconst { data } = await client\n  .from('comments')\n  .select('*')\n  .range(1, 3);\n\n// 조건부 UPDATE\nconst { data } = await client\n  .from('posts')\n  .update({\n    views: 10,\n    updated_at: new Date().toISOString()\n  })\n  .eq('user_id', userId)\n  .select();\n\n// UPSERT\nconst { data } = await client\n  .from('profiles')\n  .upsert({\n    user_id: userId,\n    bio: '새로운 프로필입니다.',\n    interests: ['코딩', '음악'],\n    updated_at: new Date().toISOString()\n  }, { onConflict: 'id' })\n  .select()\n  .single();\n```\n\n### 고급 기능 사용 예시\n\n```typescript\n// 트랜잭션 사용 (Supabase에서 지원하지 않는 기능)\nawait client.transaction(async (tx) =\u003e {\n  const { data: user } = await tx\n    .from('users')\n    .insert({ name: '홍길동' })\n    .select()\n    .single();\n\n  await tx\n    .from('profiles')\n    .insert({ user_id: user.id });\n});\n\n// OR 조건 필터링\nconst { data, error } = await client\n  .from('users')\n  .or('status.eq.active,role.eq.admin');\n\n// 대소문자 구분 없는 검색\nconst { data, error } = await client\n  .from('users')\n  .ilike('email', '%@example.com');\n\n// 정확한 카운트와 함께 조회\nconst { data, count, error } = await client\n  .from('users')\n  .select('*', { count: 'exact' });\n\n// 배열 데이터 처리\nconst { data, error } = await client\n  .from('posts')\n  .insert([\n    {\n      title: '첫 번째 글',\n      tags: ['프로그래밍', '팁'],\n      content: '내용...'\n    },\n    {\n      title: '두 번째 글',\n      tags: ['여행'],\n      content: '내용...'\n    }\n  ]);\n\n// 다른 스키마 사용\nconst { data, error } = await client\n  .from('users', 'other_schema')\n  .select('*');\n```\n\n## API 문서\n\n### 쿼리 메소드\n\n- `select(columns?: string, options?: { count?: 'exact' | 'planned' | 'estimated', head?: boolean })`: 조회할 컬럼 지정\n- `insert(data: T['Tables'][K]['Insert'] | T['Tables'][K]['Insert'][])`: 단일 또는 다중 레코드 삽입\n- `update(data: T['Tables'][K]['Update'])`: 레코드 업데이트\n- `delete()`: 레코드 삭제\n- `upsert(data: T['Tables'][K]['Insert'], options?: { onConflict: string })`: 삽입 또는 업데이트\n\n### 필터 메소드\n\n- `eq(column, value)`: 같음\n- `neq(column, value)`: 같지 않음\n- `gt(column, value)`: 보다 큼\n- `gte(column, value)`: 크거나 같음\n- `lt(column, value)`: 보다 작음\n- `lte(column, value)`: 작거나 같음\n- `like(column, pattern)`: LIKE 패턴 매칭\n- `ilike(column, pattern)`: 대소문자 구분 없는 LIKE\n- `in(column, values)`: IN 연산자\n- `is(column, value)`: IS 연산자\n- `contains(column, value)`: 배열/JSON 포함 여부\n- `or(conditions)`: OR 조건 (예: 'status.eq.active,role.eq.admin')\n\n### 기타 메소드\n\n- `order(column, { ascending: boolean })`: 정렬\n- `limit(count: number)`: 결과 개수 제한\n- `offset(count: number)`: 결과 시작 위치\n- `range(from: number, to: number)`: 범위 지정\n- `single()`: 단일 결과 반환\n- `returns\u003cT\u003e()`: 반환 타입 지정\n\n### 트랜잭션 메소드\n\n- `transaction\u003cT\u003e(callback: (client: SupaLitePG) =\u003e Promise\u003cT\u003e)`: 트랜잭션 실행\n- `begin()`: 트랜잭션 시작\n- `commit()`: 트랜잭션 커밋\n- `rollback()`: 트랜잭션 롤백\n\n## 환경 변수 설정\n\n데이터베이스 연결을 위해 다음 환경 변수를 설정할 수 있습니다:\n\n```env\nDB_USER=your_db_user\nDB_HOST=your_db_host\nDB_NAME=your_db_name\nDB_PASS=your_db_password\nDB_PORT=5432\nDB_SSL=true\n```\n\n## 응답 형식\n\n모든 쿼리 메소드는 다음과 같은 형식의 응답을 반환합니다:\n\n```typescript\ninterface QueryResponse\u003cT\u003e {\n  data: T | null;        // 쿼리 결과 데이터\n  error: Error | null;   // 에러 정보\n  count?: number;        // 결과 레코드 수\n  status: number;        // HTTP 상태 코드\n  statusText: string;    // 상태 메시지\n}\n```\n\n## 개발 환경 설정\n\n### PostgreSQL 설치\nPostgreSQL을 로컬에 설치하고 테스트하는 방법은 [examples/README.md](examples/README.md)를 참조하세요.\n\n### 프로젝트 설정\n\n```bash\n# 저장소 클론\ngit clone https://github.com/your-username/supalite.git\n\n# 의존성 설치\nnpm install\n\n# 개발 서버 실행\nnpm run dev\n\n# 테스트 실행\nnpm test\n\n# 빌드\nnpm run build\n```\n\n## 라이선스\n\nMIT 라이선스로 배포됩니다. 자세한 내용은 [LICENSE](LICENSE) 파일을 참조하세요.\n\n## 저작권\n\nCopyright © 2025 Genideas Inc. and Wondong Shin (wodshin@gmail.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgenideas-labs%2Fsupalite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgenideas-labs%2Fsupalite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgenideas-labs%2Fsupalite/lists"}