oakbun 0.1.0

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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/dist/adapter/mysql.d.ts +21 -0
  4. package/dist/adapter/mysql.d.ts.map +1 -0
  5. package/dist/adapter/mysql.js +10 -0
  6. package/dist/adapter/mysql.js.map +1 -0
  7. package/dist/adapter/postgres.d.ts +16 -0
  8. package/dist/adapter/postgres.d.ts.map +1 -0
  9. package/dist/adapter/postgres.js +10 -0
  10. package/dist/adapter/postgres.js.map +1 -0
  11. package/dist/adapter/resolve.d.ts +16 -0
  12. package/dist/adapter/resolve.d.ts.map +1 -0
  13. package/dist/adapter/sqlite.d.ts +17 -0
  14. package/dist/adapter/sqlite.d.ts.map +1 -0
  15. package/dist/adapter/sqlite.js +10 -0
  16. package/dist/adapter/sqlite.js.map +1 -0
  17. package/dist/adapter/types.d.ts +29 -0
  18. package/dist/adapter/types.d.ts.map +1 -0
  19. package/dist/app/audit-wiring.d.ts +6 -0
  20. package/dist/app/audit-wiring.d.ts.map +1 -0
  21. package/dist/app/body-size-limit.d.ts +29 -0
  22. package/dist/app/body-size-limit.d.ts.map +1 -0
  23. package/dist/app/compression.d.ts +25 -0
  24. package/dist/app/compression.d.ts.map +1 -0
  25. package/dist/app/cookies.d.ts +17 -0
  26. package/dist/app/cookies.d.ts.map +1 -0
  27. package/dist/app/cors.d.ts +65 -0
  28. package/dist/app/cors.d.ts.map +1 -0
  29. package/dist/app/csrf.d.ts +52 -0
  30. package/dist/app/csrf.d.ts.map +1 -0
  31. package/dist/app/health.d.ts +36 -0
  32. package/dist/app/health.d.ts.map +1 -0
  33. package/dist/app/index.d.ts +282 -0
  34. package/dist/app/index.d.ts.map +1 -0
  35. package/dist/app/logger.d.ts +4 -0
  36. package/dist/app/logger.d.ts.map +1 -0
  37. package/dist/app/middleware.d.ts +20 -0
  38. package/dist/app/middleware.d.ts.map +1 -0
  39. package/dist/app/module.d.ts +273 -0
  40. package/dist/app/module.d.ts.map +1 -0
  41. package/dist/app/plugin.d.ts +112 -0
  42. package/dist/app/plugin.d.ts.map +1 -0
  43. package/dist/app/rate-limit.d.ts +76 -0
  44. package/dist/app/rate-limit.d.ts.map +1 -0
  45. package/dist/app/request-id.d.ts +52 -0
  46. package/dist/app/request-id.d.ts.map +1 -0
  47. package/dist/app/router.d.ts +6 -0
  48. package/dist/app/router.d.ts.map +1 -0
  49. package/dist/app/scalar.d.ts +40 -0
  50. package/dist/app/scalar.d.ts.map +1 -0
  51. package/dist/app/secure-headers.d.ts +48 -0
  52. package/dist/app/secure-headers.d.ts.map +1 -0
  53. package/dist/app/system-ctx.d.ts +3 -0
  54. package/dist/app/system-ctx.d.ts.map +1 -0
  55. package/dist/app/types.d.ts +277 -0
  56. package/dist/app/types.d.ts.map +1 -0
  57. package/dist/chunk-32M77PK3.js +75 -0
  58. package/dist/chunk-32M77PK3.js.map +1 -0
  59. package/dist/chunk-7C6SKWY7.js +86 -0
  60. package/dist/chunk-7C6SKWY7.js.map +1 -0
  61. package/dist/chunk-7PGCL2E7.js +78 -0
  62. package/dist/chunk-7PGCL2E7.js.map +1 -0
  63. package/dist/chunk-F3WAOTEN.js +86 -0
  64. package/dist/chunk-FJSYS3BT.js +27 -0
  65. package/dist/chunk-UNRUXO7H.js +68 -0
  66. package/dist/chunk-WQ44NZ6K.js +116 -0
  67. package/dist/chunk-Z6ZWNWWR.js +34 -0
  68. package/dist/chunk-Z6ZWNWWR.js.map +1 -0
  69. package/dist/cli/bin.d.ts +3 -0
  70. package/dist/cli/bin.d.ts.map +1 -0
  71. package/dist/cli/bin.js +645 -0
  72. package/dist/cli/commands/make/migration.d.ts +3 -0
  73. package/dist/cli/commands/make/migration.d.ts.map +1 -0
  74. package/dist/cli/commands/migrate/adapter.d.ts +14 -0
  75. package/dist/cli/commands/migrate/adapter.d.ts.map +1 -0
  76. package/dist/cli/commands/migrate/generate.d.ts +3 -0
  77. package/dist/cli/commands/migrate/generate.d.ts.map +1 -0
  78. package/dist/cli/commands/migrate/rollback.d.ts +3 -0
  79. package/dist/cli/commands/migrate/rollback.d.ts.map +1 -0
  80. package/dist/cli/commands/migrate/run.d.ts +3 -0
  81. package/dist/cli/commands/migrate/run.d.ts.map +1 -0
  82. package/dist/cli/commands/migrate/status.d.ts +3 -0
  83. package/dist/cli/commands/migrate/status.d.ts.map +1 -0
  84. package/dist/cli/commands/tinker.d.ts +7 -0
  85. package/dist/cli/commands/tinker.d.ts.map +1 -0
  86. package/dist/cli/config/defaults.d.ts +4 -0
  87. package/dist/cli/config/defaults.d.ts.map +1 -0
  88. package/dist/cli/config/loader.d.ts +3 -0
  89. package/dist/cli/config/loader.d.ts.map +1 -0
  90. package/dist/cli/config/types.d.ts +31 -0
  91. package/dist/cli/config/types.d.ts.map +1 -0
  92. package/dist/cli/discovery/commands.d.ts +4 -0
  93. package/dist/cli/discovery/commands.d.ts.map +1 -0
  94. package/dist/cli/discovery/services.d.ts +4 -0
  95. package/dist/cli/discovery/services.d.ts.map +1 -0
  96. package/dist/cli/discovery/tables.d.ts +5 -0
  97. package/dist/cli/discovery/tables.d.ts.map +1 -0
  98. package/dist/cli/index.d.ts +3 -0
  99. package/dist/cli/index.d.ts.map +1 -0
  100. package/dist/client/error.d.ts +8 -0
  101. package/dist/client/error.d.ts.map +1 -0
  102. package/dist/client/index.d.ts +33 -0
  103. package/dist/client/index.d.ts.map +1 -0
  104. package/dist/client/proxy.d.ts +88 -0
  105. package/dist/client/proxy.d.ts.map +1 -0
  106. package/dist/client/test-client.d.ts +30 -0
  107. package/dist/client/test-client.d.ts.map +1 -0
  108. package/dist/cron/index.d.ts +73 -0
  109. package/dist/cron/index.d.ts.map +1 -0
  110. package/dist/db/index.d.ts +281 -0
  111. package/dist/db/index.d.ts.map +1 -0
  112. package/dist/db/migrations/diff.d.ts +5 -0
  113. package/dist/db/migrations/diff.d.ts.map +1 -0
  114. package/dist/db/migrations/generator.d.ts +26 -0
  115. package/dist/db/migrations/generator.d.ts.map +1 -0
  116. package/dist/db/migrations/index.d.ts +9 -0
  117. package/dist/db/migrations/index.d.ts.map +1 -0
  118. package/dist/db/migrations/introspect.d.ts +8 -0
  119. package/dist/db/migrations/introspect.d.ts.map +1 -0
  120. package/dist/db/migrations/migrator.d.ts +10 -0
  121. package/dist/db/migrations/migrator.d.ts.map +1 -0
  122. package/dist/db/migrations/runner.d.ts +7 -0
  123. package/dist/db/migrations/runner.d.ts.map +1 -0
  124. package/dist/db/migrations/tracker.d.ts +7 -0
  125. package/dist/db/migrations/tracker.d.ts.map +1 -0
  126. package/dist/db/migrations/types.d.ts +70 -0
  127. package/dist/db/migrations/types.d.ts.map +1 -0
  128. package/dist/db/sql.d.ts +148 -0
  129. package/dist/db/sql.d.ts.map +1 -0
  130. package/dist/db-XTXH6OKV.js +889 -0
  131. package/dist/errors/index.d.ts +30 -0
  132. package/dist/errors/index.d.ts.map +1 -0
  133. package/dist/events/handler.d.ts +42 -0
  134. package/dist/events/handler.d.ts.map +1 -0
  135. package/dist/events/index.d.ts +48 -0
  136. package/dist/events/index.d.ts.map +1 -0
  137. package/dist/events-LDXSK7ME.js +12 -0
  138. package/dist/executor-BM3A6AGL.js +104 -0
  139. package/dist/hooks/executor.d.ts +20 -0
  140. package/dist/hooks/executor.d.ts.map +1 -0
  141. package/dist/hooks/types.d.ts +10 -0
  142. package/dist/hooks/types.d.ts.map +1 -0
  143. package/dist/index.d.ts +83 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +5562 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/migrations-IWFQ6MZZ.js +757 -0
  148. package/dist/model/index.d.ts +24 -0
  149. package/dist/model/index.d.ts.map +1 -0
  150. package/dist/openapi/generator.d.ts +58 -0
  151. package/dist/openapi/generator.d.ts.map +1 -0
  152. package/dist/openapi/zod-to-schema.d.ts +4 -0
  153. package/dist/openapi/zod-to-schema.d.ts.map +1 -0
  154. package/dist/resource/errors.d.ts +2 -0
  155. package/dist/resource/errors.d.ts.map +1 -0
  156. package/dist/resource/index.d.ts +98 -0
  157. package/dist/resource/index.d.ts.map +1 -0
  158. package/dist/resource/zod-table.d.ts +6 -0
  159. package/dist/resource/zod-table.d.ts.map +1 -0
  160. package/dist/schema/audit.d.ts +25 -0
  161. package/dist/schema/audit.d.ts.map +1 -0
  162. package/dist/schema/column.d.ts +31 -0
  163. package/dist/schema/column.d.ts.map +1 -0
  164. package/dist/schema/table.d.ts +68 -0
  165. package/dist/schema/table.d.ts.map +1 -0
  166. package/dist/service/index.d.ts +27 -0
  167. package/dist/service/index.d.ts.map +1 -0
  168. package/dist/service-W4V6TFWU.js +126 -0
  169. package/dist/sqlite-VTXOCD65.js +10 -0
  170. package/dist/system-ctx-GPF44QCE.js +42 -0
  171. package/package.json +69 -0
