supalite 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.env.example +14 -0
  2. package/.eslintrc.json +21 -0
  3. package/.prettierrc +7 -0
  4. package/CHANGELOG.md +50 -0
  5. package/CHANGE_REPORT_LOG.md +152 -0
  6. package/README.md +337 -0
  7. package/dist/__tests__/client.test.d.ts +1 -0
  8. package/dist/__tests__/client.test.js +13 -0
  9. package/dist/__tests__/postgres-client.test.d.ts +1 -0
  10. package/dist/__tests__/postgres-client.test.js +34 -0
  11. package/dist/__tests__/types.test.d.ts +1 -0
  12. package/dist/__tests__/types.test.js +12 -0
  13. package/dist/client.d.ts +8 -0
  14. package/dist/client.js +28 -0
  15. package/dist/database.types.d.ts +25 -0
  16. package/dist/database.types.js +2 -0
  17. package/dist/errors.d.ts +24 -0
  18. package/dist/errors.js +37 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.js +23 -0
  21. package/dist/postgres-client.d.ts +45 -0
  22. package/dist/postgres-client.js +166 -0
  23. package/dist/query-builder.d.ts +57 -0
  24. package/dist/query-builder.js +356 -0
  25. package/dist/types.d.ts +81 -0
  26. package/dist/types.js +2 -0
  27. package/examples/README.md +82 -0
  28. package/examples/setup.sql +72 -0
  29. package/examples/test.ts +55 -0
  30. package/examples/tests/array-insert.ts +125 -0
  31. package/examples/tests/bigint.ts +516 -0
  32. package/examples/tests/in.ts +73 -0
  33. package/examples/tests/mutation.ts +124 -0
  34. package/examples/tests/select.ts +88 -0
  35. package/examples/tests/special.ts +110 -0
  36. package/examples/tests/transaction.ts +161 -0
  37. package/examples/tests/where.ts +99 -0
  38. package/examples/types/database.ts +165 -0
  39. package/jest.config.js +10 -0
  40. package/package.json +51 -0
  41. package/src/__tests__/client.test.ts +13 -0
  42. package/src/__tests__/postgres-client.test.ts +36 -0
  43. package/src/__tests__/types.test.ts +12 -0
  44. package/src/client.ts +12 -0
  45. package/src/database.types.ts +25 -0
  46. package/src/errors.ts +45 -0
  47. package/src/index.ts +8 -0
  48. package/src/postgres-client.ts +229 -0
  49. package/src/query-builder.ts +448 -0
  50. package/src/types.ts +113 -0
  51. package/tsconfig.json +21 -0
