@simplysm/orm-common 14.0.100 → 14.0.102

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 (71) hide show
  1. package/dist/db-context.d.ts +0 -17
  2. package/dist/db-context.d.ts.map +1 -1
  3. package/dist/db-context.js +0 -17
  4. package/dist/db-context.js.map +1 -1
  5. package/dist/errors/db-transaction-error.d.ts +0 -15
  6. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  7. package/dist/errors/db-transaction-error.js +0 -15
  8. package/dist/errors/db-transaction-error.js.map +1 -1
  9. package/dist/exec/executable.d.ts +0 -24
  10. package/dist/exec/executable.d.ts.map +1 -1
  11. package/dist/exec/executable.js +0 -24
  12. package/dist/exec/executable.js.map +1 -1
  13. package/dist/exec/queryable.d.ts +0 -300
  14. package/dist/exec/queryable.d.ts.map +1 -1
  15. package/dist/exec/queryable.js +0 -213
  16. package/dist/exec/queryable.js.map +1 -1
  17. package/dist/expr/expr.d.ts +0 -689
  18. package/dist/expr/expr.d.ts.map +1 -1
  19. package/dist/expr/expr.js +0 -689
  20. package/dist/expr/expr.js.map +1 -1
  21. package/dist/schema/factory/column-builder.d.ts +0 -86
  22. package/dist/schema/factory/column-builder.d.ts.map +1 -1
  23. package/dist/schema/factory/column-builder.js +0 -74
  24. package/dist/schema/factory/column-builder.js.map +1 -1
  25. package/dist/schema/factory/index-builder.d.ts +0 -60
  26. package/dist/schema/factory/index-builder.d.ts.map +1 -1
  27. package/dist/schema/factory/index-builder.js +0 -60
  28. package/dist/schema/factory/index-builder.js.map +1 -1
  29. package/dist/schema/factory/relation-builder.d.ts +0 -83
  30. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  31. package/dist/schema/factory/relation-builder.js +0 -77
  32. package/dist/schema/factory/relation-builder.js.map +1 -1
  33. package/dist/schema/procedure-builder.d.ts +0 -87
  34. package/dist/schema/procedure-builder.d.ts.map +1 -1
  35. package/dist/schema/procedure-builder.js +0 -87
  36. package/dist/schema/procedure-builder.js.map +1 -1
  37. package/dist/schema/table-builder.d.ts +0 -127
  38. package/dist/schema/table-builder.d.ts.map +1 -1
  39. package/dist/schema/table-builder.js +0 -127
  40. package/dist/schema/table-builder.js.map +1 -1
  41. package/dist/schema/view-builder.d.ts +0 -76
  42. package/dist/schema/view-builder.d.ts.map +1 -1
  43. package/dist/schema/view-builder.js +0 -76
  44. package/dist/schema/view-builder.js.map +1 -1
  45. package/dist/types/column.d.ts +0 -38
  46. package/dist/types/column.d.ts.map +1 -1
  47. package/dist/types/column.js +0 -13
  48. package/dist/types/column.js.map +1 -1
  49. package/dist/types/db.d.ts +0 -54
  50. package/dist/types/db.d.ts.map +1 -1
  51. package/dist/types/db.js +0 -8
  52. package/dist/types/db.js.map +1 -1
  53. package/dist/utils/result-parser.d.ts +0 -21
  54. package/dist/utils/result-parser.d.ts.map +1 -1
  55. package/dist/utils/result-parser.js +0 -24
  56. package/dist/utils/result-parser.js.map +1 -1
  57. package/package.json +2 -2
  58. package/src/db-context.ts +0 -17
  59. package/src/errors/db-transaction-error.ts +0 -15
  60. package/src/exec/executable.ts +0 -24
  61. package/src/exec/queryable.ts +0 -300
  62. package/src/expr/expr.ts +0 -689
  63. package/src/schema/factory/column-builder.ts +0 -86
  64. package/src/schema/factory/index-builder.ts +0 -60
  65. package/src/schema/factory/relation-builder.ts +0 -83
  66. package/src/schema/procedure-builder.ts +0 -87
  67. package/src/schema/table-builder.ts +0 -127
  68. package/src/schema/view-builder.ts +0 -76
  69. package/src/types/column.ts +0 -38
  70. package/src/types/db.ts +0 -54
  71. package/src/utils/result-parser.ts +0 -24