@@ -0,0 +1,281 @@
1
+ import type { VelnAdapter, BindingValue, QueryLogEntry } from '../adapter/types';
2
+ import type { SchemaMap, TableDef, InferInsert } from '../schema/table';
3
+ import type { HookExecutor } from '../hooks/executor';
4
+ import { RequestEventQueue } from '../events/index';
5
+ import type { JoinClause, SelectOptions, WhereInput, SqlDialect } from './sql';
6
+ export interface QueryLog {
7
+ /** Total number of queries executed during this request. */
8
+ queries: number;
9
+ /** Cumulative wall-clock duration of all queries in ms. */
10
+ totalMs: number;
11
+ /** Individual query entries — populated only when logQueries is true. */
12
+ entries: QueryLogEntry[];
13
+ /** Warning threshold — exceeded → N+1 warning. */
14
+ threshold: number;
15
+ /** Whether individual query entries should be captured (for logQueries). */
16
+ logQueries: boolean;
17
+ }
18
+ export interface PendingEvent {
19
+ name: string;
20
+ payload: unknown;
21
+ }
22
+ export interface TransactionResult<T> {
23
+ result: T;
24
+ events: PendingEvent[];
25
+ }
26
+ export interface EventBus {
27
+ _emit(event: string, payload: unknown, ctx: unknown): void;
28
+ on(event: string, handler: (payload: unknown, ctx: unknown) => Promise<void> | void): this;
29
+ flush(events: PendingEvent[], ctx: unknown): Promise<void>;
30
+ }
31
+ export declare class VelnDB {
32
+ private readonly adapter;
33
+ private readonly hooks;
34
+ constructor(adapter: VelnAdapter, hooks: HookExecutor);
35
+ /** Return a new BoundVelnDB scoped to the given context. Never mutates this. */
36
+ withCtx(ctx: unknown, queue?: RequestEventQueue, queryLog?: QueryLog): BoundVelnDB;
37
+ }
38
+ export declare class BoundVelnDB {
39
+ private readonly hooks;
40
+ private readonly ctx;
41
+ private readonly queue?;
42
+ /** Per-request query counter — incremented for every query() and execute() call on this instance. */
43
+ _queryCount: number;
44
+ private readonly adapter;
45
+ constructor(adapter: VelnAdapter, hooks: HookExecutor, ctx: unknown, queue?: RequestEventQueue, queryLog?: QueryLog);
46
+ from<T, S extends SchemaMap>(table: TableDef<T, S>): SelectBuilder<T, S>;
47
+ /**
48
+ * Start a JOIN query from the given table name.
49
+ * Returns a JoinBuilder — call .join()/.leftJoin() etc. to add clauses,
50
+ * then .select() to execute and get Record<string, unknown>[] results.
51
+ *
52
+ * @example
53
+ * const rows = await db.join('orders')
54
+ * .columns(['orders.id', 'users.name'])
55
+ * .join('users', 'orders.user_id = users.id')
56
+ * .where('orders.status = ?', ['pending'])
57
+ * .select()
58
+ */
59
+ join(tableName: string): JoinBuilder;
60
+ into<T, S extends SchemaMap>(table: TableDef<T, S>): InsertBuilder<T, S>;
61
+ /**
62
+ * DataLoader-pattern relation fetch — single IN-query, no N+1.
63
+ * Returns a Map keyed by the foreign-key value; each entry is an array of
64
+ * matching child rows (for one-to-many relations).
65
+ *
66
+ * @example
67
+ * const posts = await db.from(postsTable).select()
68
+ * const authorMap = await db.loadRelation(posts, 'authorId', usersTable, 'id')
69
+ * // → SELECT * FROM "users" WHERE "id" IN (1, 2, 3)
70
+ * const withAuthors = posts.map(p => ({ ...p, author: authorMap.get(p.authorId)?.[0] ?? null }))
71
+ */
72
+ loadRelation<TParent extends Record<string, unknown>, TChild, TFk extends keyof TParent & string, TPk extends keyof TChild & string>(parents: TParent[], foreignKey: TFk, childTable: TableDef<TChild>, primaryKey: TPk): Promise<Map<TParent[TFk], TChild[]>>;
73
+ /**
74
+ * Convenience variant of loadRelation for belongs-to (many-to-one) relations.
75
+ * Returns Map<fkValue, TChild> — single child per key instead of an array.
76
+ *
77
+ * @example
78
+ * const authorMap = await db.loadRelationOne(posts, 'authorId', usersTable, 'id')
79
+ * const author = authorMap.get(post.authorId) ?? null
80
+ */
81
+ loadRelationOne<TParent extends Record<string, unknown>, TChild, TFk extends keyof TParent & string, TPk extends keyof TChild & string>(parents: TParent[], foreignKey: TFk, childTable: TableDef<TChild>, primaryKey: TPk): Promise<Map<TParent[TFk], TChild>>;
82
+ transaction<T>(fn: (db: BoundVelnDB) => Promise<T>): Promise<TransactionResult<T>>;
83
+ /**
84
+ * Execute raw SQL and return typed rows.
85
+ *
86
+ * Without a schema the return type is `Record<string, unknown>[]`.
87
+ * With a schema (e.g. a Zod object) every row is validated at runtime
88
+ * and the return type is inferred from the schema.
89
+ *
90
+ * @example
91
+ * // Untyped
92
+ * const rows = await ctx.db.raw('SELECT * FROM orders WHERE amount > ?', [100])
93
+ *
94
+ * // Typed + validated
95
+ * const schema = z.object({ id: z.number(), amount: z.number() })
96
+ * const rows = await ctx.db.raw('SELECT id, amount FROM orders WHERE amount > ?', [100], schema)
97
+ */
98
+ raw<T = Record<string, unknown>>(sql: string, params?: BindingValue[], schema?: {
99
+ parse: (row: unknown) => T;
100
+ }): Promise<T[]>;
101
+ }
102
+ export declare class SelectBuilder<T, S extends SchemaMap> {
103
+ private readonly adapter;
104
+ private readonly hooks;
105
+ private readonly ctx;
106
+ private readonly queue;
107
+ private readonly table;
108
+ private readonly conditions;
109
+ private readonly _options;
110
+ private readonly _rawWhere;
111
+ private readonly _dialect;
112
+ constructor(adapter: VelnAdapter, hooks: HookExecutor, ctx: unknown, queue: RequestEventQueue | undefined, table: TableDef<T, S>, conditions: WhereInput<T>, _options?: SelectOptions, _rawWhere?: {
113
+ sql: string;
114
+ params: BindingValue[];
115
+ }[], _dialect?: SqlDialect);
116
+ private _cloneWith;
117
+ private _clone;
118
+ /**
119
+ * Add WHERE conditions. Accepts:
120
+ * - Plain equality map: `.where({ role: 'admin' })`
121
+ * - Operator condition: `.where({ age: { op: '>=', value: 18 } })`
122
+ * - OR group: `.where({ OR: [{ role: 'admin' }, { role: 'mod' }] })`
123
+ * - AND group: `.where({ AND: [...] })`
124
+ *
125
+ * Multiple `.where()` calls are combined with AND.
126
+ */
127
+ where(conditions: WhereInput<T>): SelectBuilder<T, S>;
128
+ /**
129
+ * Append a raw SQL WHERE fragment, combined with AND.
130
+ * Use for conditions the builder cannot express.
131
+ *
132
+ * @example
133
+ * .whereRaw('"score" > "threshold"', [])
134
+ * .whereRaw('"created_at" > ?', ['2024-01-01'])
135
+ */
136
+ whereRaw(sql: string, params: BindingValue[]): SelectBuilder<T, S>;
137
+ /** Limit the number of rows returned. Bound as a parameter — never interpolated. */
138
+ limit(n: number): SelectBuilder<T, S>;
139
+ /** Skip the first n rows. Bound as a parameter — never interpolated. */
140
+ offset(n: number): SelectBuilder<T, S>;
141
+ /** Add an ORDER BY clause. Multiple calls accumulate in order. */
142
+ orderBy(col: keyof T & string, dir?: 'ASC' | 'DESC'): SelectBuilder<T, S>;
143
+ /**
144
+ * Convenience helper for cursor-based pagination.
145
+ * page(1, 10) → LIMIT 10 OFFSET 0
146
+ * page(2, 10) → LIMIT 10 OFFSET 10
147
+ */
148
+ page(page: number, size: number): SelectBuilder<T, S>;
149
+ /**
150
+ * Restrict which columns are returned.
151
+ * SELECT "id", "name" FROM "table" — instead of SELECT *
152
+ *
153
+ * Return type is narrowed to Pick<T, K> for full type safety.
154
+ */
155
+ columns<K extends keyof T & string>(...cols: K[]): SelectBuilder<Pick<T, K>, S>;
156
+ /**
157
+ * Add a GROUP BY clause. Multiple columns are comma-separated.
158
+ * Combine with .aggregate() to get grouped aggregate results.
159
+ */
160
+ groupBy(...cols: (keyof T & string)[]): SelectBuilder<T, S>;
161
+ /**
162
+ * Add a HAVING clause — filters aggregate groups.
163
+ * Uses the same WhereInput system as .where() (supports operators, OR/AND).
164
+ *
165
+ * @example
166
+ * .groupBy('role').aggregate({ cnt: { fn: 'COUNT' } }).having({ cnt: { op: '>', value: 1 } })
167
+ */
168
+ having(conditions: WhereInput<Record<string, unknown>>): SelectBuilder<T, S>;
169
+ /**
170
+ * Execute a GROUP BY + aggregate query.
171
+ * Returns typed rows with group-by columns + aggregate aliases.
172
+ *
173
+ * @example
174
+ * const rows = await db.from(orders)
175
+ * .groupBy('status')
176
+ * .aggregate({ total: { fn: 'SUM', col: 'amount' }, cnt: { fn: 'COUNT' } })
177
+ * // rows: { status: string; total: number; cnt: number }[]
178
+ */
179
+ aggregate<TAgg extends Record<string, number | string | null>>(aggregates: {
180
+ [K in keyof TAgg]: {
181
+ fn: 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX';
182
+ col?: keyof T & string;
183
+ };
184
+ }): Promise<(Partial<T> & TAgg)[]>;
185
+ /** COUNT(*) or COUNT("col") — returns the count as a number. */
186
+ count(col?: keyof T & string): Promise<number>;
187
+ /** SUM("col") — returns the sum as a number (0 if no rows). */
188
+ sum(col: keyof T & string): Promise<number>;
189
+ /** AVG("col") — returns the average as a number (0 if no rows). */
190
+ avg(col: keyof T & string): Promise<number>;
191
+ /** MIN("col") — returns the minimum value. */
192
+ min(col: keyof T & string): Promise<number | string | null>;
193
+ /** MAX("col") — returns the maximum value. */
194
+ max(col: keyof T & string): Promise<number | string | null>;
195
+ private _scalarAggregate;
196
+ private _scalarAggregateRaw;
197
+ select(): Promise<T[]>;
198
+ first(): Promise<T | null>;
199
+ update(patch: Partial<T>): Promise<T>;
200
+ delete(): Promise<T>;
201
+ }
202
+ export declare class InsertBuilder<T, S extends SchemaMap> {
203
+ private readonly adapter;
204
+ private readonly hooks;
205
+ private readonly ctx;
206
+ private readonly queue;
207
+ private readonly table;
208
+ constructor(adapter: VelnAdapter, hooks: HookExecutor, ctx: unknown, queue: RequestEventQueue | undefined, table: TableDef<T, S>);
209
+ insert(data: InferInsert<S>): Promise<T>;
210
+ /** Serialize values for SQLite storage. Date → ISO string. */
211
+ private _serializeForInsert;
212
+ }
213
+ export declare class JoinBuilder {
214
+ private readonly adapter;
215
+ private readonly tableName;
216
+ private readonly _columns;
217
+ private readonly _joins;
218
+ private readonly _where;
219
+ private readonly _params;
220
+ private readonly _options;
221
+ constructor(adapter: VelnAdapter, tableName: string, _columns: string[], _joins: JoinClause[], _where: string, _params: BindingValue[], _options?: SelectOptions);
222
+ private _cloneOpts;
223
+ /** Restrict the selected columns (e.g. ['orders.id', 'users.name']). */
224
+ columns(cols: string[]): JoinBuilder;
225
+ /** Add an INNER JOIN clause. */
226
+ join(table: string, on: string): JoinBuilder;
227
+ /** Add a LEFT JOIN clause. */
228
+ leftJoin(table: string, on: string): JoinBuilder;
229
+ /** Add a RIGHT JOIN clause. */
230
+ rightJoin(table: string, on: string): JoinBuilder;
231
+ /** Add a FULL JOIN clause. */
232
+ fullJoin(table: string, on: string): JoinBuilder;
233
+ /**
234
+ * Set a typed WHERE clause from a conditions object.
235
+ * Each key becomes "key" = ? — values are bound safely.
236
+ *
237
+ * @example
238
+ * .where({ status: 'pending', userId })
239
+ */
240
+ where(conditions: Record<string, BindingValue>): JoinBuilder;
241
+ /**
242
+ * Set a raw WHERE clause.
243
+ * Use ? as placeholder; pass bind values as the second argument.
244
+ *
245
+ * @example
246
+ * .where('orders.status = ? AND orders.user_id = ?', ['pending', userId])
247
+ */
248
+ where(sql: string, params: BindingValue[]): JoinBuilder;
249
+ /** Limit the number of rows returned. Bound as a parameter — never interpolated. */
250
+ limit(n: number): JoinBuilder;
251
+ /** Skip the first n rows. Bound as a parameter — never interpolated. */
252
+ offset(n: number): JoinBuilder;
253
+ /**
254
+ * Add an ORDER BY clause. Multiple calls accumulate in order.
255
+ * @param col Column reference, e.g. 'orders.created_at' or 'name'.
256
+ */
257
+ orderBy(col: string, dir?: 'ASC' | 'DESC'): JoinBuilder;
258
+ /**
259
+ * Convenience helper for cursor-based pagination.
260
+ * page(1, 10) → LIMIT 10 OFFSET 0
261
+ * page(2, 10) → LIMIT 10 OFFSET 10
262
+ */
263
+ page(page: number, size: number): JoinBuilder;
264
+ /**
265
+ * Execute the query and return raw rows (no deserialization).
266
+ *
267
+ * @remarks
268
+ * Type parameter T is a manual cast — not validated at runtime.
269
+ * For runtime validation, use db.raw() with a Zod schema instead.
270
+ */
271
+ select<T = Record<string, unknown>>(): Promise<T[]>;
272
+ /**
273
+ * Execute the query and return the first row, or null.
274
+ *
275
+ * @remarks
276
+ * Type parameter T is a manual cast — not validated at runtime.
277
+ */
278
+ first<T = Record<string, unknown>>(): Promise<T | null>;
279
+ private _addJoin;
280
+ }
281
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TableDef as TableDefSchema } from '../../schema/table';
2
+ import type { SchemaMap } from '../../schema/table';
3
+ import type { SchemaDiff, TableDiff } from './types';
4
+ export declare function compareSchemas(current: Map<string, TableDiff>, target: TableDefSchema<unknown, SchemaMap>[]): SchemaDiff;
5
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EAKV,MAAM,SAAS,CAAA;AAyChB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,MAAM,EAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,GAC5C,UAAU,CAyEZ"}
@@ -0,0 +1,26 @@
1
+ import type { VelnAdapter } from '../../adapter/types';
2
+ import type { TableDef } from '../../schema/table';
3
+ import type { SchemaMap } from '../../schema/table';
4
+ export interface GenerateOptions {
5
+ tables: TableDef<unknown, SchemaMap>[];
6
+ adapter: VelnAdapter;
7
+ migrationsDir: string;
8
+ name?: string;
9
+ /**
10
+ * When true, generates executable SQL for column drops and type changes
11
+ * instead of commented-out warnings.
12
+ *
13
+ * @remarks
14
+ * ⚠️ DESTRUCTIVE: Generates SQL that permanently drops columns or changes types.
15
+ * Always review generated migrations before applying in production.
16
+ * Back up your database before running destructive migrations.
17
+ */
18
+ allowDestructive?: boolean;
19
+ }
20
+ export interface GenerateResult {
21
+ filename: string;
22
+ sql: string;
23
+ isEmpty: boolean;
24
+ }
25
+ export declare function generateMigration(options: GenerateOptions): Promise<GenerateResult>;
26
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAKnD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAS,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAA;IAC7C,OAAO,EAAQ,WAAW,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAU,MAAM,CAAA;IACrB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAO,MAAM,CAAA;IAChB,OAAO,EAAG,OAAO,CAAA;CAClB;AA0GD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBzF"}
@@ -0,0 +1,9 @@
1
+ export { createMigrator } from './migrator';
2
+ export type { Migrator } from './migrator';
3
+ export { generateMigration } from './generator';
4
+ export type { GenerateOptions, GenerateResult } from './generator';
5
+ export { compareSchemas } from './diff';
6
+ export { introspectSchema } from './introspect';
7
+ export { splitSqlStatements } from './runner';
8
+ export type { MigrationRecord, MigrationStatus, MigratorOptions, MigrationResult, SchemaDiff, TableDiff, TableModification, ColumnDef, IndexDef, ColumnModification, } from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAe,YAAY,CAAA;AACpD,YAAY,EAAE,QAAQ,EAAE,MAAgB,YAAY,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAY,aAAa,CAAA;AACrD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAe,QAAQ,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAa,cAAc,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAW,UAAU,CAAA;AAClD,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,kBAAkB,GACnB,MAAM,SAAS,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { VelnAdapter } from '../../adapter/types';
2
+ import type { TableDiff } from './types';
3
+ /**
4
+ * Detect adapter type and introspect the current DB schema.
5
+ * Returns a map of table name → TableDiff.
6
+ */
7
+ export declare function introspectSchema(adapter: VelnAdapter): Promise<Map<string, TableDiff>>;
8
+ //# sourceMappingURL=introspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/introspect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAuB,MAAM,SAAS,CAAA;AAiR7D;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAiB5F"}
@@ -0,0 +1,10 @@
1
+ import type { VelnAdapter } from '../../adapter/types';
2
+ import type { AdapterConfig } from '../../adapter/resolve';
3
+ import type { MigrationResult, MigrationStatus, MigratorOptions } from './types';
4
+ export interface Migrator {
5
+ run(): Promise<MigrationResult[]>;
6
+ status(): Promise<MigrationStatus[]>;
7
+ rollback(): Promise<void>;
8
+ }
9
+ export declare function createMigrator(adapterOrConfig: AdapterConfig | VelnAdapter, options: MigratorOptions): Migrator;
10
+ //# sourceMappingURL=migrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/migrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAGhF,MAAM,WAAW,QAAQ;IACvB,GAAG,IAAS,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IACtC,MAAM,IAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IACtC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED,wBAAgB,cAAc,CAAC,eAAe,EAAE,aAAa,GAAG,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,QAAQ,CAO/G"}
@@ -0,0 +1,7 @@
1
+ import type { VelnAdapter } from '../../adapter/types';
2
+ import type { MigrationResult, MigrationStatus, MigratorOptions } from './types';
3
+ export declare function splitSqlStatements(sql: string): string[];
4
+ export declare function run(adapter: VelnAdapter, opts: MigratorOptions): Promise<MigrationResult[]>;
5
+ export declare function status(adapter: VelnAdapter, opts: MigratorOptions): Promise<MigrationStatus[]>;
6
+ export declare function rollback(adapter: VelnAdapter, opts: MigratorOptions): Promise<void>;
7
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AA4BhF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA6ExD;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgCjG;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgBpG;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzF"}
@@ -0,0 +1,7 @@
1
+ import type { VelnAdapter } from '../../adapter/types';
2
+ import type { MigrationRecord } from './types';
3
+ export declare function ensureTable(adapter: VelnAdapter, tableName: string): Promise<void>;
4
+ export declare function getApplied(adapter: VelnAdapter, tableName: string): Promise<MigrationRecord[]>;
5
+ export declare function markApplied(adapter: VelnAdapter, tableName: string, name: string): Promise<void>;
6
+ export declare function markRolledBack(adapter: VelnAdapter, tableName: string, name: string): Promise<void>;
7
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAU9C,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CASpG;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtG;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzG"}
@@ -0,0 +1,70 @@
1
+ export interface MigrationRecord {
2
+ id: number;
3
+ name: string;
4
+ appliedAt: Date;
5
+ }
6
+ export interface MigrationStatus {
7
+ name: string;
8
+ status: 'applied' | 'pending';
9
+ appliedAt?: Date;
10
+ }
11
+ export interface MigratorOptions {
12
+ migrationsDir: string;
13
+ tableName?: string;
14
+ onBeforeMigrate?: (migration: {
15
+ name: string;
16
+ sql: string;
17
+ }) => void | Promise<void>;
18
+ onAfterMigrate?: (migration: {
19
+ name: string;
20
+ sql: string;
21
+ durationMs: number;
22
+ }) => void | Promise<void>;
23
+ onError?: (migration: {
24
+ name: string;
25
+ error: Error;
26
+ }) => void | Promise<void>;
27
+ }
28
+ export interface MigrationResult {
29
+ name: string;
30
+ success: boolean;
31
+ duration: number;
32
+ error?: Error;
33
+ }
34
+ export interface SchemaDiff {
35
+ addedTables: TableDiff[];
36
+ droppedTables: string[];
37
+ modifiedTables: TableModification[];
38
+ }
39
+ export interface TableDiff {
40
+ name: string;
41
+ columns: ColumnDef[];
42
+ indexes: IndexDef[];
43
+ }
44
+ export interface TableModification {
45
+ name: string;
46
+ addedColumns: ColumnDef[];
47
+ droppedColumns: string[];
48
+ modifiedColumns: ColumnModification[];
49
+ addedIndexes: IndexDef[];
50
+ droppedIndexes: string[];
51
+ }
52
+ export interface ColumnDef {
53
+ name: string;
54
+ type: string;
55
+ nullable: boolean;
56
+ default?: string;
57
+ primaryKey: boolean;
58
+ unique: boolean;
59
+ }
60
+ export interface IndexDef {
61
+ name: string;
62
+ columns: string[];
63
+ unique: boolean;
64
+ }
65
+ export interface ColumnModification {
66
+ name: string;
67
+ before: ColumnDef;
68
+ after: ColumnDef;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAS,MAAM,CAAA;IACjB,IAAI,EAAO,MAAM,CAAA;IACjB,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAO,MAAM,CAAA;IACjB,MAAM,EAAK,SAAS,GAAG,SAAS,CAAA;IAChC,SAAS,CAAC,EAAE,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAK,MAAM,CAAA;IACxB,SAAS,CAAC,EAAQ,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpF,cAAc,CAAC,EAAG,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxG,OAAO,CAAC,EAAU,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtF;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAM,MAAM,CAAA;IAChB,OAAO,EAAG,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAI,KAAK,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAK,SAAS,EAAE,CAAA;IAC3B,aAAa,EAAG,MAAM,EAAE,CAAA;IACxB,cAAc,EAAE,iBAAiB,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAK,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAa,MAAM,CAAA;IACvB,YAAY,EAAK,SAAS,EAAE,CAAA;IAC5B,cAAc,EAAG,MAAM,EAAE,CAAA;IACzB,eAAe,EAAE,kBAAkB,EAAE,CAAA;IACrC,YAAY,EAAK,QAAQ,EAAE,CAAA;IAC3B,cAAc,EAAG,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAQ,MAAM,CAAA;IAClB,IAAI,EAAQ,MAAM,CAAA;IAClB,QAAQ,EAAI,OAAO,CAAA;IACnB,OAAO,CAAC,EAAI,MAAM,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAM,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAK,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAG,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAI,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,CAAA;IACjB,KAAK,EAAG,SAAS,CAAA;CAClB"}
@@ -0,0 +1,148 @@
1
+ import type { BindingValue } from '../adapter/types';
2
+ import type { TableDef, SchemaMap } from '../schema/table';
3
+ export interface JoinClause {
4
+ type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';
5
+ table: string;
6
+ on: string;
7
+ }
8
+ export declare function validateAndQuoteOnClause(on: string): string;
9
+ /** SQL dialect — used for ILIKE fallback on non-Postgres adapters. */
10
+ export type SqlDialect = 'sqlite' | 'postgres' | 'mysql';
11
+ /** Explicit operator condition for a single column. */
12
+ export type WhereOp<T> = {
13
+ op: '=';
14
+ value: T;
15
+ } | {
16
+ op: '!=';
17
+ value: T;
18
+ } | {
19
+ op: '>';
20
+ value: T;
21
+ } | {
22
+ op: '>=';
23
+ value: T;
24
+ } | {
25
+ op: '<';
26
+ value: T;
27
+ } | {
28
+ op: '<=';
29
+ value: T;
30
+ } | {
31
+ op: 'IN';
32
+ value: T[];
33
+ } | {
34
+ op: 'NOT IN';
35
+ value: T[];
36
+ } | {
37
+ op: 'LIKE';
38
+ value: string;
39
+ } | {
40
+ op: 'ILIKE';
41
+ value: string;
42
+ } | {
43
+ op: 'IS NULL';
44
+ } | {
45
+ op: 'IS NOT NULL';
46
+ };
47
+ /** Per-field condition — shorthand (plain value = equality) or explicit operator. */
48
+ export type FieldCondition<T> = T | WhereOp<T>;
49
+ /** Map of column conditions — each field is optional. */
50
+ export type WhereConditions<TRow> = {
51
+ [K in keyof TRow]?: FieldCondition<TRow[K]>;
52
+ };
53
+ /**
54
+ * Full WHERE input — either a flat conditions map, OR-group, or AND-group.
55
+ * OR/AND values are recursively WhereInput allowing nesting.
56
+ */
57
+ export type WhereInput<TRow> = WhereConditions<TRow> | {
58
+ OR: WhereInput<TRow>[];
59
+ } | {
60
+ AND: WhereInput<TRow>[];
61
+ };
62
+ /**
63
+ * Build a WHERE clause from a WhereInput.
64
+ *
65
+ * Supports:
66
+ * - Shorthand equality: { name: 'Alice' } → "name" = ?
67
+ * - Explicit operator: { age: { op: '>=', value: 18 } }
68
+ * - IN / NOT IN: { id: { op: 'IN', value: [1,2,3] } }
69
+ * - IS NULL / IS NOT NULL
70
+ * - LIKE / ILIKE (ILIKE falls back to LOWER() on SQLite/MySQL)
71
+ * - OR groups: { OR: [{ role: 'admin' }, { role: 'mod' }] }
72
+ * - AND groups: { AND: [...] }
73
+ * - Nested OR/AND
74
+ *
75
+ * Returns { sql: '', params: [] } for empty / all-undefined conditions.
76
+ */
77
+ export declare function buildWhere(conditions: WhereInput<Record<string, unknown>>, dialect?: SqlDialect): {
78
+ sql: string;
79
+ params: BindingValue[];
80
+ };
81
+ /**
82
+ * Build an INSERT statement.
83
+ * INSERT INTO "table" ("col1", "col2") VALUES (?, ?) RETURNING *
84
+ *
85
+ * RETURNING * (SQLite ≥ 3.35, PostgreSQL) returns the inserted row, avoiding
86
+ * a second SELECT round-trip. Pass returning: false for databases that do not
87
+ * support RETURNING (MySQL).
88
+ */
89
+ export declare function buildInsert(tableName: string, data: Record<string, unknown>, returning?: boolean): {
90
+ sql: string;
91
+ params: BindingValue[];
92
+ };
93
+ /**
94
+ * Build an UPDATE statement.
95
+ * UPDATE "table" SET "col1" = ?, "col2" = ? WHERE "pk" = ?
96
+ * The pk param is always last in params.
97
+ */
98
+ export declare function buildUpdate(tableName: string, patch: Record<string, unknown>, pk: string, pkValue: BindingValue): {
99
+ sql: string;
100
+ params: BindingValue[];
101
+ };
102
+ /**
103
+ * Build a DELETE statement.
104
+ * DELETE FROM "table" WHERE "pk" = ?
105
+ */
106
+ export declare function buildDelete(tableName: string, pk: string, pkValue: BindingValue): {
107
+ sql: string;
108
+ params: BindingValue[];
109
+ };
110
+ /**
111
+ * Deserialize a raw DB row into the typed T shape.
112
+ * Consolidated here to avoid duplication between SelectBuilder and InsertBuilder.
113
+ * Handles TIMESTAMP columns: SQLite stores them as ISO strings, we convert back to Date.
114
+ */
115
+ export declare function deserializeRow<T, S extends SchemaMap>(table: TableDef<T, S>, row: Record<string, unknown>): T;
116
+ /** A single aggregate expression: FN("col") AS alias. */
117
+ export interface AggregateClause {
118
+ alias: string;
119
+ fn: 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX';
120
+ col?: string;
121
+ }
122
+ export interface SelectOptions {
123
+ limit?: number;
124
+ offset?: number;
125
+ orderBy?: {
126
+ col: string;
127
+ dir: 'ASC' | 'DESC';
128
+ }[];
129
+ columns?: string[];
130
+ groupBy?: string[];
131
+ aggregates?: AggregateClause[];
132
+ having?: WhereInput<Record<string, unknown>>;
133
+ }
134
+ /** Build the SELECT column list from options. Exported for use in SelectBuilder's raw-where path. */
135
+ export declare function buildSelectListFromOptions(options?: SelectOptions): string;
136
+ /**
137
+ * Build a SELECT statement.
138
+ * SELECT [cols] FROM "table" [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...] [LIMIT n] [OFFSET n]
139
+ */
140
+ export declare function buildSelect(tableName: string, conditions: WhereInput<Record<string, unknown>>, options?: SelectOptions, dialect?: SqlDialect): {
141
+ sql: string;
142
+ params: BindingValue[];
143
+ };
144
+ export declare function buildJoinSelect(tableName: string, columns: string[], joins: JoinClause[], where: string, params: BindingValue[], options?: SelectOptions): {
145
+ sql: string;
146
+ params: BindingValue[];
147
+ };
148
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/db/sql.ts"],"names":[],"mappings":"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"}