package/.env.example ADDED
@@ -0,0 +1,14 @@
1
+ # PostgreSQL 연결 설정
2
+ # 방법 1: 개별 매개변수 사용
3
+ DB_USER=testuser
4
+ DB_HOST=localhost
5
+ DB_NAME=testdb
6
+ DB_PASS=testpassword
7
+ DB_PORT=5432
8
+ DB_SSL=false
9
+
10
+ # 방법 2: 연결 문자열(URI) 사용 (위의 개별 매개변수 대신 사용 가능)
11
+ # DB_CONNECTION=postgresql://testuser:testpassword@localhost:5432/testdb
12
+
13
+ # 주의: 이 파일을 .env로 복사하여 사용하세요
14
+ # cp .env.example .env
package/.eslintrc.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "plugins": ["@typescript-eslint"],
4
+ "extends": [
5
+ "eslint:recommended",
6
+ "plugin:@typescript-eslint/recommended"
7
+ ],
8
+ "env": {
9
+ "node": true,
10
+ "es6": true
11
+ },
12
+ "parserOptions": {
13
+ "ecmaVersion": 2020,
14
+ "sourceType": "module"
15
+ },
16
+ "rules": {
17
+ "@typescript-eslint/explicit-function-return-type": "off",
18
+ "@typescript-eslint/no-explicit-any": "warn",
19
+ "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }]
20
+ }
21
+ }
package/.prettierrc ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "es5",
4
+ "singleQuote": true,
5
+ "printWidth": 100,
6
+ "tabWidth": 2
7
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,50 @@
1
+ # Changelog
2
+
3
+ ## [0.1.5] - 2025-02-28
4
+
5
+ ### Security
6
+ - 예제 코드에서 민감한 Supabase 연결 문자열 제거
7
+ - Git 히스토리에서 민감한 정보 제거
8
+
9
+ ## [0.1.4] - 2025-02-28
10
+
11
+ ### Fixed
12
+ - GitHub 저장소에서 직접 설치 시 빌드된 파일이 포함되지 않는 문제 해결
13
+ - .gitignore에서 dist 디렉토리 제외하여 빌드된 파일이 GitHub에 포함되도록 수정
14
+
15
+ ## [0.1.3] - 2025-02-27
16
+
17
+ ### Added
18
+ - PostgreSQL bigint 타입 지원 추가 (JavaScript BigInt 타입으로 변환)
19
+ - bigint 타입 테스트 코드 작성
20
+ - Number 및 string 타입 값의 자동 변환 지원 확인 (bigint 컬럼에 Number나 string 값 전달 시 자동 변환)
21
+
22
+ ## [0.1.2] - 2025-02-27
23
+
24
+ ### Added
25
+ - DB_CONNECTION URI 형식 지원 추가
26
+ - 연결 테스트 메서드 추가
27
+ - 연결 문자열 테스트 코드 작성
28
+
29
+ ## [0.1.1] - 2025-02-25
30
+
31
+ ### Added
32
+ - 멀티 스키마 데이터베이스 지원
33
+ - Supabase 스타일의 타입 시스템 지원
34
+ - Json 타입 정의 추가
35
+ - Views, Functions, Enums, CompositeTypes 지원
36
+
37
+ ### Changed
38
+ - 타입 시스템 개선
39
+ - 스키마 인식 타입 유틸리티 업데이트
40
+ - 기본 스키마를 'public'으로 설정
41
+
42
+ ## [0.1.0] - 2025-02-25
43
+
44
+ ### Added
45
+ - 초기 릴리즈
46
+ - PostgreSQL 클라이언트 구현
47
+ - 기본적인 CRUD 작업 지원
48
+ - 트랜잭션 지원
49
+ - 타입 안전성
50
+ - 테스트 및 예제 코드
@@ -0,0 +1,152 @@
1
+ # 변경 작업 보고서
2
+
3
+ ## [2025-02-28] 예제 코드에서 민감한 정보 제거 및 Git 히스토리 정리
4
+
5
+ ### 작업 내용
6
+
7
+ 1. **문제 분석**:
8
+ - 예제 코드(examples/tests/connection-string.ts)에 실제 Supabase 연결 문자열이 포함되어 있어 보안 위험이 있었습니다.
9
+ - Git 히스토리에도 이 민감한 정보가 남아 있어 완전히 제거할 필요가 있었습니다.
10
+
11
+ 2. **해결 방법**:
12
+ - 예제 코드에서 실제 Supabase 연결 문자열을 테스트용 더미 문자열로 대체했습니다.
13
+ - Git filter-branch를 사용하여 Git 히스토리에서 해당 파일의 이전 버전을 모두 제거했습니다.
14
+ - 현재 버전의 파일을 다시 추가하여 민감한 정보 없이 예제 코드를 유지했습니다.
15
+
16
+ 3. **보안 강화**:
17
+ - 향후 민감한 정보가 코드에 포함되지 않도록 개발 가이드라인을 강화했습니다.
18
+ - 환경 변수나 별도의 구성 파일을 사용하여 민감한 정보를 관리하도록 권장합니다.
19
+
20
+ 4. **문서화**:
21
+ - CHANGELOG.md 파일을 업데이트하여 보안 관련 수정 사항을 문서화했습니다.
22
+ - 버전을 0.1.5로 업데이트했습니다.
23
+
24
+ ### 변경된 파일
25
+
26
+ 1. `examples/tests/connection-string.ts`: 민감한 연결 문자열 제거
27
+ 2. `CHANGELOG.md`: 보안 관련 수정 사항 문서화 및 버전 업데이트
28
+ 3. `CHANGE_REPORT_LOG.md`: 변경 작업 보고서 추가
29
+ 4. `package.json`: 버전 업데이트
30
+
31
+ ### 개발 과정
32
+
33
+ 1. fix/remove-sensitive-info 브랜치 생성
34
+ 2. 민감한 정보가 제거된 파일 커밋
35
+ 3. git filter-branch를 사용하여 Git 히스토리에서 민감한 정보 제거
36
+ 4. 문서화 및 버전 업데이트
37
+ 5. 변경 사항 커밋
38
+ 6. main 브랜치로 병합
39
+
40
+ ### 보안 영향 평가
41
+
42
+ 이번 작업을 통해 다음과 같은 보안 개선이 이루어졌습니다:
43
+
44
+ 1. 민감한 연결 정보가 공개 저장소에 노출되는 위험 제거
45
+ 2. Git 히스토리에서도 민감한 정보가 완전히 제거되어 과거 커밋을 통한 정보 유출 방지
46
+ 3. 예제 코드는 테스트용 더미 데이터를 사용하여 기능 테스트는 여전히 가능
47
+
48
+ ### 결론
49
+
50
+ 이번 작업을 통해 코드베이스에서 민감한 정보를 제거하고 보안을 강화했습니다. 향후에는 민감한 정보를 코드에 직접 포함시키지 않도록 개발 프로세스를 개선할 예정입니다.
51
+
52
+ ## [2025-02-28] GitHub 저장소에서 직접 설치 시 빌드된 파일 포함 문제 해결
53
+
54
+ ### 작업 내용
55
+
56
+ 1. **문제 분석**:
57
+ - GitHub 저장소에서 직접 패키지를 설치할 때(`git+ssh://git@github.com:genideas-labs/supalite.git`) 빌드된 파일이 포함되지 않는 문제를 발견했습니다.
58
+ - 이로 인해 외부 프로젝트에서 0.1.3 버전을 설치했을 때 connectionString, testConnection 등의 기능이 보이지 않는 문제가 발생했습니다.
59
+ - 원인은 `.gitignore` 파일에 `dist` 디렉토리가 포함되어 있어 빌드된 파일들이 GitHub 저장소에 포함되지 않기 때문이었습니다.
60
+
61
+ 2. **해결 방법**:
62
+ - `.gitignore` 파일에서 `dist` 디렉토리를 제외하여 빌드된 파일들이 GitHub 저장소에 포함되도록 수정했습니다.
63
+ - 이를 통해 GitHub에서 직접 패키지를 설치할 때도 빌드된 파일들이 포함되도록 했습니다.
64
+
65
+ 3. **문서화**:
66
+ - CHANGELOG.md 파일을 업데이트하여 변경 사항을 문서화했습니다.
67
+ - 버전을 0.1.4로 업데이트했습니다.
68
+
69
+ ### 변경된 파일
70
+
71
+ 1. `.gitignore`: `dist` 디렉토리를 제외하도록 수정
72
+ 2. `CHANGELOG.md`: 변경 사항 문서화 및 버전 업데이트
73
+ 3. `CHANGE_REPORT_LOG.md`: 변경 작업 보고서 추가
74
+ 4. `package.json`: 버전 업데이트
75
+
76
+ ### 개발 과정
77
+
78
+ 1. fix/include-dist-in-git 브랜치 생성
79
+ 2. `.gitignore` 파일에서 `dist` 디렉토리를 제외하도록 수정
80
+ 3. 문서화 및 버전 업데이트
81
+ 4. 변경 사항 커밋
82
+ 5. main 브랜치로 병합
83
+
84
+ ### 테스트 결과
85
+
86
+ GitHub 저장소에서 직접 패키지를 설치하는 테스트를 수행했습니다:
87
+
88
+ 1. 외부 프로젝트에서 `package.json`에 `"supalite": "git+ssh://git@github.com:genideas-labs/supalite.git"`를 추가하고 `npm install`을 실행했습니다.
89
+ 2. 설치된 패키지에 빌드된 파일들이 포함되어 있는지 확인했습니다.
90
+ 3. connectionString, testConnection 등의 기능이 정상적으로 사용 가능한지 확인했습니다.
91
+
92
+ 모든 테스트가 성공적으로 완료되었습니다.
93
+
94
+ ### 결론
95
+
96
+ 이번 작업을 통해 GitHub 저장소에서 직접 패키지를 설치할 때 빌드된 파일이 포함되지 않는 문제를 해결했습니다. 이제 외부 프로젝트에서 GitHub 저장소를 통해 패키지를 설치해도 모든 기능을 정상적으로 사용할 수 있습니다.
97
+
98
+ ## [2025-02-27] PostgreSQL bigint 타입 지원 추가
99
+
100
+ ### 작업 내용
101
+
102
+ 1. **bigint 타입 지원 추가**:
103
+ - pg 타입 파서를 등록하여 PostgreSQL의 bigint 타입을 JavaScript의 BigInt로 변환하도록 구현했습니다.
104
+ - Json 타입 정의에 bigint 타입을 추가하여 타입 안전성을 개선했습니다.
105
+
106
+ 2. **자동 변환 지원 확인**:
107
+ - 테스트 결과, 현재 구현에서도 Number와 string 타입의 값을 bigint 컬럼에 전달할 때 자동으로 변환이 이루어지고 있음을 확인했습니다.
108
+ - PostgreSQL 드라이버(pg)는 JavaScript의 Number나 string 값을 PostgreSQL의 bigint 타입으로 자동 변환합니다.
109
+
110
+ 3. **타입 정의 개선**:
111
+ - bigint 컬럼에 대한 타입 정의를 `bigint | number | string`으로 업데이트하여 타입 캐스팅 없이도 Number와 string 값을 전달할 수 있도록 개선했습니다.
112
+ - 이를 통해 타입 안전성을 유지하면서도 사용자 편의성을 높였습니다.
113
+
114
+ 4. **테스트 코드 작성**:
115
+ - BigInt, Number, string 타입의 값을 사용하여 bigint 컬럼에 데이터를 삽입하고 업데이트하는 테스트 코드를 작성했습니다.
116
+ - 모든 테스트가 성공적으로 완료되었습니다.
117
+
118
+ 5. **문서화**:
119
+ - CHANGELOG.md 파일을 업데이트하여 bigint 지원 기능을 문서화했습니다.
120
+ - 버전을 0.1.3으로 업데이트했습니다.
121
+
122
+ ### 변경된 파일
123
+
124
+ 1. `src/postgres-client.ts`: bigint 타입 파서 등록 코드 추가
125
+ 2. `src/types.ts`: Json 타입 정의에 bigint 타입 추가
126
+ 3. `examples/types/database.ts`: bigint 컬럼 타입 정의 개선
127
+ 4. `examples/tests/bigint.ts`: bigint 타입 테스트 코드 작성
128
+ 5. `CHANGELOG.md`: 변경 사항 문서화
129
+ 6. `package.json`: 버전 업데이트
130
+
131
+ ### 개발 과정
132
+
133
+ 1. feature/support-bigint 브랜치 생성
134
+ 2. bigint 타입 파서 등록 및 타입 정의 수정
135
+ 3. 테스트 코드 작성 및 실행
136
+ 4. 테스트 결과 분석 및 타입 정의 개선
137
+ 5. 문서화 및 버전 업데이트
138
+ 6. main 브랜치로 병합
139
+
140
+ ### 테스트 결과
141
+
142
+ 모든 테스트가 성공적으로 완료되었습니다. 특히 다음 사항을 확인했습니다:
143
+
144
+ 1. PostgreSQL의 bigint 값이 JavaScript의 BigInt로 정확히 변환됩니다.
145
+ 2. JavaScript의 BigInt 값이 PostgreSQL의 bigint로 정확히 저장됩니다.
146
+ 3. JavaScript의 Number 값이 PostgreSQL의 bigint로 자동 변환됩니다.
147
+ 4. JavaScript의 string 값이 PostgreSQL의 bigint로 자동 변환됩니다.
148
+ 5. 큰 정수 값(Number.MAX_SAFE_INTEGER 초과)도 정확히 처리됩니다.
149
+
150
+ ### 결론
151
+
152
+ 이번 작업을 통해 Supalite 라이브러리에서 PostgreSQL의 bigint 타입을 완벽하게 지원할 수 있게 되었습니다. 사용자는 BigInt, Number, string 타입의 값을 자유롭게 사용할 수 있으며, 타입 안전성도 유지됩니다.
package/README.md ADDED
@@ -0,0 +1,337 @@
1
+ # SupaLite
2
+
3
+ [![npm version](https://img.shields.io/badge/version-0.1.1-blue.svg)](https://www.npmjs.com/package/supalite)
4
+
5
+ 가볍고 효율적인 PostgreSQL 클라이언트 라이브러리입니다. Supabase와 동일한 API를 제공하면서도 더 가볍고 빠른 구현을 제공합니다.
6
+
7
+ ## 주요 기능
8
+
9
+ - 🔒 타입 안전성: TypeScript로 작성되어 완벽한 타입 지원
10
+ - 🚀 강력한 쿼리 빌더: Supabase 스타일의 직관적이고 체이닝 가능한 API
11
+ - 🌍 멀티 스키마: 여러 데이터베이스 스키마 지원
12
+ - 🛠 CRUD 작업: 간단하고 명확한 데이터베이스 작업
13
+ - 📦 RPC 지원: 저장 프로시저 호출 기능
14
+ - ⚡ 성능 최적화: 커넥션 풀링 및 효율적인 쿼리 실행
15
+ - 💪 트랜잭션 지원: Supabase에서 지원하지 않는 안전한 데이터베이스 트랜잭션 처리
16
+ - 🎯 UPSERT 지원: 삽입/업데이트 동작 제어
17
+ - 🔍 고급 필터링: OR 조건, ILIKE 검색 등 지원
18
+ - 📚 배열 작업: 다중 레코드 삽입 및 배열 데이터 처리
19
+ - 🔄 Views, Functions, Enums 지원: Supabase 스타일의 완벽한 타입 지원
20
+
21
+ ## 설치 방법
22
+
23
+ ```bash
24
+ npm install supalite
25
+ ```
26
+
27
+ ## 타입 시스템
28
+
29
+ ### 데이터베이스 스키마 정의
30
+
31
+ ```typescript
32
+ // Supabase CLI의 타입 생성기로 생성된 데이터베이스 타입 정의
33
+ // 예: supabase gen types typescript --local > database.types.ts
34
+ import { Database } from './types/database';
35
+
36
+ // 타입이 적용된 클라이언트 생성
37
+ const client = new SupaLitePG<Database>({
38
+ user: 'testuser',
39
+ password: 'testpassword',
40
+ host: 'localhost',
41
+ database: 'testdb',
42
+ port: 5432,
43
+ ssl: false
44
+ });
45
+
46
+ // 또는 환경 변수 사용
47
+ const client = new SupaLitePG<Database>();
48
+
49
+ // Database 인터페이스 예시 (Supabase CLI로 생성된 타입과 동일한 구조)
50
+ interface Database {
51
+ public: {
52
+ Tables: {
53
+ users: {
54
+ Row: {
55
+ id: number;
56
+ name: string;
57
+ email: string;
58
+ status: string;
59
+ last_login: string | null;
60
+ created_at: string;
61
+ };
62
+ Insert: {
63
+ name: string;
64
+ email: string;
65
+ status?: string;
66
+ last_login?: string | null;
67
+ };
68
+ Update: {
69
+ name?: string;
70
+ email?: string;
71
+ status?: string;
72
+ last_login?: string | null;
73
+ };
74
+ Relationships: unknown[];
75
+ };
76
+ // 다른 테이블들...
77
+ };
78
+ Views: {
79
+ // 뷰 정의...
80
+ };
81
+ Functions: {
82
+ // 함수 정의...
83
+ };
84
+ Enums: {
85
+ // 열거형 정의...
86
+ };
87
+ };
88
+ // 다른 스키마들...
89
+ }
90
+ ```
91
+
92
+ ## 사용 예시
93
+
94
+ ### 데이터베이스 연결
95
+
96
+ ```typescript
97
+ import { SupaLitePG } from 'supalite';
98
+ import { Database } from './types/database';
99
+
100
+ // 타입이 적용된 클라이언트 생성
101
+ const client = new SupaLitePG<Database>({
102
+ user: 'testuser',
103
+ password: 'testpassword',
104
+ host: 'localhost',
105
+ database: 'testdb',
106
+ port: 5432,
107
+ ssl: false
108
+ });
109
+ ```
110
+
111
+ ### 기본 CRUD 작업
112
+
113
+ ```typescript
114
+ // 데이터 조회
115
+ const { data, error } = await client
116
+ .from('users')
117
+ .select('*')
118
+ .eq('id', 1)
119
+ .single();
120
+
121
+ // 단일 레코드 삽입
122
+ const { data, error } = await client
123
+ .from('users')
124
+ .insert({
125
+ name: '홍길동',
126
+ email: 'hong@example.com'
127
+ });
128
+
129
+ // 다중 레코드 삽입
130
+ const { data, error } = await client
131
+ .from('users')
132
+ .insert([
133
+ { name: '홍길동', email: 'hong@example.com' },
134
+ { name: '김철수', email: 'kim@example.com' }
135
+ ]);
136
+
137
+ // 특정 컬럼 선택
138
+ const { data } = await client
139
+ .from('profiles')
140
+ .select('user_id, bio, interests')
141
+ .limit(2);
142
+
143
+ // 다중 정렬
144
+ const { data } = await client
145
+ .from('users')
146
+ .select('name, status, last_login')
147
+ .order('status', { ascending: true })
148
+ .order('last_login', { ascending: false });
149
+
150
+ // 페이지네이션
151
+ const page1 = await client
152
+ .from('posts')
153
+ .select('*')
154
+ .limit(2)
155
+ .offset(0);
156
+
157
+ // Range 쿼리
158
+ const { data } = await client
159
+ .from('comments')
160
+ .select('*')
161
+ .range(1, 3);
162
+
163
+ // 조건부 UPDATE
164
+ const { data } = await client
165
+ .from('posts')
166
+ .update({
167
+ views: 10,
168
+ updated_at: new Date().toISOString()
169
+ })
170
+ .eq('user_id', userId)
171
+ .select();
172
+
173
+ // UPSERT
174
+ const { data } = await client
175
+ .from('profiles')
176
+ .upsert({
177
+ user_id: userId,
178
+ bio: '새로운 프로필입니다.',
179
+ interests: ['코딩', '음악'],
180
+ updated_at: new Date().toISOString()
181
+ }, { onConflict: 'id' })
182
+ .select()
183
+ .single();
184
+ ```
185
+
186
+ ### 고급 기능 사용 예시
187
+
188
+ ```typescript
189
+ // 트랜잭션 사용 (Supabase에서 지원하지 않는 기능)
190
+ await client.transaction(async (tx) => {
191
+ const { data: user } = await tx
192
+ .from('users')
193
+ .insert({ name: '홍길동' })
194
+ .select()
195
+ .single();
196
+
197
+ await tx
198
+ .from('profiles')
199
+ .insert({ user_id: user.id });
200
+ });
201
+
202
+ // OR 조건 필터링
203
+ const { data, error } = await client
204
+ .from('users')
205
+ .or('status.eq.active,role.eq.admin');
206
+
207
+ // 대소문자 구분 없는 검색
208
+ const { data, error } = await client
209
+ .from('users')
210
+ .ilike('email', '%@example.com');
211
+
212
+ // 정확한 카운트와 함께 조회
213
+ const { data, count, error } = await client
214
+ .from('users')
215
+ .select('*', { count: 'exact' });
216
+
217
+ // 배열 데이터 처리
218
+ const { data, error } = await client
219
+ .from('posts')
220
+ .insert([
221
+ {
222
+ title: '첫 번째 글',
223
+ tags: ['프로그래밍', '팁'],
224
+ content: '내용...'
225
+ },
226
+ {
227
+ title: '두 번째 글',
228
+ tags: ['여행'],
229
+ content: '내용...'
230
+ }
231
+ ]);
232
+
233
+ // 다른 스키마 사용
234
+ const { data, error } = await client
235
+ .from('users', 'other_schema')
236
+ .select('*');
237
+ ```
238
+
239
+ ## API 문서
240
+
241
+ ### 쿼리 메소드
242
+
243
+ - `select(columns?: string, options?: { count?: 'exact' | 'planned' | 'estimated', head?: boolean })`: 조회할 컬럼 지정
244
+ - `insert(data: T['Tables'][K]['Insert'] | T['Tables'][K]['Insert'][])`: 단일 또는 다중 레코드 삽입
245
+ - `update(data: T['Tables'][K]['Update'])`: 레코드 업데이트
246
+ - `delete()`: 레코드 삭제
247
+ - `upsert(data: T['Tables'][K]['Insert'], options?: { onConflict: string })`: 삽입 또는 업데이트
248
+
249
+ ### 필터 메소드
250
+
251
+ - `eq(column, value)`: 같음
252
+ - `neq(column, value)`: 같지 않음
253
+ - `gt(column, value)`: 보다 큼
254
+ - `gte(column, value)`: 크거나 같음
255
+ - `lt(column, value)`: 보다 작음
256
+ - `lte(column, value)`: 작거나 같음
257
+ - `like(column, pattern)`: LIKE 패턴 매칭
258
+ - `ilike(column, pattern)`: 대소문자 구분 없는 LIKE
259
+ - `in(column, values)`: IN 연산자
260
+ - `is(column, value)`: IS 연산자
261
+ - `contains(column, value)`: 배열/JSON 포함 여부
262
+ - `or(conditions)`: OR 조건 (예: 'status.eq.active,role.eq.admin')
263
+
264
+ ### 기타 메소드
265
+
266
+ - `order(column, { ascending: boolean })`: 정렬
267
+ - `limit(count: number)`: 결과 개수 제한
268
+ - `offset(count: number)`: 결과 시작 위치
269
+ - `range(from: number, to: number)`: 범위 지정
270
+ - `single()`: 단일 결과 반환
271
+ - `returns<T>()`: 반환 타입 지정
272
+
273
+ ### 트랜잭션 메소드
274
+
275
+ - `transaction<T>(callback: (client: SupaLitePG) => Promise<T>)`: 트랜잭션 실행
276
+ - `begin()`: 트랜잭션 시작
277
+ - `commit()`: 트랜잭션 커밋
278
+ - `rollback()`: 트랜잭션 롤백
279
+
280
+ ## 환경 변수 설정
281
+
282
+ 데이터베이스 연결을 위해 다음 환경 변수를 설정할 수 있습니다:
283
+
284
+ ```env
285
+ DB_USER=your_db_user
286
+ DB_HOST=your_db_host
287
+ DB_NAME=your_db_name
288
+ DB_PASS=your_db_password
289
+ DB_PORT=5432
290
+ DB_SSL=true
291
+ ```
292
+
293
+ ## 응답 형식
294
+
295
+ 모든 쿼리 메소드는 다음과 같은 형식의 응답을 반환합니다:
296
+
297
+ ```typescript
298
+ interface QueryResponse<T> {
299
+ data: T | null; // 쿼리 결과 데이터
300
+ error: Error | null; // 에러 정보
301
+ count?: number; // 결과 레코드 수
302
+ status: number; // HTTP 상태 코드
303
+ statusText: string; // 상태 메시지
304
+ }
305
+ ```
306
+
307
+ ## 개발 환경 설정
308
+
309
+ ### PostgreSQL 설치
310
+ PostgreSQL을 로컬에 설치하고 테스트하는 방법은 [examples/README.md](examples/README.md)를 참조하세요.
311
+
312
+ ### 프로젝트 설정
313
+
314
+ ```bash
315
+ # 저장소 클론
316
+ git clone https://github.com/your-username/supalite.git
317
+
318
+ # 의존성 설치
319
+ npm install
320
+
321
+ # 개발 서버 실행
322
+ npm run dev
323
+
324
+ # 테스트 실행
325
+ npm test
326
+
327
+ # 빌드
328
+ npm run build
329
+ ```
330
+
331
+ ## 라이선스
332
+
333
+ MIT 라이선스로 배포됩니다. 자세한 내용은 [LICENSE](LICENSE) 파일을 참조하세요.
334
+
335
+ ## 저작권
336
+
337
+ Copyright © 2025 Genideas Inc. and Wondong Shin (wodshin@gmail.com)
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_1 = require("../client");
4
+ describe('SupaliteClient', () => {
5
+ test('SupaliteClient 클래스가 정의되어 있어야 함', () => {
6
+ expect(client_1.SupaliteClient).toBeDefined();
7
+ });
8
+ test('SupaliteClient 인스턴스를 생성할 수 있어야 함', () => {
9
+ // 실제 DB 연결 없이 클래스 인스턴스만 확인
10
+ const client = {};
11
+ expect(client).not.toBeNull();
12
+ });
13
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const postgres_client_1 = require("../postgres-client");
4
+ // pg 모듈 모킹
5
+ jest.mock('pg', () => {
6
+ const mockPool = {
7
+ connect: jest.fn().mockResolvedValue({
8
+ release: jest.fn()
9
+ }),
10
+ query: jest.fn(),
11
+ end: jest.fn(),
12
+ on: jest.fn()
13
+ };
14
+ return {
15
+ Pool: jest.fn(() => mockPool),
16
+ types: {
17
+ setTypeParser: jest.fn()
18
+ }
19
+ };
20
+ });
21
+ // dotenv 모듈 모킹
22
+ jest.mock('dotenv', () => ({
23
+ config: jest.fn()
24
+ }));
25
+ describe('SupaLitePG', () => {
26
+ test('SupaLitePG 클래스가 정의되어 있어야 함', () => {
27
+ expect(postgres_client_1.SupaLitePG).toBeDefined();
28
+ });
29
+ test('testConnection 메서드가 성공적으로 동작해야 함', async () => {
30
+ const client = new postgres_client_1.SupaLitePG();
31
+ const result = await client.testConnection();
32
+ expect(result).toBe(true);
33
+ });
34
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ describe('Types', () => {
4
+ test('SupaliteConfig 타입이 정의되어 있어야 함', () => {
5
+ // 타입이 존재하는지 확인하는 간단한 테스트
6
+ const config = {
7
+ connectionString: 'postgresql://user:pass@localhost:5432/db'
8
+ };
9
+ expect(config).toBeDefined();
10
+ expect(config.connectionString).toBe('postgresql://user:pass@localhost:5432/db');
11
+ });
12
+ });
@@ -0,0 +1,8 @@
1
+ import { SupaliteConfig, DatabaseSchema } from './types';
2
+ import { SupaLitePG } from './postgres-client';
3
+ export declare class SupaliteClient<T extends DatabaseSchema> extends SupaLitePG<T> {
4
+ constructor(config?: SupaliteConfig);
5
+ }
6
+ export { SupaLitePG } from './postgres-client';
7
+ export * from './types';
8
+ export * from './errors';