@@ -207,23 +207,6 @@ class RecursiveQueryable<TBaseData extends DataRecord> {
207
207
  *
208
208
  * @template TData - Query 결과의 데이터 타입
209
209
  * @template TFrom - 소스 table (CUD 연산에 필요)
210
- *
211
- * @example
212
- * ```typescript
213
- * // Basic query
214
- * const users = await db.user()
215
- * .where((u) => [expr.eq(u.isActive, true)])
216
- * .orderBy((u) => u.name)
217
- * .execute();
218
- *
219
- * // JOIN query
220
- * const posts = await db.post()
221
- * .include((p) => p.user)
222
- * .execute();
223
- *
224
- * // INSERT
225
- * await db.user().insert([{ name: "Gildong Hong", email: "test@test.com" }]);
226
- * ```
227
210
  */
228
211
  export class Queryable<
229
212
  TData extends DataRecord,
@@ -238,14 +221,6 @@ export class Queryable<
238
221
  *
239
222
  * @param fn - Column 매핑 함수. 원본 column을 받아 새 column 구조를 반환
240
223
  * @returns 새 column 구조가 적용된 Queryable
241
- *
242
- * @example
243
- * ```typescript
244
- * db.user().select((u) => ({
245
- * userName: u.name,
246
- * userEmail: u.email,
247
- * }))
248
- * ```
249
224
  */
250
225
  select<R extends Record<string, any>>(
251
226
  fn: (columns: QueryableRecord<TData>) => R,
@@ -263,13 +238,6 @@ export class Queryable<
263
238
  * 중복 행 제거를 위한 DISTINCT 옵션 적용
264
239
  *
265
240
  * @returns DISTINCT가 적용된 Queryable
266
- *
267
- * @example
268
- * ```typescript
269
- * db.user()
270
- * .select((u) => ({ name: u.name }))
271
- * .distinct()
272
- * ```
273
241
  */
274
242
  distinct(): Queryable<TData, never> {
275
243
  return new Queryable({
@@ -284,16 +252,6 @@ export class Queryable<
284
252
  * 트랜잭션 내에서 선택된 행에 대한 배타적 잠금 획득
285
253
  *
286
254
  * @returns 잠금이 적용된 Queryable
287
- *
288
- * @example
289
- * ```typescript
290
- * await db.connect(async () => {
291
- * const user = await db.user()
292
- * .where((u) => [expr.eq(u.id, 1)])
293
- * .lock()
294
- * .single();
295
- * });
296
- * ```
297
255
  */
298
256
  lock(): Queryable<TData, TFrom> {
299
257
  return new Queryable({
@@ -311,14 +269,6 @@ export class Queryable<
311
269
  *
312
270
  * @param count - 선택할 행 수
313
271
  * @returns TOP이 적용된 Queryable
314
- *
315
- * @example
316
- * ```typescript
317
- * // Latest 10 users
318
- * db.user()
319
- * .orderBy((u) => u.createdAt, "DESC")
320
- * .top(10)
321
- * ```
322
272
  */
323
273
  top(count: number): Queryable<TData, TFrom> {
324
274
  return new Queryable({
@@ -335,13 +285,6 @@ export class Queryable<
335
285
  * @param take - 가져올 행 수 (LIMIT)
336
286
  * @returns 페이지네이션이 적용된 Queryable
337
287
  * @throws ORDER BY 절이 없으면 에러
338
- *
339
- * @example
340
- * ```typescript
341
- * db.user
342
- * .orderBy((u) => u.createdAt)
343
- * .limit(0, 20) // first 20
344
- * ```
345
288
  */
346
289
  limit(skip: number, take: number): Queryable<TData, TFrom> {
347
290
  if (!this.meta.orderBy) {
@@ -370,15 +313,6 @@ export class Queryable<
370
313
  * @param fnOrKey - 정렬할 column을 반환하는 함수 또는 체인 경로 문자열
371
314
  * @param orderBy - 정렬 방향 (ASC/DESC). 기본값: ASC
372
315
  * @returns 정렬 조건이 추가된 Queryable
373
- *
374
- * @example
375
- * ```typescript
376
- * db.user
377
- * .orderBy((u) => u.name) // name ASC
378
- * .orderBy((u) => u.age, "DESC") // age DESC
379
- * .orderBy("id", "DESC") // string overload
380
- * .orderBy("user.name") // chain path
381
- * ```
382
316
  */
383
317
  orderBy(
384
318
  fnOrKey: string | ((columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>),
@@ -407,13 +341,6 @@ export class Queryable<
407
341
  *
408
342
  * @param predicate - 조건 배열을 반환하는 함수
409
343
  * @returns 조건이 추가된 Queryable
410
- *
411
- * @example
412
- * ```typescript
413
- * db.user
414
- * .where((u) => [expr.eq(u.isActive, true)])
415
- * .where((u) => [expr.gte(u.age, 18)])
416
- * ```
417
344
  */
418
345
  where(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, TFrom> {
419
346
  const conditions = predicate(this.meta.columns);
@@ -435,12 +362,6 @@ export class Queryable<
435
362
  * @param fn - 검색 대상 column을 반환하는 함수
436
363
  * @param searchText - 검색 텍스트
437
364
  * @returns 검색 조건이 추가된 Queryable
438
- *
439
- * @example
440
- * ```typescript
441
- * db.user()
442
- * .search((u) => [u.name, u.email], "John Doe -withdrawn")
443
- * ```
444
365
  */
445
366
  search(
446
367
  fn: (columns: QueryableRecord<TData>) => ExprUnit<string | undefined>[],
@@ -498,16 +419,6 @@ export class Queryable<
498
419
  *
499
420
  * @param fn - 그룹화할 column을 반환하는 함수
500
421
  * @returns GROUP BY가 적용된 Queryable
501
- *
502
- * @example
503
- * ```typescript
504
- * db.order()
505
- * .select((o) => ({
506
- * userId: o.userId,
507
- * totalAmount: expr.sum(o.amount),
508
- * }))
509
- * .groupBy((o) => [o.userId])
510
- * ```
511
422
  */
512
423
  groupBy(
513
424
  fn: (columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>[],
@@ -522,17 +433,6 @@ export class Queryable<
522
433
  *
523
434
  * @param predicate - 조건 배열을 반환하는 함수
524
435
  * @returns HAVING이 적용된 Queryable
525
- *
526
- * @example
527
- * ```typescript
528
- * db.order()
529
- * .select((o) => ({
530
- * userId: o.userId,
531
- * totalAmount: expr.sum(o.amount),
532
- * }))
533
- * .groupBy((o) => [o.userId])
534
- * .having((o) => [expr.gte(o.totalAmount, 10000)])
535
- * ```
536
436
  */
537
437
  having(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, never> {
538
438
  const conditions = predicate(this.meta.columns);
@@ -553,16 +453,6 @@ export class Queryable<
553
453
  * @param as - 결과에 추가할 속성 이름
554
454
  * @param fn - 조인 조건을 정의하는 콜백 함수
555
455
  * @returns 조인 결과가 배열로 추가된 Queryable
556
- *
557
- * @example
558
- * ```typescript
559
- * db.user()
560
- * .join("posts", (qr, u) =>
561
- * qr.from(Post)
562
- * .where((p) => [expr.eq(p.userId, u.id)])
563
- * )
564
- * // Result: { id, name, posts: [{ id, title }, ...] }
565
- * ```
566
456
  */
567
457
  join<A extends string, R extends DataRecord>(
568
458
  as: A,
@@ -597,16 +487,6 @@ export class Queryable<
597
487
  * @param as - 결과에 추가할 속성 이름
598
488
  * @param fn - 조인 조건을 정의하는 콜백 함수
599
489
  * @returns 조인 결과가 단일 객체로 추가된 Queryable
600
- *
601
- * @example
602
- * ```typescript
603
- * db.post()
604
- * .joinSingle("user", (qr, p) =>
605
- * qr.from(User)
606
- * .where((u) => [expr.eq(u.id, p.userId)])
607
- * )
608
- * // Result: { id, title, user: { id, name } | undefined }
609
- * ```
610
490
  */
611
491
  joinSingle<A extends string, R extends DataRecord>(
612
492
  as: A,
@@ -649,20 +529,6 @@ export class Queryable<
649
529
  * @param fn - 포함할 관계를 선택하는 함수 (PathProxy를 통해 타입 체크)
650
530
  * @returns JOIN이 추가된 Queryable
651
531
  * @throws 관계가 정의되지 않은 경우 에러
652
- *
653
- * @example
654
- * ```typescript
655
- * // Single relationship include
656
- * db.post.include((p) => p.user)
657
- *
658
- * // Nested relationship include
659
- * db.post.include((p) => p.user.company)
660
- *
661
- * // Multiple relationship include
662
- * db.user
663
- * .include((u) => u.company)
664
- * .include((u) => u.posts)
665
- * ```
666
532
  */
667
533
  include(fn: (item: PathProxy<TData>) => PathProxy<unknown>): Queryable<TData, TFrom> {
668
534
  const proxy = createPathProxy<TData>();
@@ -818,16 +684,6 @@ export class Queryable<
818
684
  * Required when using count() after distinct() or groupBy()
819
685
  *
820
686
  * @returns Queryable wrapped as a Subquery
821
- *
822
- * @example
823
- * ```typescript
824
- * // Count after DISTINCT
825
- * const count = await db.user()
826
- * .select((u) => ({ name: u.name }))
827
- * .distinct()
828
- * .wrap()
829
- * .count();
830
- * ```
831
687
  */
832
688
  wrap(): Queryable<TData, never> {
833
689
  // 현재 Queryable을 서브쿼리로 래핑
@@ -846,14 +702,6 @@ export class Queryable<
846
702
  * @param queries - Array of Queryables to UNION (minimum 2)
847
703
  * @returns UNION-ed Queryable
848
704
  * @throws If less than 2 queryables are passed
849
- *
850
- * @example
851
- * ```typescript
852
- * const combined = Queryable.union(
853
- * db.user().where((u) => [expr.eq(u.type, "admin")]),
854
- * db.user().where((u) => [expr.eq(u.type, "manager")]),
855
- * );
856
- * ```
857
705
  */
858
706
  static union<TData extends DataRecord>(
859
707
  ...queries: Queryable<TData, any>[]
@@ -886,17 +734,6 @@ export class Queryable<
886
734
  *
887
735
  * @param fn - Callback function that defines the recursive part
888
736
  * @returns Queryable with the recursive CTE applied
889
- *
890
- * @example
891
- * ```typescript
892
- * // Query org chart hierarchy
893
- * db.employee()
894
- * .where((e) => [expr.null(e.managerId)]) // Root nodes
895
- * .recursive((cte) =>
896
- * cte.from(Employee)
897
- * .where((e) => [expr.eq(e.managerId, e.self[0].id)])
898
- * )
899
- * ```
900
737
  */
901
738
  recursive(
902
739
  fn: (qr: RecursiveQueryable<TData>) => Queryable<TData, any>,
@@ -931,13 +768,6 @@ export class Queryable<
931
768
  * Execute a SELECT query and return the result array
932
769
  *
933
770
  * @returns Query result array
934
- *
935
- * @example
936
- * ```typescript
937
- * const users = await db.user()
938
- * .where((u) => [expr.eq(u.isActive, true)])
939
- * .execute();
940
- * ```
941
771
  */
942
772
  async execute(): Promise<TData[]> {
943
773
  const results = await this.meta.db.executeDefs<TData>(
@@ -952,13 +782,6 @@ export class Queryable<
952
782
  *
953
783
  * @returns Single result or undefined
954
784
  * @throws When more than one result is returned
955
- *
956
- * @example
957
- * ```typescript
958
- * const user = await db.user()
959
- * .where((u) => [expr.eq(u.id, 1)])
960
- * .single();
961
- * ```
962
785
  */
963
786
  async single(): Promise<TData | undefined> {
964
787
  const result = await this.execute();
@@ -989,13 +812,6 @@ export class Queryable<
989
812
  * Return the first result (only the first even if multiple exist)
990
813
  *
991
814
  * @returns First result or undefined
992
- *
993
- * @example
994
- * ```typescript
995
- * const latestUser = await db.user()
996
- * .orderBy((u) => u.createdAt, "DESC")
997
- * .first();
998
- * ```
999
815
  */
1000
816
  async first(): Promise<TData | undefined> {
1001
817
  const results = await this.top(1).execute();
@@ -1008,13 +824,6 @@ export class Queryable<
1008
824
  * @param fn - Function to specify the column to count (optional)
1009
825
  * @returns Number of rows
1010
826
  * @throws Error when called directly after distinct() or groupBy() (use wrap() first)
1011
- *
1012
- * @example
1013
- * ```typescript
1014
- * const count = await db.user()
1015
- * .where((u) => [expr.eq(u.isActive, true)])
1016
- * .count();
1017
- * ```
1018
827
  */
1019
828
  async count(fn?: (cols: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>): Promise<number> {
1020
829
  if (this.meta.distinct) {
@@ -1037,13 +846,6 @@ export class Queryable<
1037
846
  * Check whether data matching the conditions exists
1038
847
  *
1039
848
  * @returns true if exists, false otherwise
1040
- *
1041
- * @example
1042
- * ```typescript
1043
- * const hasAdmin = await db.user()
1044
- * .where((u) => [expr.eq(u.role, "admin")])
1045
- * .exists();
1046
- * ```
1047
849
  */
1048
850
  async exists(): Promise<boolean> {
1049
851
  const result = await this.top(1).execute();
@@ -1189,20 +991,6 @@ export class Queryable<
1189
991
  * @param records - Array of records to insert
1190
992
  * @param outputColumns - Column name array to receive (optional)
1191
993
  * @returns When outputColumns specified, returns array of inserted records
1192
- *
1193
- * @example
1194
- * ```typescript
1195
- * // Simple insert
1196
- * await db.user().insert([
1197
- * { name: "Gildong Hong", email: "hong@test.com" },
1198
- * ]);
1199
- *
1200
- * // Return ID after insert
1201
- * const [inserted] = await db.user().insert(
1202
- * [{ name: "Gildong Hong" }],
1203
- * ["id"],
1204
- * );
1205
- * ```
1206
994
  */
1207
995
  async insert(records: TFrom["$inferInsert"][]): Promise<void>;
1208
996
  async insert<K extends keyof TFrom["$inferColumns"] & string>(
@@ -1245,13 +1033,6 @@ export class Queryable<
1245
1033
  * @param record - Record to insert
1246
1034
  * @param outputColumns - Column name array to receive (optional)
1247
1035
  * @returns When outputColumns specified, returns the inserted record
1248
- *
1249
- * @example
1250
- * ```typescript
1251
- * await db.user()
1252
- * .where((u) => [expr.eq(u.email, "test@test.com")])
1253
- * .insertIfNotExists({ name: "testing", email: "test@test.com" });
1254
- * ```
1255
1036
  */
1256
1037
  async insertIfNotExists(record: TFrom["$inferInsert"]): Promise<void>;
1257
1038
  async insertIfNotExists<K extends keyof TFrom["$inferColumns"] & string>(
@@ -1278,14 +1059,6 @@ export class Queryable<
1278
1059
  * @param targetTable - Target Table to insert into
1279
1060
  * @param outputColumns - Column name array to receive (optional)
1280
1061
  * @returns When outputColumns specified, returns array of inserted records
1281
- *
1282
- * @example
1283
- * ```typescript
1284
- * await db.user()
1285
- * .select((u) => ({ name: u.name, createdAt: u.createdAt }))
1286
- * .where((u) => [expr.eq(u.isArchived, false)])
1287
- * .insertInto(ArchivedUser);
1288
- * ```
1289
1062
  */
1290
1063
  async insertInto<TTable extends TableBuilder<any, DataToColumnBuilderRecord<TData>, any>>(
1291
1064
  targetTable: TTable,
@@ -1390,23 +1163,6 @@ export class Queryable<
1390
1163
  * @param recordFwd - Function that returns the columns and values to update
1391
1164
  * @param outputColumns - Column name array to receive (optional)
1392
1165
  * @returns When outputColumns specified, returns array of updated records
1393
- *
1394
- * @example
1395
- * ```typescript
1396
- * // Simple update
1397
- * await db.user()
1398
- * .where((u) => [expr.eq(u.id, 1)])
1399
- * .update((u) => ({
1400
- * name: expr.val("string", "New Name"),
1401
- * updatedAt: expr.val("DateTime", DateTime.now()),
1402
- * }));
1403
- *
1404
- * // Reference existing value
1405
- * await db.product()
1406
- * .update((p) => ({
1407
- * price: expr.mul(p.price, expr.val("number", 1.1)),
1408
- * }));
1409
- * ```
1410
1166
  */
1411
1167
  async update(
1412
1168
  recordFwd: (cols: QueryableRecord<TData>) => QueryableWriteRecord<TFrom["$inferUpdate"]>,
@@ -1434,19 +1190,6 @@ export class Queryable<
1434
1190
  *
1435
1191
  * @param outputColumns - Column name array to receive (optional)
1436
1192
  * @returns When outputColumns specified, returns array of deleted records
1437
- *
1438
- * @example
1439
- * ```typescript
1440
- * // Simple delete
1441
- * await db.user()
1442
- * .where((u) => [expr.eq(u.id, 1)])
1443
- * .delete();
1444
- *
1445
- * // Return deleted data
1446
- * const deleted = await db.user()
1447
- * .where((u) => [expr.eq(u.isExpired, true)])
1448
- * .delete(["id", "name"]);
1449
- * ```
1450
1193
  */
1451
1194
  async delete(): Promise<void>;
1452
1195
  async delete<K extends keyof TFrom["$inferColumns"] & string>(
@@ -1526,25 +1269,6 @@ export class Queryable<
1526
1269
  * @param insertFn - Function that returns the record to insert (optional, defaults to same as updateFn)
1527
1270
  * @param outputColumns - Column name array to receive (optional)
1528
1271
  * @returns When outputColumns specified, returns array of affected records
1529
- *
1530
- * @example
1531
- * ```typescript
1532
- * // Same data for UPDATE/INSERT
1533
- * await db.user()
1534
- * .where((u) => [expr.eq(u.email, "test@test.com")])
1535
- * .upsert(() => ({
1536
- * name: expr.val("string", "testing"),
1537
- * email: expr.val("string", "test@test.com"),
1538
- * }));
1539
- *
1540
- * // Different data for UPDATE/INSERT
1541
- * await db.user()
1542
- * .where((u) => [expr.eq(u.email, "test@test.com")])
1543
- * .upsert(
1544
- * () => ({ loginCount: expr.val("number", 1) }),
1545
- * (update) => ({ ...update, email: expr.val("string", "test@test.com") }),
1546
- * );
1547
- * ```
1548
1272
  */
1549
1273
  async upsert(
1550
1274
  updateFn: (cols: QueryableRecord<TData>) => QueryableWriteRecord<TFrom["$inferUpdate"]>,
@@ -1862,15 +1586,6 @@ export type UnwrapQueryableRecord<R> = {
1862
1586
  /**
1863
1587
  * include()에서 타입 안전하게 관계 경로를 지정하기 위한 Proxy 타입
1864
1588
  * non-ColumnPrimitive 필드(FK, FKT 관계)만 접근 가능
1865
- *
1866
- * @example
1867
- * ```typescript
1868
- * // item.user.company 접근 시 내부적으로 경로 ["user", "company"]를 수집
1869
- * db.post.include(item => item.user.company)
1870
- *
1871
- * // item.title은 string(ColumnPrimitive)이므로 컴파일 에러
1872
- * db.post.include(item => item.title) // 컴파일 에러
1873
- * ```
1874
1589
  */
1875
1590
  /**
1876
1591
  * 배열이면 요소 타입 추출
@@ -1930,21 +1645,6 @@ function createPathProxy<TObject>(path: string[] = []): PathProxy<TObject> {
1930
1645
  * @param tableOrView - TableBuilder 또는 ViewBuilder 인스턴스
1931
1646
  * @param as - Alias 지정 (선택, 미지정 시 자동 생성)
1932
1647
  * @returns Queryable을 반환하는 factory 함수
1933
- *
1934
- * @example
1935
- * ```typescript
1936
- * class AppDbContext extends DbContext {
1937
- * // 호출할 때마다 새 alias가 할당됨
1938
- * user = queryable(this, User);
1939
- *
1940
- * // 사용 예시
1941
- * async getActiveUsers() {
1942
- * return this.user()
1943
- * .where((u) => [expr.eq(u.isActive, true)])
1944
- * .execute();
1945
- * }
1946
- * }
1947
- * ```
1948
1648
  */
1949
1649
  export function queryable<TBuilder extends TableBuilder<any, any, any> | ViewBuilder<any, any, any>>(
1950
1650
  db: DbContextBase,