reltype 0.1.1

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 (136) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +952 -0
  4. package/dist/configs/env.d.ts +14 -0
  5. package/dist/configs/env.d.ts.map +1 -0
  6. package/dist/configs/env.js +46 -0
  7. package/dist/configs/index.d.ts +2 -0
  8. package/dist/configs/index.d.ts.map +1 -0
  9. package/dist/configs/index.js +17 -0
  10. package/dist/features/connection/index.d.ts +3 -0
  11. package/dist/features/connection/index.d.ts.map +1 -0
  12. package/dist/features/connection/index.js +18 -0
  13. package/dist/features/connection/pool.d.ts +42 -0
  14. package/dist/features/connection/pool.d.ts.map +1 -0
  15. package/dist/features/connection/pool.js +131 -0
  16. package/dist/features/connection/tx.d.ts +10 -0
  17. package/dist/features/connection/tx.d.ts.map +1 -0
  18. package/dist/features/connection/tx.js +37 -0
  19. package/dist/features/query/builder.d.ts +253 -0
  20. package/dist/features/query/builder.d.ts.map +1 -0
  21. package/dist/features/query/builder.js +613 -0
  22. package/dist/features/query/bulkInsert.d.ts +10 -0
  23. package/dist/features/query/bulkInsert.d.ts.map +1 -0
  24. package/dist/features/query/bulkInsert.js +30 -0
  25. package/dist/features/query/delete.d.ts +8 -0
  26. package/dist/features/query/delete.d.ts.map +1 -0
  27. package/dist/features/query/delete.js +15 -0
  28. package/dist/features/query/index.d.ts +10 -0
  29. package/dist/features/query/index.d.ts.map +1 -0
  30. package/dist/features/query/index.js +25 -0
  31. package/dist/features/query/insert.d.ts +7 -0
  32. package/dist/features/query/insert.d.ts.map +1 -0
  33. package/dist/features/query/insert.js +18 -0
  34. package/dist/features/query/interfaces/Advanced.d.ts +177 -0
  35. package/dist/features/query/interfaces/Advanced.d.ts.map +1 -0
  36. package/dist/features/query/interfaces/Advanced.js +2 -0
  37. package/dist/features/query/interfaces/Order.d.ts +6 -0
  38. package/dist/features/query/interfaces/Order.d.ts.map +1 -0
  39. package/dist/features/query/interfaces/Order.js +2 -0
  40. package/dist/features/query/interfaces/Query.d.ts +6 -0
  41. package/dist/features/query/interfaces/Query.d.ts.map +1 -0
  42. package/dist/features/query/interfaces/Query.js +2 -0
  43. package/dist/features/query/interfaces/Where.d.ts +3 -0
  44. package/dist/features/query/interfaces/Where.d.ts.map +1 -0
  45. package/dist/features/query/interfaces/Where.js +2 -0
  46. package/dist/features/query/interfaces/index.d.ts +5 -0
  47. package/dist/features/query/interfaces/index.d.ts.map +1 -0
  48. package/dist/features/query/interfaces/index.js +20 -0
  49. package/dist/features/query/select.d.ts +15 -0
  50. package/dist/features/query/select.d.ts.map +1 -0
  51. package/dist/features/query/select.js +33 -0
  52. package/dist/features/query/update.d.ts +8 -0
  53. package/dist/features/query/update.d.ts.map +1 -0
  54. package/dist/features/query/update.js +28 -0
  55. package/dist/features/query/upsert.d.ts +11 -0
  56. package/dist/features/query/upsert.d.ts.map +1 -0
  57. package/dist/features/query/upsert.js +31 -0
  58. package/dist/features/query/where.d.ts +11 -0
  59. package/dist/features/query/where.d.ts.map +1 -0
  60. package/dist/features/query/where.js +30 -0
  61. package/dist/features/repository/base.d.ts +107 -0
  62. package/dist/features/repository/base.d.ts.map +1 -0
  63. package/dist/features/repository/base.js +243 -0
  64. package/dist/features/repository/create.d.ts +13 -0
  65. package/dist/features/repository/create.d.ts.map +1 -0
  66. package/dist/features/repository/create.js +16 -0
  67. package/dist/features/repository/index.d.ts +4 -0
  68. package/dist/features/repository/index.d.ts.map +1 -0
  69. package/dist/features/repository/index.js +19 -0
  70. package/dist/features/repository/interfaces/Find.d.ts +9 -0
  71. package/dist/features/repository/interfaces/Find.d.ts.map +1 -0
  72. package/dist/features/repository/interfaces/Find.js +2 -0
  73. package/dist/features/repository/interfaces/Repo.d.ts +29 -0
  74. package/dist/features/repository/interfaces/Repo.d.ts.map +1 -0
  75. package/dist/features/repository/interfaces/Repo.js +2 -0
  76. package/dist/features/repository/interfaces/index.d.ts +3 -0
  77. package/dist/features/repository/interfaces/index.d.ts.map +1 -0
  78. package/dist/features/repository/interfaces/index.js +18 -0
  79. package/dist/features/schema/column.d.ts +62 -0
  80. package/dist/features/schema/column.d.ts.map +1 -0
  81. package/dist/features/schema/column.js +74 -0
  82. package/dist/features/schema/index.d.ts +4 -0
  83. package/dist/features/schema/index.d.ts.map +1 -0
  84. package/dist/features/schema/index.js +19 -0
  85. package/dist/features/schema/interfaces/Column.d.ts +19 -0
  86. package/dist/features/schema/interfaces/Column.d.ts.map +1 -0
  87. package/dist/features/schema/interfaces/Column.js +2 -0
  88. package/dist/features/schema/interfaces/Infer.d.ts +20 -0
  89. package/dist/features/schema/interfaces/Infer.d.ts.map +1 -0
  90. package/dist/features/schema/interfaces/Infer.js +2 -0
  91. package/dist/features/schema/interfaces/Table.d.ts +7 -0
  92. package/dist/features/schema/interfaces/Table.d.ts.map +1 -0
  93. package/dist/features/schema/interfaces/Table.js +2 -0
  94. package/dist/features/schema/interfaces/index.d.ts +4 -0
  95. package/dist/features/schema/interfaces/index.d.ts.map +1 -0
  96. package/dist/features/schema/interfaces/index.js +19 -0
  97. package/dist/features/schema/table.d.ts +14 -0
  98. package/dist/features/schema/table.d.ts.map +1 -0
  99. package/dist/features/schema/table.js +17 -0
  100. package/dist/features/transform/case.d.ts +19 -0
  101. package/dist/features/transform/case.d.ts.map +1 -0
  102. package/dist/features/transform/case.js +32 -0
  103. package/dist/features/transform/index.d.ts +3 -0
  104. package/dist/features/transform/index.d.ts.map +1 -0
  105. package/dist/features/transform/index.js +18 -0
  106. package/dist/features/transform/mapper.d.ts +9 -0
  107. package/dist/features/transform/mapper.d.ts.map +1 -0
  108. package/dist/features/transform/mapper.js +17 -0
  109. package/dist/index.d.ts +35 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +63 -0
  112. package/dist/interfaces/DatabaseConfig.d.ts +25 -0
  113. package/dist/interfaces/DatabaseConfig.d.ts.map +1 -0
  114. package/dist/interfaces/DatabaseConfig.js +2 -0
  115. package/dist/interfaces/EnvSource.d.ts +4 -0
  116. package/dist/interfaces/EnvSource.d.ts.map +1 -0
  117. package/dist/interfaces/EnvSource.js +2 -0
  118. package/dist/interfaces/PostgresDriverOptions.d.ts +20 -0
  119. package/dist/interfaces/PostgresDriverOptions.d.ts.map +1 -0
  120. package/dist/interfaces/PostgresDriverOptions.js +2 -0
  121. package/dist/interfaces/index.d.ts +3 -0
  122. package/dist/interfaces/index.d.ts.map +1 -0
  123. package/dist/interfaces/index.js +18 -0
  124. package/dist/utils/dbError.d.ts +61 -0
  125. package/dist/utils/dbError.d.ts.map +1 -0
  126. package/dist/utils/dbError.js +122 -0
  127. package/dist/utils/index.d.ts +4 -0
  128. package/dist/utils/index.d.ts.map +1 -0
  129. package/dist/utils/index.js +19 -0
  130. package/dist/utils/logger.d.ts +63 -0
  131. package/dist/utils/logger.d.ts.map +1 -0
  132. package/dist/utils/logger.js +138 -0
  133. package/dist/utils/reader.d.ts +49 -0
  134. package/dist/utils/reader.d.ts.map +1 -0
  135. package/dist/utils/reader.js +159 -0
  136. package/package.json +73 -0
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseRepo = void 0;
4
+ const select_1 = require("../query/select");
5
+ const insert_1 = require("../query/insert");
6
+ const update_1 = require("../query/update");
7
+ const delete_1 = require("../query/delete");
8
+ const upsert_1 = require("../query/upsert");
9
+ const bulkInsert_1 = require("../query/bulkInsert");
10
+ const builder_1 = require("../query/builder");
11
+ const mapper_1 = require("../transform/mapper");
12
+ const case_1 = require("../transform/case");
13
+ const pool_1 = require("../connection/pool");
14
+ const logger_1 = require("../../utils/logger");
15
+ const dbError_1 = require("../../utils/dbError");
16
+ const logger = logger_1.Logger.fromEnv(process.env, { prefix: '[Repo]' });
17
+ /** 런타임에서 primary key의 camelCase 키를 찾습니다. */
18
+ function findPkKey(cols) {
19
+ const entry = Object.entries(cols).find(([, c]) => c.isPrimary);
20
+ return entry ? entry[0] : 'id';
21
+ }
22
+ /**
23
+ * 기본 CRUD 레포지토리.
24
+ *
25
+ * - 모든 DB 에러는 `DbError`로 변환됩니다.
26
+ * - 사용자에게 노출할 메시지는 `DbError.toUserPayload()`를 사용하세요.
27
+ * - 트랜잭션 내에서 사용하려면 `exec(built, client)` 형태로 client를 전달하세요.
28
+ */
29
+ class BaseRepo {
30
+ constructor(def) {
31
+ this.def = def;
32
+ this.tableName = def.name;
33
+ this.pkKey = findPkKey(def.cols);
34
+ this.pkCol = (0, case_1.toSnake)(this.pkKey);
35
+ }
36
+ /**
37
+ * 이 레포지토리의 모든 `select()` 빌더에 적용될 글로벌 훅을 등록합니다.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * userRepo.useHooks({
42
+ * beforeExec: ({ sql }) => logger.debug('SQL:', sql),
43
+ * afterExec: ({ elapsed }) => metrics.record('db.query', elapsed),
44
+ * });
45
+ * ```
46
+ */
47
+ useHooks(h) {
48
+ this._globalHooks = h;
49
+ return this;
50
+ }
51
+ /**
52
+ * SQL을 실행하고 camelCase 변환된 rows를 반환합니다.
53
+ *
54
+ * - 에러 발생 시 `DbError`로 변환 후 로깅하고 re-throw합니다.
55
+ * - `client`를 넘기면 해당 client를 재사용합니다 (트랜잭션 지원).
56
+ */
57
+ async exec(built, client) {
58
+ const run = async (c) => {
59
+ const start = Date.now();
60
+ logger.debug(`SQL: ${built.sql}`, built.params);
61
+ try {
62
+ const result = await c.query(built.sql, built.params);
63
+ logger.debug(`완료 (${Date.now() - start}ms) rowCount=${result.rowCount ?? 0}`);
64
+ return (0, mapper_1.mapRows)(result.rows);
65
+ }
66
+ catch (err) {
67
+ const dbErr = dbError_1.DbError.from(err);
68
+ logger.error(`쿼리 실패 [${this.tableName}]`, {
69
+ ...dbErr.toLogContext(),
70
+ sql: built.sql,
71
+ elapsed: `${Date.now() - start}ms`,
72
+ });
73
+ throw dbErr;
74
+ }
75
+ };
76
+ if (client)
77
+ return run(client);
78
+ return (0, pool_1.withClient)(run);
79
+ }
80
+ async findAll(opts = {}) {
81
+ try {
82
+ return await this.exec((0, select_1.buildSelect)(this.tableName, opts));
83
+ }
84
+ catch (err) {
85
+ throw dbError_1.DbError.from(err);
86
+ }
87
+ }
88
+ async findById(id) {
89
+ try {
90
+ const rows = await this.exec((0, select_1.buildSelect)(this.tableName, {
91
+ where: { [this.pkKey]: id },
92
+ limit: 1,
93
+ }));
94
+ return rows[0] ?? null;
95
+ }
96
+ catch (err) {
97
+ throw dbError_1.DbError.from(err);
98
+ }
99
+ }
100
+ async findOne(where) {
101
+ try {
102
+ const rows = await this.exec((0, select_1.buildSelect)(this.tableName, { where, limit: 1 }));
103
+ return rows[0] ?? null;
104
+ }
105
+ catch (err) {
106
+ throw dbError_1.DbError.from(err);
107
+ }
108
+ }
109
+ async create(data) {
110
+ try {
111
+ const rows = await this.exec((0, insert_1.buildInsert)(this.tableName, data));
112
+ return rows[0];
113
+ }
114
+ catch (err) {
115
+ throw dbError_1.DbError.from(err);
116
+ }
117
+ }
118
+ async update(id, data) {
119
+ try {
120
+ const where = { [this.pkKey]: id };
121
+ const rows = await this.exec((0, update_1.buildUpdate)(this.tableName, data, where));
122
+ return rows[0] ?? null;
123
+ }
124
+ catch (err) {
125
+ throw dbError_1.DbError.from(err);
126
+ }
127
+ }
128
+ async delete(id) {
129
+ try {
130
+ const where = { [this.pkKey]: id };
131
+ const built = (0, delete_1.buildDelete)(this.tableName, where);
132
+ return await (0, pool_1.withClient)(async (client) => {
133
+ const start = Date.now();
134
+ logger.debug(`SQL: ${built.sql}`, built.params);
135
+ try {
136
+ const result = await client.query(built.sql, built.params);
137
+ logger.debug(`완료 (${Date.now() - start}ms)`);
138
+ return (result.rowCount ?? 0) > 0;
139
+ }
140
+ catch (err) {
141
+ const dbErr = dbError_1.DbError.from(err);
142
+ logger.error(`삭제 실패 [${this.tableName}]`, {
143
+ ...dbErr.toLogContext(),
144
+ elapsed: `${Date.now() - start}ms`,
145
+ });
146
+ throw dbErr;
147
+ }
148
+ });
149
+ }
150
+ catch (err) {
151
+ throw dbError_1.DbError.from(err);
152
+ }
153
+ }
154
+ /**
155
+ * 데이터를 삽입하거나, 충돌 시 UPDATE합니다.
156
+ * @param conflictCol - 충돌 기준 컬럼 (snake_case, 기본값: primary key)
157
+ */
158
+ async upsert(data, conflictCol) {
159
+ try {
160
+ const rows = await this.exec((0, upsert_1.buildUpsert)(this.tableName, data, conflictCol ?? this.pkCol));
161
+ return rows[0];
162
+ }
163
+ catch (err) {
164
+ throw dbError_1.DbError.from(err);
165
+ }
166
+ }
167
+ /**
168
+ * 여러 row를 단일 INSERT 쿼리로 삽입합니다.
169
+ */
170
+ async bulkCreate(rows) {
171
+ try {
172
+ return await this.exec((0, bulkInsert_1.buildBulkInsert)(this.tableName, rows));
173
+ }
174
+ catch (err) {
175
+ throw dbError_1.DbError.from(err);
176
+ }
177
+ }
178
+ // ── Fluent QueryBuilder ────────────────────────────────────────────────────
179
+ /**
180
+ * 유연한 플루언트 쿼리 빌더를 반환합니다.
181
+ *
182
+ * WHERE, OR, ORDER BY, GROUP BY, JOIN, LIMIT, OFFSET, paginate, calculate 등을
183
+ * 메서드 체인으로 조합할 수 있습니다.
184
+ *
185
+ * @example
186
+ * ```ts
187
+ * // 기본 조회 (await 직접 사용 가능)
188
+ * const users = await repo.select({ isActive: true })
189
+ * .orderBy([{ column: 'createdAt', direction: 'DESC' }])
190
+ * .limit(20);
191
+ *
192
+ * // OR 조건
193
+ * const results = await repo.select()
194
+ * .or({ email: { operator: 'LIKE', value: '%@gmail.com' } });
195
+ *
196
+ * // 페이지네이션
197
+ * const page = await repo.select()
198
+ * .paginate({ page: 1, pageSize: 20 });
199
+ *
200
+ * // 집계
201
+ * const agg = await repo.select({ isActive: true })
202
+ * .calculate([{ fn: 'COUNT', alias: 'count' }]);
203
+ * ```
204
+ */
205
+ select(where) {
206
+ const qb = new builder_1.QueryBuilder(this.tableName, where);
207
+ if (this._globalHooks)
208
+ qb.hooks(this._globalHooks);
209
+ return qb;
210
+ }
211
+ /**
212
+ * 단건 조회 (없으면 null). `select(where).one()` 의 단축형입니다.
213
+ *
214
+ * @example
215
+ * ```ts
216
+ * const user = await repo.selectOne({ id: 1 });
217
+ * ```
218
+ */
219
+ async selectOne(where) {
220
+ try {
221
+ return await new builder_1.QueryBuilder(this.tableName, where).one();
222
+ }
223
+ catch (err) {
224
+ throw dbError_1.DbError.from(err);
225
+ }
226
+ }
227
+ /**
228
+ * Raw SQL을 직접 실행합니다.
229
+ * DB 컬럼명(snake_case) → TypeScript(camelCase) 자동 변환이 적용됩니다.
230
+ *
231
+ * @example
232
+ * ```ts
233
+ * const rows = await repo.raw<UserRow>(
234
+ * 'SELECT * FROM users WHERE first_name ILIKE $1',
235
+ * ['%john%'],
236
+ * );
237
+ * ```
238
+ */
239
+ async raw(sql, params) {
240
+ return builder_1.QueryBuilder.raw(sql, params);
241
+ }
242
+ }
243
+ exports.BaseRepo = BaseRepo;
@@ -0,0 +1,13 @@
1
+ import { TableDef, Cols } from '../schema/interfaces/Table';
2
+ import { BaseRepo } from './base';
3
+ /**
4
+ * TableDef로부터 BaseRepo 인스턴스를 생성합니다.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const userRepo = createRepo(usersTable);
9
+ * const users = await userRepo.findAll();
10
+ * ```
11
+ */
12
+ export declare function createRepo<TDef extends TableDef<string, Cols>>(def: TDef): BaseRepo<TDef>;
13
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/features/repository/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAC5D,GAAG,EAAE,IAAI,GACR,QAAQ,CAAC,IAAI,CAAC,CAEhB"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRepo = createRepo;
4
+ const base_1 = require("./base");
5
+ /**
6
+ * TableDef로부터 BaseRepo 인스턴스를 생성합니다.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const userRepo = createRepo(usersTable);
11
+ * const users = await userRepo.findAll();
12
+ * ```
13
+ */
14
+ function createRepo(def) {
15
+ return new base_1.BaseRepo(def);
16
+ }
@@ -0,0 +1,4 @@
1
+ export * from './base';
2
+ export * from './create';
3
+ export * from './interfaces';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/repository/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base"), exports);
18
+ __exportStar(require("./create"), exports);
19
+ __exportStar(require("./interfaces"), exports);
@@ -0,0 +1,9 @@
1
+ import { WhereInput } from '../../query/interfaces/Where';
2
+ import { OrderByInput } from '../../query/interfaces/Order';
3
+ export interface FindOpts<T extends Record<string, unknown>> {
4
+ where?: WhereInput<T>;
5
+ orderBy?: OrderByInput<T>[];
6
+ limit?: number;
7
+ offset?: number;
8
+ }
9
+ //# sourceMappingURL=Find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Find.d.ts","sourceRoot":"","sources":["../../../../src/features/repository/interfaces/Find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,29 @@
1
+ import { FindOpts } from './Find';
2
+ import { QueryBuilder } from '../../query/builder';
3
+ import { AdvancedWhere, ExecHooks } from '../../query/interfaces/Advanced';
4
+ /**
5
+ * 기본 CRUD + 확장 레포지토리 인터페이스.
6
+ *
7
+ * @typeParam TRow - SELECT 결과 타입
8
+ * @typeParam TInsert - INSERT 입력 타입
9
+ * @typeParam TUpdate - UPDATE 입력 타입
10
+ */
11
+ export interface IRepo<TRow extends Record<string, unknown>, TInsert = Partial<TRow>, TUpdate = Partial<TRow>> {
12
+ findAll(opts?: FindOpts<TRow>): Promise<TRow[]>;
13
+ findById(id: number | string): Promise<TRow | null>;
14
+ findOne(where: Partial<TRow>): Promise<TRow | null>;
15
+ create(data: TInsert): Promise<TRow>;
16
+ update(id: number | string, data: TUpdate): Promise<TRow | null>;
17
+ delete(id: number | string): Promise<boolean>;
18
+ upsert(data: TInsert, conflictCol?: string): Promise<TRow>;
19
+ bulkCreate(rows: TInsert[]): Promise<TRow[]>;
20
+ /** 유연한 쿼리 빌더 반환 (WHERE / OR / JOIN / GROUP BY / paginate / calculate 지원) */
21
+ select(where?: AdvancedWhere<TRow>): QueryBuilder<TRow>;
22
+ /** 단건 조회 (없으면 null) */
23
+ selectOne(where: AdvancedWhere<TRow>): Promise<TRow | null>;
24
+ /** Raw SQL 실행 (camelCase 변환 자동 적용) */
25
+ raw<R extends Record<string, unknown>>(sql: string, params?: unknown[]): Promise<R[]>;
26
+ /** 이 레포지토리의 모든 select() 빌더에 적용될 글로벌 훅 등록 */
27
+ useHooks(h: ExecHooks<TRow>): this;
28
+ }
29
+ //# sourceMappingURL=Repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Repo.d.ts","sourceRoot":"","sources":["../../../../src/features/repository/interfaces/Repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,WAAW,KAAK,CACpB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAGvB,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAG7C,4EAA4E;IAC5E,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxD,uBAAuB;IACvB,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5D,sCAAsC;IACtC,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,4CAA4C;IAC5C,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export * from './Find';
2
+ export * from './Repo';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/repository/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Find"), exports);
18
+ __exportStar(require("./Repo"), exports);
@@ -0,0 +1,62 @@
1
+ import { ColShape } from './interfaces/Column';
2
+ /**
3
+ * 컬럼 정의 빌더 클래스.
4
+ *
5
+ * 타입 파라미터:
6
+ * - T : TypeScript 타입 (phantom)
7
+ * - IsOpt : INSERT 시 optional 여부
8
+ * - IsPrimary: primary key 여부
9
+ */
10
+ export declare class Col<T = unknown, IsOpt extends boolean = false, IsPrimary extends boolean = false> implements ColShape<T, IsOpt, IsPrimary> {
11
+ readonly pgType: string;
12
+ readonly isNullable: boolean;
13
+ readonly hasDefault: boolean;
14
+ readonly isPrimary: boolean;
15
+ readonly length?: number | undefined;
16
+ readonly _type: T;
17
+ readonly _isOpt: IsOpt;
18
+ readonly _isPrimary: IsPrimary;
19
+ constructor(pgType: string, isNullable?: boolean, hasDefault?: boolean, isPrimary?: boolean, length?: number | undefined);
20
+ /** 컬럼을 nullable로 설정합니다. (INSERT도 optional) */
21
+ nullable(): Col<T | null, true, IsPrimary>;
22
+ /**
23
+ * 런타임에서 INSERT optional 여부를 반환합니다.
24
+ * isNullable, hasDefault, isPrimary 중 하나라도 true 이면 optional입니다.
25
+ */
26
+ get isOptional(): boolean;
27
+ /** 컬럼을 NOT NULL로 설정합니다. */
28
+ notNull(): Col<Exclude<T, null>, false, IsPrimary>;
29
+ /** primary key로 설정합니다. (INSERT optional) */
30
+ primaryKey(): Col<T, true, true>;
31
+ /** DB 기본값이 있는 컬럼으로 설정합니다. (INSERT optional) */
32
+ default(): Col<T, true, IsPrimary>;
33
+ /** DEFAULT NOW() 컬럼으로 설정합니다. (INSERT optional) */
34
+ defaultNow(): Col<T, true, IsPrimary>;
35
+ }
36
+ /**
37
+ * 컬럼 빌더 팩토리.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const usersTable = defineTable('users', {
42
+ * id: col.serial().primaryKey(),
43
+ * name: col.varchar(255).notNull(),
44
+ * email: col.text().notNull(),
45
+ * });
46
+ * ```
47
+ */
48
+ export declare const col: {
49
+ serial: () => Col<number, true, false>;
50
+ integer: () => Col<number, false, false>;
51
+ bigint: () => Col<bigint, false, false>;
52
+ numeric: () => Col<number, false, false>;
53
+ varchar: (len?: number) => Col<string, false, false>;
54
+ text: () => Col<string, false, false>;
55
+ boolean: () => Col<boolean, false, false>;
56
+ timestamp: () => Col<Date, false, false>;
57
+ timestamptz: () => Col<Date, false, false>;
58
+ date: () => Col<Date, false, false>;
59
+ uuid: () => Col<string, false, false>;
60
+ jsonb: <T = unknown>() => Col<T, false, false>;
61
+ };
62
+ //# sourceMappingURL=column.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column.d.ts","sourceRoot":"","sources":["../../../src/features/schema/column.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;;;;;;GAOG;AACH,qBAAa,GAAG,CACd,CAAC,GAAG,OAAO,EACX,KAAK,SAAS,OAAO,GAAG,KAAK,EAC7B,SAAS,SAAS,OAAO,GAAG,KAAK,CACjC,YAAW,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC;IAMtC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAT1B,SAAiB,KAAK,EAAE,CAAC,CAAC;IAC1B,SAAiB,MAAM,EAAE,KAAK,CAAC;IAC/B,SAAiB,UAAU,EAAE,SAAS,CAAC;gBAG5B,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,OAAe,EAC3B,UAAU,GAAE,OAAe,EAC3B,SAAS,GAAE,OAAe,EAC1B,MAAM,CAAC,EAAE,MAAM,YAAA;IAG1B,8CAA8C;IAC9C,QAAQ,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;IAI1C;;;OAGG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,2BAA2B;IAC3B,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC;IAIlD,4CAA4C;IAC5C,UAAU,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAIhC,+CAA+C;IAC/C,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;IAIlC,kDAAkD;IAClD,UAAU,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;CAGtC;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,GAAG;;;;;oBAKM,MAAM;;;;;;;YAOZ,CAAC;CAChB,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.col = exports.Col = void 0;
4
+ /**
5
+ * 컬럼 정의 빌더 클래스.
6
+ *
7
+ * 타입 파라미터:
8
+ * - T : TypeScript 타입 (phantom)
9
+ * - IsOpt : INSERT 시 optional 여부
10
+ * - IsPrimary: primary key 여부
11
+ */
12
+ class Col {
13
+ constructor(pgType, isNullable = false, hasDefault = false, isPrimary = false, length) {
14
+ this.pgType = pgType;
15
+ this.isNullable = isNullable;
16
+ this.hasDefault = hasDefault;
17
+ this.isPrimary = isPrimary;
18
+ this.length = length;
19
+ }
20
+ /** 컬럼을 nullable로 설정합니다. (INSERT도 optional) */
21
+ nullable() {
22
+ return new Col(this.pgType, true, this.hasDefault, this.isPrimary, this.length);
23
+ }
24
+ /**
25
+ * 런타임에서 INSERT optional 여부를 반환합니다.
26
+ * isNullable, hasDefault, isPrimary 중 하나라도 true 이면 optional입니다.
27
+ */
28
+ get isOptional() {
29
+ return this.isNullable || this.hasDefault || this.isPrimary;
30
+ }
31
+ /** 컬럼을 NOT NULL로 설정합니다. */
32
+ notNull() {
33
+ return new Col(this.pgType, false, this.hasDefault, this.isPrimary, this.length);
34
+ }
35
+ /** primary key로 설정합니다. (INSERT optional) */
36
+ primaryKey() {
37
+ return new Col(this.pgType, this.isNullable, true, true, this.length);
38
+ }
39
+ /** DB 기본값이 있는 컬럼으로 설정합니다. (INSERT optional) */
40
+ default() {
41
+ return new Col(this.pgType, this.isNullable, true, this.isPrimary, this.length);
42
+ }
43
+ /** DEFAULT NOW() 컬럼으로 설정합니다. (INSERT optional) */
44
+ defaultNow() {
45
+ return new Col(this.pgType, this.isNullable, true, this.isPrimary, this.length);
46
+ }
47
+ }
48
+ exports.Col = Col;
49
+ /**
50
+ * 컬럼 빌더 팩토리.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const usersTable = defineTable('users', {
55
+ * id: col.serial().primaryKey(),
56
+ * name: col.varchar(255).notNull(),
57
+ * email: col.text().notNull(),
58
+ * });
59
+ * ```
60
+ */
61
+ exports.col = {
62
+ serial: () => new Col('serial', false, true, false),
63
+ integer: () => new Col('integer', false, false, false),
64
+ bigint: () => new Col('bigint', false, false, false),
65
+ numeric: () => new Col('numeric', false, false, false),
66
+ varchar: (len) => new Col('varchar', false, false, false, len),
67
+ text: () => new Col('text', false, false, false),
68
+ boolean: () => new Col('boolean', false, false, false),
69
+ timestamp: () => new Col('timestamp', false, false, false),
70
+ timestamptz: () => new Col('timestamptz', false, false, false),
71
+ date: () => new Col('date', false, false, false),
72
+ uuid: () => new Col('uuid', false, false, false),
73
+ jsonb: () => new Col('jsonb', false, false, false),
74
+ };
@@ -0,0 +1,4 @@
1
+ export * from './column';
2
+ export * from './table';
3
+ export * from './interfaces';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./column"), exports);
18
+ __exportStar(require("./table"), exports);
19
+ __exportStar(require("./interfaces"), exports);
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Col 클래스의 타입 파라미터를 외부에서 읽기 위한 인터페이스.
3
+ *
4
+ * - _type : 컬럼의 TypeScript 타입 (phantom)
5
+ * - _isOpt : INSERT 시 optional 여부 (primaryKey · hasDefault · nullable)
6
+ * - _isPrimary: primary key 여부
7
+ */
8
+ export interface ColShape<T = unknown, IsOpt extends boolean = boolean, IsPrimary extends boolean = boolean> {
9
+ readonly _type: T;
10
+ readonly _isOpt: IsOpt;
11
+ readonly _isPrimary: IsPrimary;
12
+ readonly pgType: string;
13
+ readonly isNullable: boolean;
14
+ readonly hasDefault: boolean;
15
+ readonly isPrimary: boolean;
16
+ readonly isOptional: boolean;
17
+ readonly length?: number;
18
+ }
19
+ //# sourceMappingURL=Column.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Column.d.ts","sourceRoot":"","sources":["../../../../src/features/schema/interfaces/Column.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ,CACvB,CAAC,GAAG,OAAO,EACX,KAAK,SAAS,OAAO,GAAG,OAAO,EAC/B,SAAS,SAAS,OAAO,GAAG,OAAO;IAEnC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,20 @@
1
+ import { TableDef, Cols } from './Table';
2
+ /** SELECT 결과 타입: 모든 컬럼 포함 */
3
+ export type InferRow<TDef extends TableDef<string, Cols>> = {
4
+ [K in keyof TDef['cols']]: TDef['cols'][K]['_type'];
5
+ };
6
+ /**
7
+ * INSERT 입력 타입:
8
+ * - _isOpt = false → required
9
+ * - _isOpt = true → optional
10
+ */
11
+ export type InferInsert<TDef extends TableDef<string, Cols>> = {
12
+ [K in keyof TDef['cols'] as TDef['cols'][K]['_isOpt'] extends true ? never : K]: TDef['cols'][K]['_type'];
13
+ } & {
14
+ [K in keyof TDef['cols'] as TDef['cols'][K]['_isOpt'] extends true ? K : never]?: TDef['cols'][K]['_type'];
15
+ };
16
+ /** UPDATE 입력 타입: primary key 제외, 모두 optional */
17
+ export type InferUpdate<TDef extends TableDef<string, Cols>> = {
18
+ [K in keyof TDef['cols'] as TDef['cols'][K]['_isPrimary'] extends true ? never : K]?: TDef['cols'][K]['_type'];
19
+ };
20
+ //# sourceMappingURL=Infer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Infer.d.ts","sourceRoot":"","sources":["../../../../src/features/schema/interfaces/Infer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEzC,6BAA6B;AAC7B,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI;KACzD,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;CACpD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IACzD;KAAG,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;CAAE,GAC7G;KAAG,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;CAAE,CAAC;AAEjH,gDAAgD;AAChD,MAAM,MAAM,WAAW,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI;KAC5D,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;CAC/G,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import { ColShape } from './Column';
2
+ export type Cols = Record<string, ColShape<unknown, boolean, boolean>>;
3
+ export interface TableDef<TName extends string = string, TCols extends Cols = Cols> {
4
+ readonly name: TName;
5
+ readonly cols: TCols;
6
+ }
7
+ //# sourceMappingURL=Table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../../src/features/schema/interfaces/Table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvE,MAAM,WAAW,QAAQ,CACvB,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,KAAK,SAAS,IAAI,GAAG,IAAI;IAEzB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export * from './Column';
2
+ export * from './Table';
3
+ export * from './Infer';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/schema/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}